JoplinはCLIで起動、編集までできるので重用しているのだけど、パッとメモる時は、5分間隔で同期されるのを待つかjoplin sync
とコマンドを叩いて手動で同期しなければいけないので、ちょっと不便。最初は、ブラウザ・オンラインでメモれる自己ホスト型のマークダウンサーバーを構築しようと思ったけど、ちょっとしたメモ書きにそこまでやるのは面倒なので、
Syncthingを導入することにした。インストールはdocker
でなくバイナリパッケージ1をインストールした。
基本は、 複数のPCでファイルを同期する「Syncthing」を使ってみた #Linux - Qiitaのとおりで上手くいく。のはずだが、アホなことで躓いたのでメモっておく。
例によって、サブディレクトリ構成2で運用していく。特に難しくもない設定なのだが、ちょっとした落とし穴があった。
nginx.conf
###
# syncthing
###
location /syncthing/ {
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;
proxy_pass https://localhost:8384/;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
access_log /var/log/nginx/syncthing.access.log;
error_log /var/log/nginx/syncthing.error.log;
}
参考にしたサイトのとおり、初期設定ではlocalhost
、127.0.0.1
といった自分自身からしかアクセスできなくなっている。しかし、GUI環境がないので、アドレスを0.0.0.0
として、別端末からアクセスして、設定できるようにする。
~/.local/state/syncthing/config.xml
<gui enabled="true" tls="false" debugging="false" sendBasicAuthPrompt="false">
<address>0.0.0.0:8384</address>
<apikey>32桁のAPIキー</apikey>
<theme>default</theme>
</gui>
<ldap></ldap>
そして、変な端末からアクセスされないように初回ログインした時、パスワードを設定して、 GUIにHTTPSを使用する にチェックをした。すると、設定ファイルは以下のとおりになった。

<gui enabled="true" tls="true" debugging="false" sendBasicAuthPrompt="false">
<address>0.0.0.0:8384</address>
<use>ユーザ名</user>
<password>Hash化したパスワード</password>
<apikey>32桁のAPIキー</apikey>
<theme>default</theme>
</gui>
<ldap></ldap>
だが、その後、アクセスできなくなってしまったのだ…結論から言うと、上のGUI設定でHTTPSを使用するにチェックしたのに、 nginxの設定でproxy_pass
をhttps
でなくhttp
としていたためだった。一旦、nginx
を外して試してみて気付いた。特にローカルにSSLを設定していなかったのだが、syncthing
をインストールしたからか、よく分からんが、SSLでアクセス可能になっている。Cloudflare経由でアクセスすると、認証局はGoogle Trust Servicesなんだけど、ローカルから直でアクセスすると認証局がsyncthingとなっていた。
- proxy_pass http://localhost:8384/;
+ proxy_pass https://localhost:8384/;

それから、外部からアクセスできるように、ファイヤウォールで、いくつかのポートを許可しなければならない。
Firewall Setup — Syncthing v1.29.1 documentation
それまで、知らなかったのだけど、/etc/ufw/applications.d/
配下にアプリ名としてファイルを置けば、そのアプリ名で許可できる。syncthing
の場合、パッケージインストールと一緒にそのファイルも作成されていた。
$ cat /etc/ufw/applications.d/syncthing
[syncthing]
title=Syncthing
description=Syncthing file synchronisation
ports=22000|21027/udp
[syncthing-gui]
title=Syncthing-GUI
description=Syncthing web gui
ports=8384/tcp
なので、sudo ufw allow syncthing
とするだけで対象のポートを許可してくれる。実際のポートを確認したければsudo ufw status verbose
とすれば良い。
$ sudo ufw status verbose
状態: アクティブ
ロギング: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
新しいプロファイル: skip
To Action From
-- ------ ----
22000 (syncthing) ALLOW IN Anywhere
21027/udp (syncthing) ALLOW IN Anywhere
・・・中略・・・
22000 (syncthing (v6)) ALLOW IN Anywhere (v6)
21027/udp (syncthing (v6)) ALLOW IN Anywhere (v6)
これで同期したい端末一つ一つにsyncthing
をインストールして端末、フォルダーを設定すれば良し。サーバーとクライアントという関係でなく、各端末がサーバーであり、クライアントになるというのか、どう表すのが適当か分からないが、そこらへんがちょっと混乱するけど、Android端末だと
Syncthing-Fork - Google Play のアプリ、リモートからのアクセスなど考えなくて良い場合、flatpak版の
Syncthing GTKがあるのでサクッと設定できる。

-
公式が
/syncthing
でアクセスするケースを載せている。 Reverse Proxy Setup — Syncthing documentation ↩︎