(編集中)グローバルIPなし、VPSなし、Cloudflare利用で自宅Misskeyを建てる[実験的]
こんにちは!Twitterの開発者離れで徐々にMisskeyに引っ越しているおきんです。 今回Misskey.ioにアカウントを作成しましたが、Fediverseに参加する観点でも好き勝手出来る自分の城を持つという意味でも自宅にもインスタンスが欲しくなったので、みおきー(https://mi.okin-jp.net)を立てたときの手順を紹介します。
概要
キーワード: Cloudflare Tunnel, cloudflared, Cloudflare Warp, Cloudflare Zero Trust, Cloudflare, Docker, Misskey, Fediverse, お一人様インスタンス, お一人様サーバー
Zero Trust インターネット向きおよびインターネットからの通信を全てCloudflare Zero Trustを通じて行うことで、VPSなどの外部設備を使わずにMisskeyインスタンスを建てます。なおこの方法で立てると何故か瞬断が頻発するため本番運用には非推奨です。
前提条件
- Cloudflareで利用可能な状態の独自ドメイン(ネームサーバーをCloudflareに向けているもの)
- インターネットに接続可能な環境(実効帯域幅100Mbps程度推奨)
- amd64 Linuxのインストールされたサーバー(今回はUbuntu22.04を使用) ※これはarm64環境向けのCloudflare Warpクライアントが配信されていないためです
出来上がる構成
以下はMisskeyからみた具体的なTunnelとWarpの使い分けイメージです。
- 外からMisskey宛てに来る通信は、インターネットから見たときにはCloudflareが待ち受けています。そして実際の通信はTunnel(一般的に言うリバースプロキシ+VPN)を通じてMisskeyの待ち受けポートに届けられます。 これにより、サーバー自身へ直接アクセスできる必要がなくなり、一般的なクライアントとしてのインターネット疎通性があればいいということになります。
- Misskeyから他インスタンスなどインターネット上のサーバーへのアクセスは、Warp/Cloudflare Zero Trust(一般的にいうVPN)を通じてCloudflare経由で行われます。VPNなのでこのサーバーからの通信はインターネットから見るとCloudflareから行われているように見えます。
つまり完成した構成 では、インターネットからみて完全にCloudflareのIPから通信を行うサーバーになることができます。
操作手順
サーバーの事前準備
- インストール済みのパッケージを最新化する
12sudo apt updatesudo apt upgrade -y - 必要そうなパッケージを入れる
12345678# とりあえず入れておくと便利なパッケージsudo apt install software-properties-common build-essential screen nano# Proxyする用のnginxsudo apt install nginx# letencryptで証明書をとりたいときのためのパッケージsudo apt install certbot python3-certbot-dns-cloudflare# NASにデータを置きたいときなどsudo apt install cifs-utils - (もしあれば)Snap版のdockerを削除する
1sudo snap remove docker - dockerをインストールする。(参照: https://docs.docker.com/engine/install/ubuntu/)
123456curl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docker.sh# 動作確認sudo docker versionsudo docker compose version
Cloudflare Zero Trustの事前設定
今回実施する設定は以下の通りです。
- General>Team domainの設定(Team domain(<subdomain>.cloudflareaccess.com)を設定する)
- Network>Firewall関連の設定(TLS decryptionとAV inspectionの無効化)
- Cloudflareの証明書をクライアントに入れる必要がある設定を外します
- WARP Client>Device enrollment関連の設定(Service Tokenの設定)
- サーバーからログインするための事前設定をします
- WARP Client>Device settings関連の設定(Auto connectの設定)
- Cloudflare Warpに自動接続する設定をします
- WARP Client>Device settings関連の設定(Split tunnelsの設定)
- Cloudflare Tunnelと共存するために必要な設定をします
- Cloudflareの管理画面トップ>Zero Trust か https://one.dash.cloudflare.com/から Cloudflare Zero Trustの管理画面に入る。
- 左のメニューからSettingsを選ぶ
- Generalを選ぶ
- WIP
- Networkを選ぶ
- Settingsに戻って、WARP Clientを選ぶ
Cloudflare Warpの設定
Misskeyインスタンスを動かすサーバーがインターネットと通信する経路をCloudflare経由にします
- Warpクライアントのレポジトリを設定する(参照: https://pkg.cloudflareclient.com/install)
123456# GPG keyを追加するcurl https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg# レポジトリを追加するecho "deb [arch=amd64 signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list# リポジトリ情報を更新sudo apt update - mdm.xmlを作る(参照: Managed deployment · Cloudflare Zero Trust docs )
- mdm.xmlに必要なService Tokenを取得する
- Cloudflare Zero Trustの管理画面からAccess > Service Authを選ぶ
- Create Service Tokenを選び、Service Tokenを作成する 名前と有効期限(無期限も可)を決める
- ServiceTokenとしてclient ID(.accessで終わる)とclient secretが表示される(黒塗りのところ)ので、メモを取る client secretは一度しか表示されないので、もしメモを取り損ねたら慌てず消して作り直す
- mdm.xmlを置くディレクトリを作成する
1sudo mkdir -p /var/lib/cloudflare-warp/ - 以下の内容を取得したService Tokenなどで埋めて、/var/lib/cloudflare-warp/mdm.xmlを作成する
12345678<dict><key>organization</key><string>ここにTeam domainを入れる</string><key>auth_client_id</key><string>ここにclient IDを入れる</string><key>auth_client_secret</key><string>ここにclient secretを入れる</string></dict>
- mdm.xmlに必要なService Tokenを取得する
- Warpクライアントをインストールする
1sudo apt install cloudflare-warp - warp-cliで接続する
1warp-cli connect - 接続元IPがCloudflareになっていることを確かめる
1curl https://ipinfo.io/
Cloudflare Tunnelの設定
Tunnelを設定する
Cloudflare Tunnel・Warpクライアントの瞬断対応
Cloudflare Tunnelが不通になったときにcloudflaredを再起動するスクリプトを設置し、5秒に1度程度実行するように設定します。
cloudflared起因でサイトがダウンしたときに活を入れるのスクリプトを良い感じの場所に設置してcrontabやsystemd-timerで定期実行します。このスクリプトはsystemdを操作するのでrootユーザーで再起動。
crontabに設定する場合の例です。
1 |
* * * * * for i in `seq 0 5 59`;do (sleep ${i}; /root/reconnect-cloudflared.sh) & done; |
Misskeyのインストール
Misskeyインスタンスの作成 | Misskey Hub https://misskey-hub.net/docs/install.html を参考にインストールします。
Misskeyのセットアップ
いくつかの標準的な設定について紹介します。
webpush用のキー生成
1 2 3 |
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - &&sudo apt-get install -y nodejs sudo corepack enable npx web-push generate-vapid-keys |
オブジェクトストレージを使う
参考: https://yama2211.jp/misskey-wasabi/
https://mi.okin-jp.net/@okin_p(Misskey)
https://fi.okin-jp.net/@okin_p(Firefish)
https://si.okin-jp.net/@okin_p(Mastodon)
https://fedifile.net/@okin_p/profile/
https://twpf.jp/okin_p
http://profile.hatena.ne.jp/okin_p/
名前:おきん
やってること:面倒なことをPHPにやらせる、IPv6でなにかする、車で移動する
主なガジェット:Google Pixel 4a (5G) ,iPhone XS(ジャンク), iPad mini5, その他
種別:猫 over IPv6 run on PHP
パソコンやガジェットについて書いていく…予定。