How to configure Joplin Server

개요

Joplin은 오픈소스 메모 작성 응용프로그램입니다.

마크다운으로 글을 작성하고, 작성된 노트는 HTML 형식으로 출력됩니다.

이미지는 joplinapp.org 에서 가져왔습니다.

응용프로그램

글작성을 위한 응용프로그램은 여러 플랫폼으로 제공됩니다.

  • Desktop
    • Windows
    • macOS
    • Linux
  • Mobile
    • Android
    • iOS
  • Terminal
    • macOS
    • Linux (Windows via WSL)

joplinapp 페이지의 installation 영역에서 파일 다운로드 링크를 확인할 수 있습니다.

동기화

작성된 글은 지원되는 여러 방법중 하나를 선택해서 동기화할 수 있습니다.

지원되는 동기화 방법:

  • Nextcloud
  • Dropbox
  • OneDrive
  • WebDAV
  • File system
  • Joplin server

Joplin server

동기화 서비스를 내 서버에서 제공하기 위해서 Joplin server 를 실행할 수 있습니다.

서버에 직접 설치할 수도 있지만, 도커 컨테이너로 실행하는 것으로 결정했습니다.

필요한 정보는 GitHub의 Joplin 저장소에서 제공되고 있습니다.

Docker image

도커 이미지를 직접 빌드하거나, 이미 빌드된 이미지를 활용할 수 있습니다.

도커 이미지 빌드를 위한 Dockerfile 은 joplin 저장소의 Dockerfile.server 파일을 참조할 수 있습니다.

빌드된 이미지를 사용해서 docker-compose 로 실행하기 위한 구성 파일은 아래와 같습니다.

Joplin 저장소의 docker-compose.server.yml 파일의 내용:

# This is a sample docker-compose file that can be used to run Joplin Server
# along with a PostgreSQL server.
#
# All environment variables are optional. If you don't set them, you will get a
# warning from docker-compose, however the app should use working defaults.

version: '3'

services:
    db:
        image: postgres:13.1
        ports:
            - "5432:5432"
        restart: unless-stopped
        environment:
            - APP_PORT=22300
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
            - POSTGRES_USER=${POSTGRES_USER}
            - POSTGRES_DB=${POSTGRES_DATABASE}
    app:
        image: joplin/server:latest
        depends_on:
            - db
        ports:
            - "22300:22300"
        restart: unless-stopped
        environment:
            - APP_BASE_URL=${APP_BASE_URL}
            - DB_CLIENT=pg
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
            - POSTGRES_DATABASE=${POSTGRES_DATABASE}
            - POSTGRES_USER=${POSTGRES_USER}
            - POSTGRES_PORT=${POSTGRES_PORT}
            - POSTGRES_HOST=db

docker-compose 파일의 내용을 보면, DBMS 로 Postgres 를 사용합니다.

Joplin server 응용프로그램은 postgres 에 의존되어 실행되는 것을 알 수 있습니다.

Joplin server 이미지는 docker: joplin/server 에서 얻을 수 있습니다.

환경변수는 Joplin 저장소의 .env-sample 파일에서 확인할 수 있습니다.

Postgres

Joplin server 응용프로그램이 처음 실행될 때, 데이터베이스 마이그레이션을 진행할 것으로 예상됩니다.

설명이 부족해서 확인은 불가능하지만 보통 데이터베이스와 사용자는 미리 준비해두고 진행하는게 좋을 것 같습니다.

이미 사용중인 Postgres 데이터베이스가 있어, 아래의 명령으로 데이터베이스 사용자와 데이터베이스를 작성합니다.

사용자 작성

사용자 이름은 joplin이고, 비밀번호는 joplin 을 사용합니다.

/* Create user */
create user joplin WITH ENCRYPTED PASSWORD 'joplin';

데이터베이스 작성

앞서 작성한 joplin 사용자가 소유하는 joplin 데이터베이스를 작성합니다.

/* Create database */
CREATE DATABASE joplin OWNER joplin ENCODING 'utf-8';

데이터베이스를 준비했으므로 이제 응용프로그램을 실행합니다.

Joplin server 시작

저는 이미 사용중인 Postgres 데이터베이스가 있어 Jpolin 저장소의 docker-compose.server.yml 파일의 내용을 편집해서 사용합니다.

컨테이너 실행

docker-compose.yml 파일의 내용:

version: '3'

services:
    app:
        image: joplin/server:latest
        container_name: joplin
        # link to postgres container 
        external_links:
            - postgres:postgres
        network_mode: bridge
        # If run container using specified user
        # user: "1000:1000"
        ports:
            - "22300:22300"
        restart: unless-stopped
        environment:
            - APP_BASE_URL=https://mydomain.com
            - DB_CLIENT=pg
            - POSTGRES_PASSWORD=joplin
            - POSTGRES_DATABASE=joplin
            - POSTGRES_USER=joplin
            - POSTGRES_PORT=5432
            - POSTGRES_HOST=postgres
            - TZ=Asia/Seoul

docker-compose 명령으로 컨테이너를 실행합니다.

$ docker-compose up -d

리버스 프록시

22300 포트에서 요청을 대기하므로, 리버스 프록시로 특정 도메인 80 포트에 연결하면, 편리하게 사용할 수 있습니다.

  • mydomain.com:80 -> localhost:22300
  • mydomain.com:443 -> localhost:22300

사용자 추가

웹 브라우저를 열고, 리버스 프록시로 구성한 도메인으로 탐색합니다.

https://mydomain.com

로그인 페이지로 이동되면, 아래 정보로 로그인합니다.

  • 사용자 이름(전자우편주소): admin@localhost
  • 비밀번호: admin

Joplin server가 처음 실행되면 admin@localhost 계정이 기본적으로 추가됩니다.

누구나 공개된 동일한 계정을 사용하면 안되므로, 비밀번호를 변경합니다.

이후, 내 계정을 추가합니다.

그런데, UI 에서 관리자 여부를 설정할 수 없습니다.

postgres 데이터베이스를 연결해서 Joplin 데이터베이스에 마이그레이션된 테이블을 확인합니다.

select * from pg_tables;

joplin 데이터베이스에 users 테이블이 존재합니다.

users 테이블을 쿼리하면, 현재 사용자 목록을 확인할 수 있습니다.

select * from users;

admin@localhost 계정, 내 계정 두개가 존재합니다.

내 계정 레코드의 is_admin 열의 값을 1로 업데이트하면 내 계정이 관리자가 됩니다.

update users
set is_admin
where id = 'xxxxxxxxxxxxxx'

다시 사용자 테이블 users 을 쿼리해서 is_admin 열의 값이 1로 업데이트된 것을 확인한 후, 찜짐한 admin@localhost 계정을 제거하면 됩니다.

Joplin app

동기화 구성

Joplin 응용프로그램에서 동기화 원본을 Joplin server 로 지정합니다.

Joplin 응용프로그램의 설정 창을 열고, 동기화 설정으로 이동합니다.

동기화 대상을 Joplin Server 로 변경합니다.

Joplin Server URL 을 입력합니다. 리버스 프록시로 구성된 내 도메인 주소를 입력합니다.

예) https://mydomain.com

Joplin Server Directory 는 내 글의 저장되는 디렉터리 이름을 지정합니다. 빈 값은 동작하지 않았고, 사용자 별로 지정이 가능한 것으로 보이므로 동기화를 사용하는 기기는 모두 동일한 값을 갖게 구성하면 될 것으로 보입니다.

저는 임의의 디렉터리 이름을 사용하고 있습니다.

예) bbon

Joplin Server username 은 Joplin server 에 추가한 계정의 전자우편주소를 작성합니다.

Joplin Server password 는 Joplin server 에 추가한 계정의 비밀번호를 작성합니다.

작성을 마친 후 동기화 설정 확인 버튼을 클릭하면, 동기화 구성 성공 여부를 알 수 있습니다.

이제부터 글을 작성하면 서버에 내용이 전송되고, 다른 Joplin 응용프로그램에서 작성한 내용이 현재 Joplin 응용프로그램에 반영됩니다.

아직 동기화 중 병합 충돌 관련 상황이 발생하지 않아서, 큰 문제없이 사용하고 있습니다.

마침

내가 작성한 글을 내 서버에 저장하고, 기기간 동기화를 제공하기 위해 Joplin server 를 도커 docker 컨테이너로 실행하는 과정을 나중에 찾아보기 위해 기록으로 남겼습니다.

이 글을 보고 따라해보시는 분들의 구성 환경이 다를 수 있으므로 무조건 따라하시기 보다는 먼저 읽어보시고 자신에게 맞는 구성을 준비하신 후 실행하시면 좋겠습니다.

Joplinapp.org 응용프로그램 설명은 잘 되어 있으나, Joplin server 관련 정보가 거의 없어서 GitHub: laurent22/joplin 의 내용으로 유추하고, 진행한 내용이므로 Joplin 에서 의도한 내용과는 다를 수 있습니다.