それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

joplin サーバーをインストールする。

joplin サーバーのインストール

  • Created: 2023.09.21 02:36
  • Updated: 2023.11.23 23:52
  • Combined: 2023.11.23 23:52

joplin サーバーのインストールで高速化するらしい

Joplinサーバーを作らなくても、NextCloudで同期できてるし、問題ないと思ってたが、次のような記述を見つけてしまった。

すると、同期が速くなった。Nextcloudでやっていたときより高速だ。それだけでもJoplin Serverを立てた価値はあったのかも知れない。 https://arimasou16.com/blog/2022/12/01/00484/

たしかにNextCloud は便利だが依存するので、ちょっと面倒くさい。NextCloudはアップデートなどでよくダウンするし、依存は少ないほうが楽だよね。joplin サーバーだけ単体運用したほうが良いかもしれない。

ただ、DockerをつくってDockerボリュームをつかってMySQLまで入れだすと流石に面倒だよね。

docker スタンドアロンで動かしてみる

ただし、docker なのでバックアップ・永続化ストレージが重要になる。

joplin のスタンド・アロンサーバーはDockerで提供されている。

docker run \
  --rm \
  --name joplin \
  --env-file .env \
  -p 22300:22300 \
  joplin/server:latest

ただ、これは管理が面倒なので、永続化と再起動をdocker compsoe で実現しようと考える。

SQLiteで運用する。

docker でmysqlを取り出して移動するの面倒だよね。

設定やドキュメントを見ると、SQLiteがある。

STORAGE_DRIVER=XXXX

永続化を考える。

個人で使うのに、PostgreSQLMySQLとかもいらないだろうしな。

sqlite とファイルをDockerボリュームでマウントすることにする。

source: "./data/db-takuya.sqlite"
target: "/home/joplin/packages/server/db-takuya.sqlite"

永続化方法の候補

  1. PostgreSQLに保存する
  2. Storage Pathをつかう。
  3. Dockerを工夫する
  4. SQLiteでdocker を工夫する

公式では、PostgreSQLをdocker-compose でつかうように書いてあります。

また、StoragePathを環境変数で与えることで、ファイルをDBに保存せず、ファイルとして保存できるようです。ファイルに保存したら、ストレージ・パスを使うと、ファイル単位で使えるようになるが、ファイル数が増えると取り扱いが面倒だ。インデックスとユーザがDB管理になるようです。

何もしなければ、SQLiteにファイルとユーザーのすべてを保存するようです。

PostgreSQLはわりと重い。バックアップと復元はツールで簡単にできる。pd_dump でもいいし、SQLベースで行えて良い。

SQLiteは1ファイルで済むが、ファイルが巨大になるのがデメリットだろう。 ただ、数GB程度ならSQLiteでも良いかもしれない。だから、SQLiteを使うならStoragePathとペアになるだろう。

docker-compose.yml

ボリュームと起動ENVをいれて設定ファイルを作る。

version: "3.7"

services:
  joplin-server:
    image: joplin/server:latest
    container_name: joplin1
    env_file: "./env"
    environment:
      TZ: 'Asia/Tokyo'
    ports:
      - "127.0.0.1:22300:22300"
    volumes:
    - type: bind
      source: "./data/db-takuya.sqlite"
      target: "/home/joplin/packages/server/db-takuya.sqlite"

envファイル

##
APP_BASE_URL=https://joplin.example.tld
APP_PORT=22300
##
SQLITE_DATABASE=/home/joplin/packages/server/db-takuya.sqlite
##
ACCOUNT_TYPES_ENABLED=1

たとえば、次のようにして簡単に作れる。

## 環境変数を作る

cat <<EOF > env
APP_BASE_URL=https://joplin.example.tld
APP_PORT=22300
SQLITE_DATABASE=/home/joplin/packages/server/db-takuya.sqlite
EOF

## DBファイルを作る
DB_NAME=data/db-takuya.sqlite
## joplin server は uid=1001で動作する
touch $DB_NAME
sudo chown 1001:1001 $DB_NAME

起動する

起動してnginxのリバプロを向けてあげる。

nginx 側で設定を作る。

# vim: ft=nginx ts=2 sw=2 sts=2
server {

  server_name  joplin.example.tld;

  add_header  X-Robots-Tag "noindex, nofollow, nosnippet, noarchive";
  listen 127.0.0.1:443 http2 ;
  ssl_certificate_key /etc/letsencrypt/live/joplin.example.tld/privkey.pem;
  ssl_certificate /etc/letsencrypt/live/joplin.example.tld/fullchain.pem;

  location = /robots.txt { return 200 "User-agent: *\nDisallow: /\n"; }
  add_header  X-Robots-Tag "noindex, nofollow, nosnippet, noarchive";

  location / {
    client_max_body_size 1024M;
    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;
    proxy_set_header Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    chunked_transfer_encoding off;
    proxy_pass http://127.0.0.1:22300;
  }
}

この状態で、閲覧ができる

上記のような画面が閲覧できたら、無事に起動している。

ログインして状態を見る。

初期ユーザーは次の通り

  • ユーザー名:admin@localhost
  • パスワード: admin

初期ユーザのパスワードを変更

Adminユーザだけ存在する。

ユーザを作成する

適当なパスワードでユーザを作った

  • ユーザー名: takuya@example.tld
  • パスワード: dyWXXXXXX

joplinから使う。

早速使ってみる。

Joplinにはプロファイル機能があり、役割別にゼロ・ベースでノートを作ることが出来る。いわば別アカウント機能である。

EvernoteやNotionは課金ベースなので、アカウント切り替えで複数ノートを使い分けるなんて至難の業。

このあたり、Joplinはプロファイル切り替えが自由できるので、自由なソフトウェアと言える。

新しいプロファイルを作って、先程のサーバーと同期してみる

まっさらなノート環境ができたので、適当にメモを書いて

同期設定を書く

先程作ったユーザとパスワードを入れる。

同期設定を確認し

同期する

これでサーバーが動作できることがわかった。

ただし、これは、サーバー(Docker)をシャットダウンすると、データが消えます。

データベースはSQLiteに保存されており、永続化しません。

永続化する方法は、公式ドキュメントを読む限りではいくつかあるようです。

SQLiteを永続化ストレージのフォルダに放り込むことで永続化が可能です。

node-fetch 問題

sslh や nginx で問題が起きたので、sslh では regex でクリアした。

node-fetchが TLSでいい感じにSNIを扱えないのでSSLHとnginxでホスト名を見失う現象が起きた。

sslh での例

  {
    name: "regex";
    host: "192.168.2.21";
    port: "443";
    regex_patterns: ["joplin\.example\.biz"]
  },

これはそのうちちゃんと調べて対応したい。

メール問題

ソースコードを見ていると、メール関連の環境変数やメール関連の設定が見つかるが、機能してないようである。ここはそのうち使えるようになるかもしれないし、全部消されるかもしれない。いまは触らないほうが無難だろう。

# MAILER_ENABLED=1
# MAILER_HOST=192.168.1.11
# MAILER_PORT=25
# MAILER_SECURE=none
# MAILER_AUTH_USER=''
# MAILER_AUTH_PASSWORD=''
# MAILER_NOREPLY_NAME=joplin server admin
# MAILER_NOREPLY_EMAIL=server-admin@example.tld

joplin-severを入れてよかったこと。

速い&共有ができる。

NextCloudで同期するより、数段早い。本当に速い。

WebDAVはそのままだろうから、nextcloudのDAVがphpオーバーヘッドがあって遅いことがわかる。

公式ドキュメントにもある通り、NextCloudのWEBDAVより速い。本当に速い。 https://discourse.joplinapp.org/t/joplin-server-pre-release-is-now-available/13605

.ts で書かれたものがphpより速いってのは、隔世の感がある。

webDAV自体が遅いのかもしれないので、nginxのwebDAVと比較してもいいかもしれないのでそのうち試そう。

ときかく、Joplinを使っていて、複数デバイスを同期するのであれば、サーバーを入れたほうがとても快適だと思うのでぜひお試しあれ。

2023-12-15 追記 共有ができる.

Joplin-serverを入れると、ノートの共有URLの発行が楽になる。

有機能でJoplin-serverのURLで発行される。

共有URLの発行ができて、誰かにノート内容をサクッと見せることができる。HTMLやPDFやマークダウンで取り出資する必要がなくて便利です。