有馬総一郎のブログ

(彼氏の事情)

2025年01月21日 20:19:21 JST - 4 minute read - Linux

Cloudflare経由で同期アプリSyncthingを使ってみる

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;
    }

参考にしたサイトのとおり、初期設定ではlocalhost127.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を使用する にチェックをした。すると、設定ファイルは以下のとおりになった。

Syncthing
    <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_passhttpsでなくhttpとしていたためだった。一旦、nginxを外して試してみて気付いた。特にローカルにSSLを設定していなかったのだが、syncthingをインストールしたからか、よく分からんが、SSLでアクセス可能になっている。Cloudflare経由でアクセスすると、認証局はGoogle Trust Servicesなんだけど、ローカルから直でアクセスすると認証局がsyncthingとなっていた。

-        proxy_pass              http://localhost:8384/;
+       proxy_pass              https://localhost:8384/;
Syncthing

それから、外部からアクセスできるように、ファイヤウォールで、いくつかのポートを許可しなければならない。

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 GTK

  1. Syncthingにあるとおり。 ↩︎

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