Joplin Server
Self-hosted note synchronization for Joplin using Docker Compose.
Joplin Server allows you to synchronize your notes between:
- Desktop devices
- Mobile devices
- Tablets
- Multiple users
while keeping full control of your data.
Official project:
What This Setup Includes
This guide deploys:
- Joplin Server
- PostgreSQL database
- Persistent storage for your notes and metadata
Everything runs with Docker Compose.
Create the project folder
mkdir -p ~/docker/joplin
cd ~/docker/joplin
Create the Docker Compose file
Create:
nano docker-compose.yml
Paste:
services:
db:
image: postgres:16-bookworm
container_name: joplin-db
volumes:
- ./data/postgres:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=joplin_secure_password
- POSTGRES_USER=joplin
- POSTGRES_DB=joplindb
restart: unless-stopped
app:
image: joplin/server:latest
container_name: joplin
depends_on:
- db
ports:
- "22300:22300"
environment:
- APP_PORT=22300
- APP_BASE_URL=http://YOUR_SERVER_IP:22300
- DB_CLIENT=pg
- POSTGRES_PASSWORD=joplin_secure_password
- POSTGRES_DATABASE=joplindb
- POSTGRES_USER=joplin
- POSTGRES_PORT=5432
- POSTGRES_HOST=db
restart: unless-stopped
Important Things to Change
Before starting the container, change:
YOUR_SERVER_IP
to your actual server IP address.
Example:
http://192.168.1.50:22300
You should also change:
joplin_secure_password
to a stronger database password.
Start Joplin Server
Run:
docker compose up -d
Access Joplin Server
Open:
http://YOUR_SERVER_IP:22300
First Login
Default credentials are usually:
Email: admin@localhost
Password: admin
Connect Joplin Clients
Inside the Joplin desktop or mobile app:
- Open Synchronization Settings
- Select:
Joplin Server - Enter your server URL and login credentials
Notes
- PostgreSQL is required for Joplin Server
- All database data is stored in:
./data/postgres - Reverse proxy + HTTPS is strongly recommended for internet access
- If using HTTPS, APP_BASE_URL must also use https://
Advanced Example (Reference Only)
This is my current Joplin setup.
It is NOT required for a standard installation.
services:
db:
image: postgres:16-bookworm
container_name: joplin-db
stop_grace_period: 90s
volumes:
- ./data/postgres:/var/lib/postgresql/data
ports:
- "5432:5432"
restart: unless-stopped
environment:
- POSTGRES_PASSWORD=database-password
- POSTGRES_USER=joplin
- POSTGRES_DB=joplindb
- TZ=America/Santo_Domingo
app:
image: joplin/server:latest
container_name: joplin
stop_grace_period: 90s
depends_on:
- db
ports:
- "22300:22300"
restart: unless-stopped
environment:
- APP_PORT=22300
- APP_BASE_URL=JOPLIN_APP_BASE_URL
- DB_CLIENT=pg
- POSTGRES_PASSWORD=database-password
- POSTGRES_DATABASE=joplindb
- POSTGRES_USER=joplin
- POSTGRES_PORT=5432
- POSTGRES_HOST=db
- TZ=America/Santo_Domingo