A privacy-focused, lightweight, self-hosted memo hub for capturing and organizing your thoughts. Built with security hardened for public deployment.
PUBLIC, PROTECTED, and PRIVATE notes with enforced access controllinux/amd64 and linux/arm64docker run -d \
--name memos \
-p 5230:5230 \
-v memos-data:/var/opt/memos \
certyiknofetch/memos:latest
Access at http://localhost:5230. The first user to sign up becomes the admin.
No additional configuration needed. Data is stored in /var/opt/memos/.
services:
memos:
image: certyiknofetch/memos:latest
ports:
- "5230:5230"
volumes:
- memos-data:/var/opt/memos
volumes:
memos-data:
services:
memos:
image: certyiknofetch/memos:latest
environment:
- MEMOS_DRIVER=mysql
- MEMOS_DSN=memos:your_secure_password@tcp(mysql:3306)/memos?parseTime=true&tls=preferred
ports:
- "5230:5230"
volumes:
- memos-data:/var/opt/memos
depends_on:
mysql:
condition: service_healthy
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=root_secure_password
- MYSQL_USER=memos
- MYSQL_PASSWORD=your_secure_password
- MYSQL_DATABASE=memos
volumes:
- mysql-data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
volumes:
memos-data:
mysql-data:
services:
memos:
image: certyiknofetch/memos:latest
environment:
- MEMOS_DRIVER=postgres
- MEMOS_DSN=postgresql://memos:your_secure_password@postgres:5432/memos?sslmode=disable
ports:
- "5230:5230"
volumes:
- memos-data:/var/opt/memos
depends_on:
postgres:
condition: service_healthy
postgres:
image: postgres:16
environment:
- POSTGRES_USER=memos
- POSTGRES_PASSWORD=your_secure_password
- POSTGRES_DB=memos
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U memos"]
interval: 10s
timeout: 5s
retries: 5
volumes:
memos-data:
postgres-data:
| Variable | Default | Description |
|---|---|---|
MEMOS_DRIVER | sqlite | Database driver: sqlite, mysql, or postgres |
MEMOS_DSN | (auto) | Database connection string (auto-configured for SQLite) |
MEMOS_DSN_FILE | — | Path to a file containing the DSN (Docker Secrets support) |
MEMOS_PORT | 5230 | Server port |
MEMOS_ADDR | (all interfaces) | Bind address |
MEMOS_DATA | /var/opt/memos | Data directory for SQLite database and uploaded files |
MEMOS_INSTANCE_URL | — | Public URL of your instance (used for RSS feeds and links) |
MEMOS_UID | 10001 | UID for the non-root user |
MEMOS_GID | 10001 | GID for the non-root user |
TZ | UTC | Timezone |
For secure DSN handling, use MEMOS_DSN_FILE instead of MEMOS_DSN:
services:
memos:
image: certyiknofetch/memos:latest
environment:
- MEMOS_DRIVER=mysql
- MEMOS_DSN_FILE=/run/secrets/memos_dsn
secrets:
- memos_dsn
secrets:
memos_dsn:
file: ./memos_dsn.txt
When deploying behind a reverse proxy:
memos:5230X-Forwarded-Proto and X-Forwarded-Host headers securely| Path | Purpose |
|---|---|
/var/opt/memos | Application data — SQLite database (if used) and uploaded attachments |
Important: Back up this directory regularly, especially when using SQLite.
| Architecture | Tag |
|---|---|
linux/amd64 | latest, 1.1 |
linux/arm64 | latest, 1.1 |
docker pull certyiknofetch/memos:latest
docker stop memos
docker rm memos
docker run -d \
--name memos \
-p 5230:5230 \
-v memos-data:/var/opt/memos \
certyiknofetch/memos:latest
Database migrations are applied automatically on startup.
latest — Most recent stable build1.1 — Specific version tagBased on Memos with security hardening and enhancements.
Content type
Image
Digest
sha256:3fbf343e2…
Size
18.7 MB
Last updated
7 months ago
docker pull certyiknofetch/memos