Joplin Server: Self-Host Your Note Sync Backend
Joplin is a note-taking application with a long track record and a clear philosophy: your notes belong to you, stored in open formats you can read without the app. Markdown files. Attachments as actual files. A SQLite database for indexing. Nothing proprietary.
Photo by Krišjānis Kazaks on Unsplash
By default, Joplin syncs via third-party services: Dropbox, OneDrive, Nextcloud, or Joplin Cloud (the paid hosted option). Self-hosting Joplin Server gives you the same sync capabilities on your own infrastructure, without data leaving your network.
Why Joplin for Note-Taking
Before getting into server setup, it's worth being clear about what Joplin is and isn't:
Joplin is good at:
- Markdown note-taking with rendered preview
- Code blocks with syntax highlighting
- Organizing notes into notebooks with tags
- End-to-end encryption
- Attachments and file management
- Cross-platform: Linux, macOS, Windows, iOS, Android
- Web clipper browser extension
- Plugin ecosystem for extended functionality
Joplin is not:
- A collaborative wiki (notes are personal, not multi-user by default)
- A Notion-style database/kanban tool
- A rich text editor (it's Markdown-first)
For a single user or small household wanting Evernote/Bear/Obsidian functionality without vendor lock-in, Joplin is excellent.
Joplin Server vs. Other Sync Options
Joplin supports several sync backends:
| Backend | Privacy | Cost | Setup |
|---|---|---|---|
| Joplin Cloud | Notes in Joplin's cloud | $3-7/mo | Zero |
| Nextcloud | Self-hosted | Free (self-hosted) | Nextcloud required |
| Dropbox/OneDrive | Notes in their cloud | Free tier | Account required |
| WebDAV | Varies | Varies | Server required |
| Joplin Server | Fully self-hosted | Free | Docker |
| S3-compatible | Varies | Varies | S3 bucket required |
Joplin Server is the official self-hosted sync backend with the most features: multi-user support, note sharing, and eventual collaboration features under development.
Docker Deployment
Joplin Server requires PostgreSQL:
services:
joplin-db:
image: postgres:16-alpine
container_name: joplin-db
restart: unless-stopped
environment:
POSTGRES_DB: joplin
POSTGRES_USER: joplin
POSTGRES_PASSWORD: change-this-password
volumes:
- joplin-db:/var/lib/postgresql/data
joplin-server:
image: joplin/server:latest
container_name: joplin-server
restart: unless-stopped
depends_on:
- joplin-db
ports:
- "22300:22300"
environment:
APP_PORT: 22300
APP_BASE_URL: https://joplin.yourdomain.com
DB_CLIENT: pg
POSTGRES_HOST: joplin-db
POSTGRES_PORT: 5432
POSTGRES_DATABASE: joplin
POSTGRES_USER: joplin
POSTGRES_PASSWORD: change-this-password
MAILER_ENABLED: 0
volumes:
joplin-db:
APP_BASE_URL is critical: Set this to the URL where Joplin Server will be publicly accessible. Internal-only URLs work if all clients are on your network; use your external domain for mobile sync outside your home.
Start with docker compose up -d and access http://your-host:22300. The default admin credentials are admin@localhost / admin — change these immediately after first login.
Like what you're reading? Subscribe to Self-Hosted Weekly — free weekly guides in your inbox.
Initial Setup
After starting:
- Navigate to
http://your-server:22300 - Log in with
admin@localhost/admin - Go to Admin → Users → Change admin password and email
- Create user accounts for each person who will use the sync
Each user gets their own separate note space. Notes aren't shared between users by default (sharing is explicit).
Connecting Joplin Clients
Desktop app (Linux/macOS/Windows):
- Open Joplin → Tools → Options → Synchronisation
- Synchronisation target: "Joplin Server"
- Joplin Server URL: your server URL
- Email: your account email
- Password: your account password
- Click "Check synchronisation configuration" to verify
Mobile (iOS/Android):
- Settings → Synchronisation
- Sync target: Joplin Server
- Enter server URL, email, password
- Tap "Check synchronisation configuration"
After connecting, click "Synchronise" to perform the first sync. Notes, notebooks, tags, and attachments sync bidirectionally.
End-to-End Encryption
Joplin supports E2E encryption even with Joplin Server. Enable it in Joplin Desktop under Tools → Options → Encryption. Generate a master key and set a password — the server never sees your plaintext notes.
With E2E encryption:
- Notes are encrypted before leaving your device
- The server stores encrypted ciphertext only
- Even if someone gets access to your server's database, notes are unreadable
- You must enable encryption on each client and enter the master key
This makes self-hosted Joplin more private than many SaaS note-taking options, even if your server is compromised.
Sharing Notes
Joplin Server supports sharing individual notes via public links:
- Right-click a note in Joplin Desktop
- "Share note" → Toggle sharing on
- Copy the share link
Anyone with the link can view the note in a browser — useful for sharing a recipe, document, or reference page with someone who doesn't have Joplin. The shared view is read-only.
Nginx Proxy Configuration
For HTTPS access (required for mobile clients outside your network):
server {
server_name joplin.yourdomain.com;
location / {
proxy_pass http://localhost:22300;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
client_max_body_size 200M;
}
The client_max_body_size 200M matters for syncing large attachments (PDFs, images). The default Nginx limit of 1M is too small.
Storage Limits
By default, each user gets unlimited storage. Administrators can set per-user limits in the admin panel: Admin → Users → Edit user → Max total size.
Joplin Server stores attachments as files on disk (or in the database, depending on configuration). Monitor disk usage if you have many users or large attachments.
Joplin Server vs. Nextcloud for Joplin Sync
| Aspect | Joplin Server | Nextcloud WebDAV |
|---|---|---|
| Setup complexity | Simple (2 containers) | Complex (full Nextcloud stack) |
| Joplin features | Full | WebDAV sync only |
| Note sharing | Built-in | Not available |
| Multi-user | Yes | Yes (Nextcloud accounts) |
| Other files/apps | No | Yes |
| Resource usage | Low | High |
If you already run Nextcloud, use its WebDAV for Joplin sync — no additional setup needed. If you want the simplest Joplin-specific sync with sharing features, Joplin Server is cleaner.
Backup
Back up two things:
PostgreSQL database: Contains note metadata, sharing state, and user accounts
docker exec joplin-db pg_dump -U joplin joplin > joplin-backup-$(date +%Y%m%d).sqlJoplin uploads directory: Contains attachment files (if stored externally)
Restore by importing the SQL dump and replacing the uploads directory.
Note: individual note content is also backed up inside Joplin's encrypted export if you use the Joplin export function.
The Joplin project is at laurent22/joplin with active development. The server component is at joplin/server — same repository, different package.
