有馬総一郎のブログ

(彼氏の事情)

2022年12月01日 00:42:12 JST - 8 minute read - Linux

Joplin Serverをインストールしてみる(DockerコンテナからホストのNginxやPostgresと連携する)

ということで 前回、デスクトップアプリとして Joplinをインストールして使ってみたが、 サーバー版もあるということでインストールしてみた。

Joplin Server

joplin ServerはDocker Imageだけが用意されている。 Dockerに慣れている方ならば、以下のドキュメントを見れば、サクっと動かせるのだろうけど(だってdockerだもん)、docker良く分からん、という私のような人は、上手く行かなかったのでメモしておく。

と、その前に他の方の成功事例として Guide for Joplin-Server on Raspberry Pi - Development - Joplin Forumを貼っておく。

環境設定ファイル

環境設定ファイルをまず用意する。サンプルは joplin/.env-sample at devにある。

.env

# =============================================================================
# PRODUCTION CONFIG EXAMPLE
# -----------------------------------------------------------------------------
# By default it will use SQLite, but that's mostly to test and evaluate the
# server. So you'll want to specify db connection settings to use Postgres.
# =============================================================================
#
APP_BASE_URL=https://example.com/joplin
APP_PORT=22300
# 
# DB_CLIENT=pg
# POSTGRES_PASSWORD=joplin
# POSTGRES_DATABASE=joplin
# POSTGRES_USER=joplin
# POSTGRES_PORT=5432
# POSTGRES_HOST=localhost

殆ど変えていない。APP_BASE_URLAPP_PORTのコメントアウトを解除して、ドメインを変えたぐらい。

ログインページにアクセスできない

そしてdocker run --env-file .env -p 22300:22300 joplin/server:latestをして無事に起動しているので、https://example.com/joplinにブラウザでアクセスすると…

Joplin Server
path not found

Go to login page

Joplin server 2.9.5, copyright © 2021 Laurent Cozic

とページが見付からない。ログインページに行ってくれ、とあるが、ログインページへのリンクをクリックしても同じ。

https://example.com:22300/joplinにブラウザでアクセスしても接続タイムアウトになるだけ。

Joplin Server

そして、私と同じような悩みを抱えたページ Problem setting up Joplin Server / nginx / docker - Support - Joplin Forumが見付かった。そこの回答のとおりに編集した結果が以下となる。

/etc/nginx/sites-available/example.com

server {
    listen 80;
    listen [::]:80;
    server_name example.com;

    location /joplin {
        return 301 https://$server_name$request_uri;
    }
}

server {
    #listen 80 default_server;
    #listen [::]:80 default_server;

    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    root /var/www;

    server_name example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ###
    # joplin
    ###
    location /joplin/ {
        proxy_redirect off;
        rewrite        ^/joplin/(.*)$ /$1 break;
        proxy_pass     http://127.0.0.1:22300;

        proxy_set_header X-Forwarded-Host  $host;
        proxy_set_header Host              $host;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP         $remote_addr;

        access_log     /var/log/nginx/joplin_access.log;
        error_log      /var/log/nginx/joplin_error.log;
        #access_log    off;
    }

}

上記のようになるようにnginxの設定ファイルを編集して、テスト、そしてnginxを再起動で、今度こそ無事にログインページにアクセス出来た。

sudoedit /etc/nginx/sites-available/example.com 
sudo nginx -t
sudo systemctl restart nginx.service 
docker run --env-file .env -p 22300:22300 joplin/server:latest
Joplin Server

ホストのPostgreSQLに接続できない

で、上記 .env 環境設定ファイルはsqliteを使ったやりかたとなる。次に、ホストに既にインストール済みの PostgreSQLに接続したい。

.env

# =============================================================================
# PRODUCTION CONFIG EXAMPLE
# -----------------------------------------------------------------------------
# By default it will use SQLite, but that's mostly to test and evaluate the
# server. So you'll want to specify db connection settings to use Postgres.
# =============================================================================
#
APP_BASE_URL=https://example.com/joplin
APP_PORT=22300
# 
DB_CLIENT=pg
POSTGRES_PASSWORD=joplin
POSTGRES_DATABASE=joplin
POSTGRES_USER=joplin
POSTGRES_PORT=5432
POSTGRES_HOST=localhost

とコメントアウトを解除してdocker run --env-file .env -p 22300:22300 joplin/server:latestすると…

2022-11-22 15:47:58: App: Content driver: { type: 1 }
2022-11-22 15:47:58: App: Content driver (fallback): null
2022-11-22 15:47:58: App: Trying to connect to database...
2022-11-22 15:47:58: db: Could not connect. Will try again. getaddrinfo ENOTFOUND host.docker.internal
2022-11-22 15:47:58: db: Could not connect. Will try again. getaddrinfo ENOTFOUND host.docker.internal

と接続できない。そして、これまた同じ事例が挙げられている。

--add-host=host.docker.internal:host-gatewayを付与してホスト側のIPアドレスを参照するようにしてみる。

docker run --env-file .env --add-host=host.docker.internal:host-gateway -p 22300:22300 joplin/server:latest

2022-11-22 16:06:43: App: Content driver: { type: 1 }
2022-11-22 16:06:43: App: Content driver (fallback): null
2022-11-22 16:06:43: App: Trying to connect to database...
2022-11-22 16:07:13: db: Could not connect. Will try again. Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
2022-11-22 16:07:13: [error] db: Timeout trying to connect to database: KnexTimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
    at Client_PG.acquireConnection (/home/joplin/packages/server/node_modules/knex/lib/client.js:295:26)
    at Runner.ensureConnection (/home/joplin/packages/server/node_modules/knex/lib/execution/runner.js:259:28)
    at Runner.run (/home/joplin/packages/server/node_modules/knex/lib/execution/runner.js:30:19) {
  sql: undefined,
  bindings: undefined
}
Error: Timeout trying to connect to database. Last error was: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
    at Object.<anonymous> (/home/joplin/packages/server/src/db.ts:113:10)
    at Generator.next (<anonymous>)
    at fulfilled (/home/joplin/packages/server/dist/db.js:5:58)

エラーメッセージが変わった。sudo ufw allow 5432でPostgreSQLのポートを開けてみる1

2022-11-22 16:15:04: App: Content driver: { type: 1 }
2022-11-22 16:15:04: App: Content driver (fallback): null
2022-11-22 16:15:04: App: Trying to connect to database...
2022-11-22 16:15:04: db: Could not connect. Will try again. connect ECONNREFUSED 172.17.0.1:5432

結局、駄目。で上のIssueで紐付けられていた POSTGRES_HOST issues with localhost and 127.0.0.1 · Issue #5386 · laurent22/joplin · GitHubを見ると--net=host --add-host=host.docker.internal:127.0.0.12を付与しろとあったので、docker run --env-file .env --net=host --add-host=host.docker.internal:127.0.0.1 -p 22300:22300 joplin/server:latestと実行する。

2022-11-23 14:00:25: App: Trying to connect to database...
2022-11-23 14:00:25: db: Could not connect. Will try again. password authentication failed for user "joplin"

繋がった!ちなみに--net=hostをするとWARNING: Published ports are discarded when using host network modeという警告が出るようになる。それは、ネットワーク構成がホストから分離されなくなるらしい。正直、だからどうなんだと、よく理解していないが、それでポートマッピング-pが機能しなくなる。不要なので-p 22300:22300は削除する。

PostgreSQLでユーザ、データベース作成

後は、Postgresqlでデーバベース、ユーザを作成すれば良いだけだ。sudo -u postgres psqlで接続。sudo昇格パスワードを入力して、それからpostgresqlユーザのパスワードを入力する。

postgres=# CREATE ROLE joplin;  // joplinというロールを作成
postgres=# \password joplin  // ロールのパスワード設定
postgres=# パスワード入力
postgres=# 
postgres=# ALTER ROLE joplin WITH LOGIN;  // ロールにログイン権限を付与
postgres=# CREATE DATABASE joplin WITH OWNER joplin;
postgres=# // joplinというデータベースを作成し、joplinに所有権を与える
postgres=# 
postgres=# \q

にしてもPostgreSQLではユーザとロールってほぼ同じ意味なんだね。以下、参照。

【初心者向け】PostgreSQLのロールについて分かり易く解説

CREATE ROLEとCREATE USERはほぼ同じだ。しかし、CREATE USERで作成されたロールはログイン属性を持つが、CREATE ROLEだけではログイン属性は付かないので注意が必要だ。

データベース、ユーザを作成する。作成したユーザ、データベース、パスワード通りに .env 環境設定ファイルを編集して、起動。再びログイン画面が表示された。

Joplin Serverの起動方法を改善

起動は無事に出来るようになったので、その方法を改善する。

上記を踏まえて、以下で実行。

docker run -d --restart unless-stopped --name joplin_server --env-file .env --net=host --add-host=host.docker.internal:127.0.0.1 joplin/server:latest

バックエンドで起動-d、そして再起動ポリシーを適用して--restart unless-stopped、コンテナ名--namejoplin_serverとして起動させている。

分かりやすいように名前をjoplin_serverと付けているが、docker psで起動しているdockerプロセス、コンテナの一覧を確認が出来る。-aを付けると、終了したものまで見れる。

arimasou16@ubuntu:~$ docker ps -a | grep joplin
f22fd9f4dd73   joplin/server:latest                           "tini -- node dist/a…"   3 days ago     Up 3 days                                                      peaceful_nightingale
6e2802f692e3   joplin/server:latest                           "tini -- node dist/a…"   3 days ago     Exited (130) 3 days ago                                        mystifying_diffie
bf6499a9bedc   joplin/server:latest                           "tini -- node dist/a…"   3 days ago     Exited (130) 3 days ago                                        optimistic_heisenberg
1a07f2f9fc52   joplin/server:latest                           "tini -- node dist/a…"   7 days ago     Exited (130) 7 days ago                                        sharp_hofstadter

docker runの時、-name付けなくても勝手に変な名前が付けられるし、doccker attachと入力して、タブを押せば、自動でコンテナの名前が補完候補として表示される。

arimasou16@ubuntu:~$ docker attach
docker-mattermost-1   peaceful_nightingale
arimasou16@ubuntu:~$ docker attach peaceful_nightingale
^Carimasou16@ubuntu:~$ docker ps -a
CONTAINER ID   IMAGE                                          COMMAND                  CREATED        STATUS                       PORTS                               NAMES
f22fd9f4dd73   joplin/server:latest                           "tini -- node dist/a…"   3 days ago     Exited (130) 5 seconds ago                                       peaceful_nightingale

で止めるときは、docker attach コンテナ名、そしてCtrl+cを入力すれば終了させられる。

Joplinアプリユーザ作成

初回のJoplinサーバーへのログインは、デフォルトの管理者admin@localhostでパスワードはadminで行う。

Admin -> Usersで管理者のパスワードを変更して、Joplinアプリを使う一般ユーザを追加すれば準備は万端だ。

Joplin Server
ホーム画面
Joplin Server
ダッシュボード画面
Joplin Server
ユーザ管理画面

一般ユーザでログインしたとき、「送信したメールに含まれている有効化リンクをクリックして登録を完了させ下さい」、みたいなメッセージが出る。パスワードを空でユーザを作ったわけでもないなら、放置しても問題ない。

Joplin Server
登録完了できてません警告

そもそもJoplin Serverからメール送信は設定が必要らしく、メール送信を押してもメールが届かない。

登録完了したければ、管理者から送信メールの確認が出来るので、登録完了のリンクURLをコピーして、自分で踏めば、パスワード入力画面が表示されるので再度同じパスワード入れても良し、変えても良し、で登録完了だ。

Joplin Server
登録完了

ブラウザでノート編集できるわけじゃない

苦労してインストール、設定したJoplin Serverだけど、思ってたのと違う。てっきり、ブラウザ上でノートの編集が出来るのと思ったら、そういう訳じゃない。

Joplin Web API for Nextcloud is now discontinued in favour of Joplin Server

Joplin Web API for Nextcloudは、Joplin Serverに移行し、廃止となりました。

コメントされているから、そういうものかと思ってたんだけどね、結局、Chromebookでjoplin使うには、スマホのアプリなり、デスクトップアプリなりのインストールが必要ってことだよね。

ともあれ、折角なので同期対象をJoplin Serverとするため、以下の手順で移行した。

  1. 今のNextcloudで同期しているプロファイルからエクスポート3
  2. 別のプロファイルを作成
  3. 新しいプロファイルに切り替える
  4. Joplin Serverを同期対象とする
  5. 1. でエスポートしたファイルをインポート

以上で、完了。

Joplin Server
Joplinデスクトップアプリ

すると、同期が速くなった。Nextcloudでやっていたときより高速だ。それだけでもJoplin Serverを立てた価値はあったのかも知れない。


  1. その後、閉じても平気だったので、この手順は不要。 ↩︎

  2. ホストネットワークの利用 | Docker ドキュメント ↩︎

  3. JEX 形式で行なった。 ↩︎