Skip to main content
Docker is the recommended way to run Memos. It provides a consistent environment and makes installation simple.

Quick Start

Run Memos with a single command:
docker run -d \
  --name memos \
  -p 5230:5230 \
  -v ~/.memos:/var/opt/memos \
  neosmemo/memos:stable
Open http://localhost:5230 in your browser and start using Memos!

Image Tags

Memos provides multiple Docker image tags:
  • stable - Latest stable release (recommended for production)
  • 0.28 - Latest patch version of 0.28.x
  • 0.28.1 - Specific version
  • latest - Development build from main branch (not recommended for production)

Data Persistence

Memos stores all data in /var/opt/memos inside the container. Mount this directory to persist your data:
-v ~/.memos:/var/opt/memos
You can use any host path:
-v /path/to/your/data:/var/opt/memos

Environment Variables

1

Configure basic settings

Control Memos behavior using environment variables from cmd/memos/main.go:23-137:
docker run -d \
  --name memos \
  -p 5230:5230 \
  -v ~/.memos:/var/opt/memos \
  -e MEMOS_PORT=5230 \
  -e MEMOS_DRIVER=sqlite \
  neosmemo/memos:stable
2

Available variables

VariableDefaultDescription
MEMOS_PORT8081HTTP server port (container default: 5230)
MEMOS_ADDRBind address (empty = all interfaces)
MEMOS_DATA~/.memosData directory path
MEMOS_DRIVERsqliteDatabase driver: sqlite, mysql, postgres
MEMOS_DSNDatabase connection string
MEMOS_INSTANCE_URLPublic instance URL
MEMOS_DEMOfalseEnable demo mode

Using External Database

MySQL

docker run -d \
  --name memos \
  -p 5230:5230 \
  -v ~/.memos:/var/opt/memos \
  -e MEMOS_DRIVER=mysql \
  -e MEMOS_DSN="user:password@tcp(mysql-host:3306)/memos" \
  neosmemo/memos:stable

PostgreSQL

docker run -d \
  --name memos \
  -p 5230:5230 \
  -v ~/.memos:/var/opt/memos \
  -e MEMOS_DRIVER=postgres \
  -e MEMOS_DSN="postgres://user:password@postgres-host:5432/memos?sslmode=disable" \
  neosmemo/memos:stable
When using external databases, you may not need the data volume for database files, but it’s still used for attachments and other assets.

Security: Using Docker Secrets

For sensitive credentials, use Docker secrets instead of environment variables:
echo "postgres://user:password@host:5432/memos" | docker secret create memos_dsn -

docker run -d \
  --name memos \
  -p 5230:5230 \
  -v ~/.memos:/var/opt/memos \
  -e MEMOS_DRIVER=postgres \
  -e MEMOS_DSN_FILE=/run/secrets/memos_dsn \
  --secret memos_dsn \
  neosmemo/memos:stable
The entrypoint script (scripts/entrypoint.sh:17-41) supports *_FILE suffix for any environment variable.

Container User

Memos runs as a non-root user for security:
  • UID: 10001
  • GID: 10001
  • Username: nonroot
  • Home: /var/opt/memos
The entrypoint script automatically fixes ownership of mounted volumes (scripts/entrypoint.sh:3-15).

Custom UID/GID

Override the default user IDs:
docker run -d \
  --name memos \
  -p 5230:5230 \
  -v ~/.memos:/var/opt/memos \
  -e MEMOS_UID=1000 \
  -e MEMOS_GID=1000 \
  neosmemo/memos:stable

Container Management

View Logs

docker logs memos

# Follow logs
docker logs -f memos

Stop Container

docker stop memos

Start Container

docker start memos

Restart Container

docker restart memos

Remove Container

docker stop memos
docker rm memos
Removing the container does not delete your data if you mounted a volume. Your data remains in the host directory.

Updating Memos

1

Pull the latest image

docker pull neosmemo/memos:stable
2

Stop and remove the old container

docker stop memos
docker rm memos
3

Start a new container

docker run -d \
  --name memos \
  -p 5230:5230 \
  -v ~/.memos:/var/opt/memos \
  neosmemo/memos:stable
Your data is preserved because it’s stored in the mounted volume.

Platform Support

The Docker image supports multiple architectures (scripts/Dockerfile:1):
  • linux/amd64 - x86_64 processors
  • linux/arm64 - ARM 64-bit (Apple Silicon, Raspberry Pi 4+)
  • linux/arm/v7 - ARM 32-bit (Raspberry Pi 2/3)
Docker automatically selects the correct image for your platform.

Next Steps

Build docs developers (and LLMs) love