今更ながらMisskeyインスタンスを構築してみる(DockerCompose+Cloudflare)
今更w
はい、本当に今更ですね。
Misskeyについては解説不要でしょう!!
目指すもの
ホストIP秘匿・なるたけ無料
用意するもの
- Cloudflareアカウント
- ドメイン(f5.siみたいなやつでOK)
- サーバー(VPSなど)
参考にするもの
です。いずれも公式
環境
適当な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
でファイルを作成し以下の内容を記述
# 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