Joplin Server
Sync server for Joplin note-taking app.
Overview
Joplin Server is the official synchronization server for Joplin, an open-source note-taking and to-do application that supports markdown formatting, cross-platform sync, and end-to-end encryption. Originally developed as a desktop and mobile app, Joplin added server capabilities to enable users to host their own sync infrastructure rather than relying on cloud services like Dropbox or OneDrive. The server provides user management, note synchronization, sharing capabilities, and API access for multiple Joplin clients.
This deployment creates a complete Joplin sync infrastructure using two containers: the main Joplin server application and a dedicated PostgreSQL database. The Joplin service runs on port 22300 and connects to the PostgreSQL database for storing notes, metadata, user accounts, and synchronization state. The setup includes proper database connectivity configuration and persistent storage for the PostgreSQL data.
This configuration is ideal for individuals, families, or small teams who want complete control over their note synchronization without depending on third-party cloud services. It's particularly valuable for privacy-conscious users, organizations with data sovereignty requirements, or anyone wanting to extend Joplin's capabilities through the server's web interface and API access.
Key Features
- Multi-user note synchronization with individual user accounts and authentication
- Web-based administration interface for user management and server configuration
- RESTful API for programmatic access to notes and synchronization endpoints
- Note and notebook sharing between users on the same server instance
- Support for Joplin's end-to-end encryption when configured in client applications
- PostgreSQL backend for reliable data storage and ACID transaction compliance
- Cross-platform client support for desktop, mobile, and terminal Joplin applications
- Markdown note rendering and search capabilities through the web interface
Common Use Cases
- 1Self-hosted note synchronization for privacy-conscious individuals and families
- 2Small team knowledge management with shared notebooks and collaboration
- 3Corporate environments requiring on-premises data storage for compliance
- 4Educational institutions providing note-taking infrastructure for students
- 5Development teams maintaining technical documentation and project notes
- 6Home lab enthusiasts building personal cloud services ecosystem
- 7Organizations migrating from commercial note-taking services to self-hosted solutions
Prerequisites
- Docker and Docker Compose installed with container orchestration support
- Minimum 1GB RAM for PostgreSQL database and Joplin server operations
- Port 22300 available for Joplin server web interface and API access
- Environment variable DB_PASSWORD configured for database authentication
- Basic understanding of Joplin client configuration for server synchronization
- Web browser access for initial server setup and user management
For development & testing. Review security settings, change default credentials, and test thoroughly before production use. See Terms
docker-compose.yml
docker-compose.yml
1services: 2 joplin: 3 image: joplin/server:latest4 container_name: joplin5 restart: unless-stopped6 ports: 7 - "22300:22300"8 environment: 9 APP_BASE_URL: http://localhost:2230010 APP_PORT: 2230011 DB_CLIENT: pg12 POSTGRES_HOST: db13 POSTGRES_PORT: 543214 POSTGRES_DATABASE: joplin15 POSTGRES_USER: joplin16 POSTGRES_PASSWORD: ${DB_PASSWORD}17 depends_on: 18 - db1920 db: 21 image: postgres:15-alpine22 container_name: joplin-db23 restart: unless-stopped24 environment: 25 POSTGRES_USER: joplin26 POSTGRES_PASSWORD: ${DB_PASSWORD}27 POSTGRES_DB: joplin28 volumes: 29 - joplin_db:/var/lib/postgresql/data3031volumes: 32 joplin_db: .env Template
.env
1DB_PASSWORD=changemeUsage Notes
- 1Docs: https://joplinapp.org/help/apps/joplin_server/
- 2Access at http://localhost:22300 - default: admin@localhost / admin
- 3In Joplin app: Tools > Options > Sync > Joplin Server
- 4Enter server URL and generate API token from web UI
- 5Supports E2E encryption (configured in client)
- 6Share notes/notebooks with other users on same server
Individual Services(2 services)
Copy individual services to mix and match with your existing compose files.
joplin
joplin:
image: joplin/server:latest
container_name: joplin
restart: unless-stopped
ports:
- "22300:22300"
environment:
APP_BASE_URL: http://localhost:22300
APP_PORT: 22300
DB_CLIENT: pg
POSTGRES_HOST: db
POSTGRES_PORT: 5432
POSTGRES_DATABASE: joplin
POSTGRES_USER: joplin
POSTGRES_PASSWORD: ${DB_PASSWORD}
depends_on:
- db
db
db:
image: postgres:15-alpine
container_name: joplin-db
restart: unless-stopped
environment:
POSTGRES_USER: joplin
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: joplin
volumes:
- joplin_db:/var/lib/postgresql/data
Quick Start
terminal
1# 1. Create the compose file2cat > docker-compose.yml << 'EOF'3services:4 joplin:5 image: joplin/server:latest6 container_name: joplin7 restart: unless-stopped8 ports:9 - "22300:22300"10 environment:11 APP_BASE_URL: http://localhost:2230012 APP_PORT: 2230013 DB_CLIENT: pg14 POSTGRES_HOST: db15 POSTGRES_PORT: 543216 POSTGRES_DATABASE: joplin17 POSTGRES_USER: joplin18 POSTGRES_PASSWORD: ${DB_PASSWORD}19 depends_on:20 - db2122 db:23 image: postgres:15-alpine24 container_name: joplin-db25 restart: unless-stopped26 environment:27 POSTGRES_USER: joplin28 POSTGRES_PASSWORD: ${DB_PASSWORD}29 POSTGRES_DB: joplin30 volumes:31 - joplin_db:/var/lib/postgresql/data3233volumes:34 joplin_db:35EOF3637# 2. Create the .env file38cat > .env << 'EOF'39DB_PASSWORD=changeme40EOF4142# 3. Start the services43docker compose up -d4445# 4. View logs46docker compose logs -fOne-Liner
Run this command to download and set up the recipe in one step:
terminal
1curl -fsSL https://docker.recipes/api/recipes/joplin-server/run | bashTroubleshooting
- Connection refused on port 22300: Verify the joplin container started successfully and check Docker port mapping configuration
- Database connection failed: Ensure DB_PASSWORD environment variable matches between joplin and db services, and verify PostgreSQL container is running
- Joplin clients fail to sync: Check APP_BASE_URL matches the actual server address accessible to clients, and verify API tokens are generated correctly
- Admin login fails with default credentials: Reset admin password through the web interface or recreate the joplin container to restore defaults
- PostgreSQL data lost after container restart: Verify joplin_db volume is properly mounted and persistent storage is configured
- Slow synchronization performance: Increase PostgreSQL memory allocation and ensure adequate disk I/O for the database volume
Community Notes
Loading...
Loading notes...
Download Recipe Kit
Get all files in a ready-to-deploy package
Includes docker-compose.yml, .env template, README, and license
Ad Space
Shortcuts: C CopyF FavoriteD Download