🎉

今更ながらMisskeyインスタンスを構築してみる(DockerCompose+Cloudflare)

2024/11/01に公開

今更w

はい、本当に今更ですね。
Misskeyについては解説不要でしょう!!

目指すもの

ホストIP秘匿・なるたけ無料

用意するもの

  • Cloudflareアカウント
  • ドメイン(f5.siみたいなやつでOK)
  • サーバー(VPSなど)

参考にするもの

https://misskey-hub.net/ja/docs/for-admin/install/guides/docker/

https://misskey-hub.net/ja/docs/for-admin/install/resources/nginx/

です。いずれも公式

環境

適当なVPS(今回はAgamesのやつ)
CPUはAMD Ryzen 9 7900(4vCPU),メモリは10GBです。
OSはUbuntu 24.04Lts
これで月3500程度なので遊ぶだけなら十分。

Dockerで

今回はバッシュスクリプトではなくDockerでやっていきます。
いろいろ試してこれがよかったので。(Dockerインストールはこの記事では割愛)

リポジトリをクローン

💻ターミナル
git clone -b master https://github.com/misskey-dev/misskey.git
cd misskey
git checkout master

ブランチは絶対にmasterにしましょう。そのほかは結構不安定です。

設定ファイルの編集

まず設定のテンプレートをコピーします。

💻ターミナル
cp .config/docker_example.yml .config/default.yml
cp .config/docker_example.env .config/docker.env
cp ./compose_example.yml ./compose.yml

そして各ファイルを自分の環境に合わせていじりましょう。私はdefault.yml内のurlの値とportを変えました。
ポートに限っては変えなくてもいいです。私はほかのサービスと被っていたためです。
あとcompose.yml内のPortも変えます。じゃないとアクセスできません。

ビルド

次にイメージのビルドです。私の環境では1分くらいで終わりました。CPUの性能によって差異はありそうですが。

💻ターミナル
sudo docker compose build
sudo docker compose run --rm web pnpm run init

立ち上げ

いよいよ立ち上げ!!

💻ターミナル
sudo docker compose up -d

もし可能だったらhttp://<サーバーIP>:<ポート>にアクセスして表示されるか見てみてください。

nginxの設定

今回はリバースプロキシとしてnginxを使用します。

nginxのインストール

💻ターミナル
sudo apt install nginx

SSL証明書を取得

Cloudflareを開いて使用するドメインの管理画面にいきます。
そしたらサイドバーのSSL/TLSからオリジンサーバーを開きます。

オリジン証明書の「証明書を作成」をクリック

すべて初期設定のまま「次へ」をクリック

次の画面に証明書と秘密鍵があるのでそれぞれをサーバーに保存します。今回は証明書を/etc/nginx/ssl/fullchain.pemに、秘密鍵を/etc/nginx/ssl/privkey.pemに保存しました。
保存方法はそれぞれnanoでファイルを作ってそれにコピペです。

もちろん例に過ぎないので保存先などについてはお任せします。

設定ファイルの作成

💻ターミナル
sudo nano /etc/nginx/sites-available/misskey.conf

でファイルを作成し以下の内容を記述

misskey.conf
# WebSocket対応
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

# キャッシュ設定
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=cache1:16m max_size=1g inactive=720m use_temp_path=off;

server {
    listen 80;
    listen [::]:80;
    server_name example.com;

    # Let's EncryptでのSSL証明書検証用
    root /var/www/html;
    location /.well-known/acme-challenge/ { allow all; }
    location /.well-known/pki-validation/ { allow all; }
    location / { return 301 https://$server_name$request_uri; }
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name example.org;

    ssl_session_timeout 1d;
    ssl_session_cache shared:ssl_session_cache:10m;
    ssl_session_tickets off;

    # 証明書パス
    ssl_certificate     /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    # SSLプロトコル設定
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_stapling on;
    ssl_stapling_verify on;

    # アップロード制限の設定
    client_max_body_size 80m;

    # リバースプロキシ設定
    location / {
        proxy_pass http://127.0.0.1:<ポート>;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_redirect off;

        # WebSocket対応
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        # リアルIPの取得云々
        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 https;

        # キャッシュ設定
        proxy_cache cache1;
        proxy_cache_lock on;
        proxy_cache_use_stale updating;
        proxy_force_ranges on;
        add_header X-Cache $upstream_cache_status;
    }
}

example.orgとかポート番号とかはご自身の環境に合わせ変更してください。
あとはシンボリックリンクを作成して設定にエラーがないか確認して、起動します。

💻ターミナル
sudo ln -s /etc/nginx/sites-available/misskey.conf /etc/nginx/sites-enabled/misskey.conf
sudo nginx -t
sudo systemctl start nginx.service

Cloudflareの設定

Aレコの設定

IPv4アドレスとプロキシにチェックを入れましょう。

SSL/TLSモードの変更

サイドバーのSSL/TLS→概要の暗号化の設定

カスタムSSL/TLSから「フル(厳密)」にして保存。

これでOK。

キャッシュルール

サイドバーのCaching→Cachie Rulesを開いて

「+ルールを作成」をクリックする。

ルール名を「api」(例)にして、その下のフィールドを「URIパス」に、値を「/api/*」にする。
さらにその下にあるキャッシュの適格性を「キャッシュをバイパスする」に設定。
終わったら「展開」をクリック。

こうなったらOK。

ポートなど

ufwなどを使ってポートを開放したり閉じたりする。私は80番・443番以外は使わないためその二つを許可にする。

💻ターミナル
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
sudo ufw reload

こんな感じ。sshは基本閉じておきましょう。アタックされまくります。

アクセス

さぁアクセスできるでしょうか?

なんもエラーが起きないと良いですね。

以上

以上です。Misskeyインスタンスを立てて公開しました。
普段私はリバースプロキシとか触らないのですごく困りましたよ。

解説がわかりにくい点などあると思いますが、、ご容赦いただきますようお願いいたします。
なにか不明点などございましたらコメントとか、、してください。答えられるものは答えるので

Discussion