Skip to content

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:

  1. Open Synchronization Settings
  2. Select: Joplin Server
  3. 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