Connection: via IPv4
Your IP : 3.141.29.202
In English
Categories: Cloudflare

(編集中)グローバル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の使い分けイメージです。

  1. 外からMisskey宛てに来る通信は、インターネットから見たときにはCloudflareが待ち受けています。そして実際の通信はTunnel(一般的に言うリバースプロキシ+VPN)を通じてMisskeyの待ち受けポートに届けられます。 これにより、サーバー自身へ直接アクセスできる必要がなくなり、一般的なクライアントとしてのインターネット疎通性があればいいということになります。
  2. Misskeyから他インスタンスなどインターネット上のサーバーへのアクセスは、Warp/Cloudflare Zero Trust(一般的にいうVPN)を通じてCloudflare経由で行われます。VPNなのでこのサーバーからの通信はインターネットから見るとCloudflareから行われているように見えます。

つまり完成した構成 では、インターネットからみて完全にCloudflareのIPから通信を行うサーバーになることができます。

操作手順

サーバーの事前準備

  1. インストール済みのパッケージを最新化する
    sudo apt update
    sudo apt upgrade -y
  2. 必要そうなパッケージを入れる
    # とりあえず入れておくと便利なパッケージ
    sudo apt install software-properties-common build-essential screen nano
    # Proxyする用のnginx
    sudo apt install nginx
    # letencryptで証明書をとりたいときのためのパッケージ
    sudo apt install certbot python3-certbot-dns-cloudflare
    # NASにデータを置きたいときなど
    sudo apt install cifs-utils
  3. (もしあれば)Snap版のdockerを削除する
    sudo snap remove docker
  4. dockerをインストールする。(参照: https://docs.docker.com/engine/install/ubuntu/)
    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
    
    # 動作確認
    sudo docker version
    sudo 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と共存するために必要な設定をします

 

  1. Cloudflareの管理画面トップ>Zero Trust か https://one.dash.cloudflare.com/から Cloudflare Zero Trustの管理画面に入る。
  2. 左のメニューからSettingsを選ぶ
  3. Generalを選ぶ
    1. WIP
  4. Networkを選ぶ
    1. TLS decryptionとAV inspectionをDisabledにする
  5. Settingsに戻って、WARP Clientを選ぶ
    1. Device enrollment>Device enrollment permissionsのManageを選ぶ
      1. ルール一覧の画面になるので Policies>Add a ruleを選ぶ
        1. Rule Nameを決め、 Rule ActionをService Authにし、 Include>SelectorをAny Access Service Authにする
        2. Saveを選び保存する ルール一覧の画面に戻る
      2. Saveを選び保存する 右側に以下のような表示が出ることを確認する
      3. Back to SettingでWARP Clientに戻る
    2. Device settings>Profile settings>Default>Configureを選ぶ ※画像にはServerがあるが、初期状態ではDefaultのみがある
    3. Captive portal detectionをDisabledにする
    4. Auto connectをEnabledにする
    5. Split Tunnels>Manageを選ぶ
        1. 以下のドメインを除外設定する *.argotunnel.com
        2. Selectorでdomainを、Valueで上記のドメインを入れて、Saveすると追加できる
        3. 最終的に右のリストに以下のように追加できていれば良い
        4. 追加できたら、左上のBack to profileで一つ前の画面に戻る
      1. Save profileを押して保存する

 

Cloudflare Warpの設定

Misskeyインスタンスを動かすサーバーがインターネットと通信する経路をCloudflare経由にします

  1. Warpクライアントのレポジトリを設定する(参照: https://pkg.cloudflareclient.com/install)
    # 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
  2. mdm.xmlを作る(参照: Managed deployment · Cloudflare Zero Trust docs )
    1. mdm.xmlに必要なService Tokenを取得する
      1. Cloudflare Zero Trustの管理画面からAccess > Service Authを選ぶ
      2. Create Service Tokenを選び、Service Tokenを作成する 名前と有効期限(無期限も可)を決める
      3. ServiceTokenとしてclient ID(.accessで終わる)とclient secretが表示される(黒塗りのところ)ので、メモを取る client secretは一度しか表示されないので、もしメモを取り損ねたら慌てず消して作り直す
    2. mdm.xmlを置くディレクトリを作成する
      sudo mkdir -p /var/lib/cloudflare-warp/
    3. 以下の内容を取得したService Tokenなどで埋めて、/var/lib/cloudflare-warp/mdm.xmlを作成する
      <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>
  3. Warpクライアントをインストールする
    sudo apt install cloudflare-warp
  4. warp-cliで接続する
    warp-cli connect
  5. 接続元IPがCloudflareになっていることを確かめる
    curl https://ipinfo.io/

Cloudflare Tunnelの設定

Tunnelを設定する

Cloudflare Tunnel・Warpクライアントの瞬断対応

Cloudflare Tunnelが不通になったときにcloudflaredを再起動するスクリプトを設置し、5秒に1度程度実行するように設定します。

cloudflared起因でサイトがダウンしたときに活を入れるのスクリプトを良い感じの場所に設置してcrontabやsystemd-timerで定期実行します。このスクリプトはsystemdを操作するのでrootユーザーで再起動。

crontabに設定する場合の例です。

* * * * *   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用のキー生成

参考: https://www.npmjs.com/package/web-push
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/

This post was last modified on 2023年12月9日 11:23 PM

Recent Posts

中古のM1 Macbook Airを買った話

つい先日、中古のMacbook…

3日 ago

買って良かったもの 10Gtek USB コンソールケーブル Type-C

最近Macbookを買ったので…

3週間 ago

media-proxy-rsをビルド・実行する

media-proxy-rsを…

3か月 ago

[メモ]NetboxでEntra ID認証(SSO)[編集中]

[メモ]JellyfinでEn…

3か月 ago

ものぐさのためのXbox Game Pass Ultimate更新節約術

ものぐさ節約家のためのXbox…

3か月 ago

This website uses cookies.