Joplin Server Docker 설치 가이드: E2E 암호화 노트 앱 자체 호스팅




Joplin은 Evernote의 강력한 오픈소스 대안입니다. E2E(종단간) 암호화를 지원하여 노트 데이터의 완전한 프라이버시를 보장합니다. Windows, macOS, Linux, Android, iOS 모든 플랫폼을 지원하며, Joplin Server를 자체 호스팅하면 여러 기기 간 안전한 동기화가 가능합니다. 마크다운 기반으로 노트를 작성하고, 할 일 관리, 태그, 노트북 구조까지 제공합니다.

Joplin 주요 특징

Joplin은 프라이버시와 사용성을 모두 갖춘 노트 앱입니다.

핵심 기능

  • E2E 암호화: AES-256 암호화로 노트 보호
  • 마크다운 편집기: WYSIWYG 및 마크다운 뷰어
  • 노트북/태그: 계층 구조와 태그로 체계적 정리
  • 할 일 관리: 체크박스, 알람 기능
  • 웹 클리퍼: 브라우저 확장으로 웹 페이지 저장
  • 첨부 파일: 이미지, PDF, 오디오 등 첨부

Joplin Server 장점

  • 셀프호스팅으로 데이터 완전 소유
  • 다중 사용자 지원
  • 공유 노트북 기능
  • 빠른 동기화 속도
  • REST API 제공

사전 요구 사항

  • Docker 및 Docker Compose 설치
  • 최소 1GB RAM
  • 5GB 이상 저장 공간
  • 도메인 (외부 접근 시)

Docker Compose로 Joplin Server 설치

기본 설치

# docker-compose.yml
services:
  db:
    image: postgres:16
    container_name: joplin-db
    restart: unless-stopped
    environment:
      POSTGRES_DB: joplin
      POSTGRES_USER: joplin
      POSTGRES_PASSWORD: ${DB_PASSWORD:-joplin_secure_password}
    volumes:
      - joplin-db:/var/lib/postgresql/data
    networks:
      - joplin-net

  joplin:
    image: joplin/server:latest
    container_name: joplin-server
    restart: unless-stopped
    depends_on:
      - db
    ports:
      - "22300:22300"
    environment:
      - APP_PORT=22300
      - APP_BASE_URL=${APP_BASE_URL:-http://localhost:22300}
      - DB_CLIENT=pg
      - POSTGRES_HOST=db
      - POSTGRES_PORT=5432
      - POSTGRES_DATABASE=joplin
      - POSTGRES_USER=joplin
      - POSTGRES_PASSWORD=${DB_PASSWORD:-joplin_secure_password}
    networks:
      - joplin-net

volumes:
  joplin-db:

networks:
  joplin-net:
    driver: bridge

환경 변수 파일

# .env
DB_PASSWORD=your_secure_db_password
APP_BASE_URL=https://joplin.yourdomain.com

설치 및 실행

# 디렉토리 생성 및 이동
mkdir joplin-server && cd joplin-server

# docker-compose.yml 및 .env 파일 생성

# 컨테이너 실행
docker compose up -d

# 로그 확인
docker compose logs -f joplin

# 브라우저에서 접속
# http://localhost:22300
# 기본 로그인: admin@localhost / admin

초기 설정

1. 관리자 비밀번호 변경

  1. http://localhost:22300 접속
  2. admin@localhost / admin 으로 로그인
  3. 우측 상단 프로필 → Change Password
  4. 새 비밀번호 설정

2. 일반 사용자 생성

  1. Admin → Users 이동
  2. “Add user” 클릭
  3. 이메일, 이름, 비밀번호 입력
  4. 동기화용 계정으로 사용

Joplin 클라이언트 연결

데스크톱/모바일 앱 설정

  1. Joplin 앱 설치 (Windows/macOS/Linux/Android/iOS)
  2. 도구 → 옵션 → 동기화 이동
  3. 동기화 대상: Joplin Server 선택
  4. 설정:
    • Joplin Server URL: https://joplin.yourdomain.com
    • 이메일: 생성한 사용자 이메일
    • 비밀번호: 사용자 비밀번호
  5. “동기화 대상 확인” 클릭

E2E 암호화 활성화

  1. 도구 → 옵션 → 암호화 이동
  2. “암호화 활성화” 클릭
  3. 마스터 비밀번호 설정 (분실 시 복구 불가!)
  4. 모든 기기에서 동일한 마스터 비밀번호 사용

고급 설정

프로덕션 환경 (HTTPS + 리버스 프록시)

# docker-compose.prod.yml
services:
  db:
    image: postgres:16
    container_name: joplin-db
    restart: always
    environment:
      POSTGRES_DB: joplin
      POSTGRES_USER: joplin
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - joplin-db:/var/lib/postgresql/data
    networks:
      - joplin-net

  joplin:
    image: joplin/server:latest
    container_name: joplin-server
    restart: always
    depends_on:
      - db
    expose:
      - "22300"
    environment:
      - APP_PORT=22300
      - APP_BASE_URL=${APP_BASE_URL}
      - DB_CLIENT=pg
      - POSTGRES_HOST=db
      - POSTGRES_PORT=5432
      - POSTGRES_DATABASE=joplin
      - POSTGRES_USER=joplin
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      # 메일 설정 (선택)
      - MAILER_ENABLED=1
      - MAILER_HOST=${MAIL_HOST}
      - MAILER_PORT=587
      - MAILER_SECURITY=starttls
      - MAILER_AUTH_USER=${MAIL_USER}
      - MAILER_AUTH_PASSWORD=${MAIL_PASSWORD}
      - MAILER_NOREPLY_NAME=Joplin
      - MAILER_NOREPLY_EMAIL=noreply@yourdomain.com
    networks:
      - joplin-net
      - traefik-public
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.joplin.rule=Host(`joplin.yourdomain.com`)"
      - "traefik.http.routers.joplin.entrypoints=websecure"
      - "traefik.http.routers.joplin.tls.certresolver=letsencrypt"
      - "traefik.http.services.joplin.loadbalancer.server.port=22300"

volumes:
  joplin-db:

networks:
  joplin-net:
    driver: bridge
  traefik-public:
    external: true

Nginx 리버스 프록시 설정

# /etc/nginx/conf.d/joplin.conf
server {
    listen 80;
    server_name joplin.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name joplin.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/joplin.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/joplin.yourdomain.com/privkey.pem;

    client_max_body_size 200M;

    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;
    }
}

파일시스템 스토리지 설정

대용량 첨부파일을 데이터베이스 외부에 저장:

# docker-compose.yml (joplin 서비스에 추가)
services:
  joplin:
    environment:
      - STORAGE_DRIVER=Type=Filesystem; Path=/data/joplin-storage
    volumes:
      - joplin-storage:/data/joplin-storage

volumes:
  joplin-storage:

관리 명령어

# 로그 확인
docker compose logs -f joplin

# 데이터베이스 백업
docker compose exec db pg_dump -U joplin joplin > backup_$(date +%Y%m%d).sql

# 데이터베이스 복원
docker compose exec -T db psql -U joplin joplin < backup.sql

# 컨테이너 재시작
docker compose restart joplin

# 업데이트
docker compose pull
docker compose up -d

환경 변수 전체 목록

변수설명기본값
APP_PORT서버 포트22300
APP_BASE_URL외부 접근 URL
DB_CLIENTDB 타입 (pg/sqlite)sqlite
POSTGRES_HOSTPostgreSQL 호스트
POSTGRES_PORTPostgreSQL 포트5432
POSTGRES_DATABASEDB 이름
POSTGRES_USERDB 사용자
POSTGRES_PASSWORDDB 비밀번호
STORAGE_DRIVER스토리지 드라이버Database
MAILER_ENABLED메일 활성화0
MAILER_HOSTSMTP 호스트

문제 해결

“Not a valid URL” 오류

Joplin 앱에서 연결 시 URL 앞에 https://를 포함해야 합니다.

동기화 실패

  1. APP_BASE_URL이 실제 접근 URL과 일치하는지 확인
  2. 방화벽에서 포트 22300 허용 확인
  3. 리버스 프록시 설정 확인

권한 오류

# 볼륨 권한 확인
docker compose exec joplin ls -la /data

마무리

Joplin Server를 자체 호스팅하면 Evernote나 Notion 같은 상용 서비스 없이도 완전한 노트 동기화 환경을 구축할 수 있습니다. E2E 암호화로 프라이버시를 보장하고, 마크다운 기반으로 이식성 높은 노트를 관리할 수 있습니다. Docker를 통해 쉽게 배포하고, 서버가 오프라인이 되더라도 로컬에 저장된 노트는 계속 사용 가능합니다.


참고 링크

  • 공식 사이트: https://joplinapp.org
  • GitHub: https://github.com/laurent22/joplin
  • Docker Hub: https://hub.docker.com/r/joplin/server
  • 문서: https://joplinapp.org/help



댓글 남기기