ということで 前回、デスクトップアプリとして Joplinをインストールして使ってみたが、 サーバー版もあるということでインストールしてみた。
joplin ServerはDocker Imageだけが用意されている。
Dockerに慣れている方ならば、以下のドキュメントを見れば、サクっと動かせるのだろうけど(だってdocker
だもん)、docker
良く分からん、という私のような人は、上手く行かなかったのでメモしておく。
- Joplin Server Documentation - Features - Joplin Forum
- joplin/README.md at dev · laurent22/joplin · GitHub
と、その前に他の方の成功事例として 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_URL
、APP_PORT
のコメントアウトを解除して、ドメインを変えたぐらい。
ログインページにアクセスできない
そしてdocker run --env-file .env -p 22300:22300 joplin/server:latest
をして無事に起動しているので、https://example.com/joplin
にブラウザでアクセスすると…
path not found
Go to login page
Joplin server 2.9.5, copyright © 2021 Laurent Cozic
とページが見付からない。ログインページに行ってくれ、とあるが、ログインページへのリンクをクリックしても同じ。
https://example.com:22300/joplin
にブラウザでアクセスしても接続タイムアウトになるだけ。
そして、私と同じような悩みを抱えたページ 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
ホストの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.1
2を付与しろとあったので、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 リファレンス — Docker-docs-ja 20.10 ドキュメント
- docker attach — Docker-docs-ja 20.10 ドキュメント
- コンテナを自動的に開始 | Docker ドキュメント
上記を踏まえて、以下で実行。
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
、コンテナ名--name
をjoplin_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からメール送信は設定が必要らしく、メール送信を押してもメールが届かない。
登録完了したければ、管理者から送信メールの確認が出来るので、登録完了のリンクURLをコピーして、自分で踏めば、パスワード入力画面が表示されるので再度同じパスワード入れても良し、変えても良し、で登録完了だ。
ブラウザでノート編集できるわけじゃない
苦労してインストール、設定した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とするため、以下の手順で移行した。
- 今のNextcloudで同期しているプロファイルからエクスポート3
- 別のプロファイルを作成
- 新しいプロファイルに切り替える
- Joplin Serverを同期対象とする
- 1. でエスポートしたファイルをインポート
以上で、完了。
すると、同期が速くなった。Nextcloud
でやっていたときより高速だ。それだけでもJoplin Serverを立てた価値はあったのかも知れない。