たくさんの自由帳

AWS の Lightsail でお一人様 Misskey サーバーを立ててみた (v10)

投稿日 : | 0 日前

文字数(だいたい) : 17848

どうもこんばんわ。
ニコニコ動画版はこちらです

https://www.nicovideo.jp/watch/sm42546302

Misskey お一人様を作ってみたい!!!

いや、別にお一人様じゃなくても、ローカルタイムラインが無いインスタンスにアカウントを作れば良いのですが(LTL は流れについて行けない...)・・・
いや、、なんか、、、あの、、、、AWSとか使ってみたかったんですよ・・・(多分値段が高く付くのでもっとちゃんと考えるべきです)

さんこうにしました

thx!!!!!!!!!!

更新 2023/08/13

以下を変更しないと、一部のサーバー(インスタンス)との通信に失敗します
(リクエスト結果が403になり通信できません)

  • Ubuntu ( OS )
    • 20.04 ではなく 22.04 を選ぶ
      • そのままではMongoDBの導入に失敗します。追記しました。
  • Node.js
    • バージョンを 16 ではなく 18 を使う
      • おそらくMisskey v10でも動くはず

ひつようなもの

今回はv13ではなくv10を建てます。(めいすきー)
古いので最新版を建てたい人からしたらあんまり参考にならないと思う(https化くらい?同じなの)

  • VPS
    • AWS Lightsail を使います
    • 後述しますが、もしかしたら国産 VPSとか他の方が使っているVPSを選ぶべきかもしれません・・・もしくはEC2
    • 1コアCPU / 1GB RAM / 40GB SSD にしました
  • ドメイン
    • サブドメインを使います
      • diary.negitoro.dev
    • Cloudflareが使えません(後述)
  • SSH クライアント
    • Tera Termなど
    • 最悪VPSに付いてくるブラウザベースのSSH クライアントでも出来なくはないと思う・・・
  • オブジェクトストレージ
    • 今回は AWS の S3
  • Mastodon / Misskey のアカウント
    • 他からアクセスできるか確認用

構成図?

Imgur

一部のサーバーと繋がらない話

Cloudflareが使えないせいなのか、はたまたAWS の Lightsail(VPS)のせいなのかよく分からないのですが、
一部のMisskeyサーバーと接続できません(知ってる限り2つくらいあります)

Imgur

おそらく相手側のサーバーがCloudflareで保護されていて、なんか私側のIP アドレスがブラックリスト入りしているっぽいんですよね?
こちらもCloudflareで保護すれば良いのかなと思いましたが、.devドメインが対応していないんですよね。Google Domains終了するし頼みますよ・・・!
というわけでVPSを変える以外で解決策が無いです。皆さんは他のVPSを使ったほうが良いかもしれません・・・

立てる

動画作ってたら何やったか忘れたのでざっくり行きます

資料です: https://github.com/mei23/memo/blob/master/misskey/Setup-Meisskey-Quick.md

Misskey をフォークする

これはカスタマイズしない場合はスキップで良いはず。
私はフロントエンドくらいはいじりたいなと思ったのでフォークすることにしました

Imgur

AWS のアカウントを用意する

用意してください。
作業用のIAMユーザーを作ったり、2段階認証にするなり、最低限のこともやっておいたほうが良いかも。

AWS Lightsail で VPS を借りる

LinuxUbuntu 20.04で行きます

Imgur

Imgur

パブリック IP アドレスを固定化する

すでに固定化した状態ですが・・・
ここから固定化が出来ます。

Imgur

アタッチしている場合は追加費用はかからないそう

HTTPS 通信で使うポートを開ける

httpsTCP443番を使うので、受け入れられるようにします。
Misskeyhttpsでないと接続できないです

Imgur

鍵ファイルを使ってSSHでログインする

ここから鍵ファイルをダウンロード出来ます。

Imgur

まずTera TermでIPアドレスを入れて...

Imgur

Lightsailに表示されているユーザー名と、先ほどダウンロードした鍵ファイルのパスをそれぞれ入れます。

Imgur

VPS の設定

テキストエディタにvimを使いますが(それしか分からん)、他のエディタが好きな場合はその都度読み替えてください。

スワップ(仮想メモリ)の設定をする

物理メモリが多い場合は多分いらないかも?
今回みたいに物理メモリが1GBしかない場合は後でやるwebpack周りでこけちゃいます
一行ずつ打ち込んでいってください。

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

次にvimで以下のファイルを編集します。

sudo vim /etc/fstab

改行して以下の行を足します。
iを押して編集モード、Escで戻れます。:wqで保存です。

/swapfile none swap sw 0 0

最後に、以下のコマンドを叩いてスワップ領域が増えていれば成功です。

free -h

こんなふうな出力があるはず

              total        used        free      shared  buff/cache   available
Mem:          929Mi       450Mi        71Mi       0.0Ki       408Mi       332Mi
Swap:         2.0Gi       174Mi       1.8Gi

パッケージの更新をする

Ubuntu ( Debian 系 )は多分aptなので、以下のコマンドを叩いて更新します。
Misskey構築に関係なく、Linuxマシンを貰ったらまずやらないといけないと思います。

sudo apt update
sudo apt upgrade

upgradeの方は、本当に実行するかどうか聞かれるので、Yを押してエンターします。

Do you want to continue? [Y/n] ←これ

もし、更新中にピンク色の怖い画面(多分 want to do about modified configuration file sshd_config? 的なメッセージ?)がでたら、矢印キーでKeepの方を選んでエンターすれば良いと思います。

Misskey 構築

Misskey 用ユーザーを作る

特に言うことはないかな

sudo adduser --disabled-password --disabled-login misskey

必要なパッケージを入れる

Node.js(MisskeyはバックエンドJavaScriptで出来ている)

curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo npm i -g pnpm

MongoDB(データベース)

sudo apt-get install gnupg
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org
sudo systemctl start mongod
sudo systemctl enable mongod

その他、ソースコードを落としてくるgitなどを入れます

sudo apt -y install redis git build-essential nginx ssl-cert letsencrypt ffmpeg

追記 2023/08/13 MongoDB が Ubuntu 22.04 でインストールできない

どうやら必要なlibssl22.04から同梱されなくなったみたい...
取りあえず入れることで回避することにします。

https://stackoverflow.com/questions/73656873

sudo wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb
sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb

ソースコードをダウンロード(git clone)してくる

まず Misskey ユーザーに切り替えて、

sudo su - misskey

ソースコードをダウンロードします。今回は自分のリポジトリのをダウンロードします
takusan_23-diaryhttps://github.com/takusan23/misskeyは各自変えてね)

git clone -b takusan_23-diary https://github.com/takusan23/misskey

クローンしたフォルダへ移動します

cd ~/misskey

コンフィグファイルをコピーして、自分の環境用に直します

cp .config/example.yml .config/default.yml
vim .config/default.yml

そしたら、urlを直して、mongodbuser/passredispassをコメントアウトします。
以下は例です。これ以降の部分はいじりません。(後でいじりますが)

# Final accessible URL seen by a user.
url: https://diary.negitoro.dev/

# Listen port
port: 3000

# Listen address (default is probably any)
# addr: '127.0.0.0'

mongodb:
  host: localhost
  port: 27017
  db: misskey
  #user: example-misskey-user
  #pass: example-misskey-pass
  #options:
  #  poolSize: 10

# Redis
redis:
  host: localhost
  port: 6379
  #family: 0 # 0=Both, 4=IPv4, 6=IPv6
  #pass: example-pass
  #prefix: example-prefix
  #db: 0

編集が終わったら保存してターミナルに戻ってきてください。
ビルドをします。

スペックが低いので、しばらく時間がかかります

NODE_ENV=production pnpm i
NODE_ENV=production pnpm build

無事成功したら、戻ります

exit

nginx の設定

Misskey ユーザーの場合は戻ってください(exit
whoamiを叩くと今誰なのかわかります。

コンフィグファイルをコピー

私もわかんないんですけど、多分シンボリックリンクを使うのが正解らしい・・・

sudo cp ~misskey/misskey/docs/examples/misskey.nginx /etc/nginx/sites-enabled/
sudo vim /etc/nginx/sites-enabled/misskey.nginx

またvimが開くので、example.tldになっている部分を自分のドメインに直します。多分二箇所ぐらいだと思う

server_name example.tldserver_name diary.negitoro.devにする感じです(自分のドメインね!)

できたら保存してターミナルに戻ってきてください。
nginxをリロードします

sudo service nginx reload

Misskey 起動

Misskey ユーザーに切り替えます

sudo su - misskey

サーバーお試し起動

次に、Misskey サーバーが起動できるか試してみます。

cd ~/misskey
pnpm start

多分アスキーアートみたいなのが出るはず。

起動できたら(listen 3000 ~)止めます
Ctrl + C同時押しでターミナルに戻ってこられるはず。

そしたらまたユーザーを戻してください

exit

自動起動の設定

Windowsのスタートアップみたいな

コンフィグを書く

と言ってもこれは全部コピーできるやつです。

sudo cp ~misskey/misskey/docs/examples/misskey.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable misskey
sudo systemctl start misskey
sudo systemctl status misskey

最後のコマンドを叩くと、さっきみたいなアスキーアート(欠けてるかも)が出ているはず。
出て無くてもログが出ていれば成功なはず。
INFO * [core boot] Welcome to Meisskey!
とか
INFO * [core boot] Meisskey v10.xxxxxxx
とか?出ていれば OK なはず

DNS の設定

IPアドレスとサブドメインを紐付けます

サブドメインのAレコードに VPS の IP アドレスを指定します

IPv6の設定が必要なのかは不明(後述するLet's Encrypt / CertbotIPv4だけでいいはず)

Google DomainsならDNSの項目で、新しいレコードを追加します。
IPv4なのでAレコードで、使いたいサブドメインと、VPSIPv4アドレスを指定します。

Imgur

こんな感じです。

Imgur

反映されるのを待つ

nslookupとかして、サブドメインからIPアドレスを引けるようになるまで待ちます
なお、Misskeyhttpsでないと接続できないらしく、まだURLを入力しても開けないはず。

SSL の設定(https でアクセスできるようにする)

Cloudflare使える場合はもっといい方法があるはず

Certbot / Let

ここから、NginxUbuntu 20を選びます。

https://certbot.eff.org/

Imgur

もし内容がおかしかったら↑が正しいです

まずはsnapというパッケージマネージャを入れます。

sudo snap install core; sudo snap refresh core

いれたら、一応既に入っているかもしれないのでcertbotを消します。
snap経由で入れないといけないので、aptとかで既に入っていれば消しちゃいます。

sudo apt remove certbot
certbot --version

certbot --versionでエラーが帰ってくれば成功(bincertbotなんて存在しねえよ!的な)

次はsnap経由でcertbotを入れます。

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

そしたらついにhttpsでアクセスできるようにnginxを構成します。
コンフィグファイルを書き換えるのですが、多分Misskeyに影響ない状態で書き換えてくれます。

sudo certbot --nginx

このコマンドを叩いた後に以下のことが聞かれます

  • メールアドレス
    • SSL証明書の更新が出来なかったら通知が来る?
      • httpsでアクセスできなくなってしまうのでメールで教えてくれるそう
  • 利用規約に同意するか
  • ニュースレターを希望するか(No でいいはず)
  • httpsにしたいドメインの最終確認(nginxのコンフィグファイルからドメインを探してくれるそう)

Imgur

Imgur

キーボードぽちぽちしてたらhttps化作業終わった。神だろこれ

自動更新ができるか確認

どうやら自動的に自動更新のcron ?が設定されているらしく、自前でcronをスケジュールしておく必要も無いらしい。
ただ、成功するかはわからないので、お試し更新機能を使い本当に更新できるか試します。

sudo certbot renew --dry-run

--dry-runしないと更新されてしまう(そもそも有効期限が十分残っていると更新できない)

Imgur

成功するとこんな感じになるはず。

Misskey 開ける?

https://ドメインで開けるはず。

Imgur

ちゃんとhttpsで、鍵マークも付いています!!!!

一番乗りでアカウントを作ると管理者ユーザーとしてマークされ(コンフィグで変更可能?)、管理画面に入れます。

Imgur

オブジェクトストレージの設定

Misskeyの投稿のメディアは、後からURLを変更できないため、やるなら建てた今しかない!
デフォルトではVPSのストレージに書き込まれますが、VPSのストレージは高いのと拡張が面倒なのでオブジェクトストレージを使うのが良いはず(容量増やし放題だけどお金もかかるよ)。

参考:
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html#step4-add-bucket-policy-make-content-public

AWS の S3 を使います

ただ、これちょっと高い(なんか転送量とリクエスト回数に課金されるややこしい)ので、S3 互換サービスを使うのも考えたほうが良さそう。
今回は今後のことを考え、S3 互換サービスに移行できるような設計にもしてみます。

というわけでS3のバケットを作ります。
名前とかはよしなに...

Imgur

下にスクロールして、パブリックアクセスの項目で外からアクセスできるようにします。
まだバケットポリシーを書いていないのでアクセスは出来ないと思いますが...

Imgur

これで作成します。

バケットポリシー を書く

作ったバケットを開いて、アクセス許可に進み、バケットポリシーを編集します

Imgur

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::作ったバケットの名前/*"
            ]
        }
    ]
}

API でアクセスするため、キーを IAM で払い出してもらう

S3APIで操作するには、IAMで認可情報を作って貰う必要があります。

IAM ユーザーの作成

IAMの画面を開いて、適当にユーザーを作ります、

Imgur

次の画面で出てくる権限のところでは、AmazonS3FullAccessをつけておけば良さそう

Imgur

アクセスキーを払い出してもらう

作ったIAM ユーザーの詳細を開いて、アクセスキーの作成をします

Imgur

Misskeyで必要なのは一番下のその他の項目のやつです。

Imgur

2つ出てくると思います。

Imgur

オブジェクトストレージの設定をコンフィグに記述する

v13 では Web UI からオブジェクトストレージの設定ができます

まずMisskeyを止めて

sudo systemctl stop misskey

Misskeyユーザーに切り替えて、コンフィグを更新します。

sudo su - misskey
cd ~/misskey
vim .config/default.yml

そしたら、ファイルシステムに書き込む設定をコメントアウト(#でコメントアウトできる)して、
ちょっと下にあるオブジェクトストレージ用の設定を書きます。


### drive ###
#drive:
#  storage: 'fs' # ここをコメントアウトする

# OR
#drive:
#  storage: 'db'

# OR
drive:
  storage: 'minio' # ここは買えなくて良いはず
  bucket: 'xxxxxxxx' # バケット名です
  prefix: 'files' # フォルダを作るなら
  baseUrl: 'https://diary.negitoro.dev/objectstorage' # nginx のリバースプロキシする URL
  config:
    endPoint: '' # S3 の場合は空文字。S3 互換サービスなら入れる
    region: 'ap-northeast-1' # バケットのリージョン
    useSSL: true
    accessKey: 'xxxx' # IAM ユーザーのアクセスキーのアクセスキー
    secretKey: 'xxxx' # IAM ユーザーのアクセスキーのシークレットキー
    useProxy: true
    setPublicRead: false
    s3ForcePathStyle: true

もし、リバースプロキシしない場合(S3の公開URLをそのまま使う場合)は、baseUrlhttps://s3.ap-northeast-1.amazonaws.com/バケット名になるはずです。
リバースプロキシが必要かどうかはS3以外を使う予定があるかどうかで決まります。詳しくは ↓ で。

CloudFrontを経由するとか、後述するnginxを経由する設計の場合はbaseUrlが変わるはず

後はターミナルを閉じて、おまじない程度にビルドしておきました(必要かどうかは不明)

NODE_ENV=production pnpm build
exit

Misskey起動させます

sudo systemctl start misskey

メディアのURLをリバースプロキシする(nginx を経由するようにする)

先述の通りS3以外のオブジェクトストレージに引っ越しできるように、メディアのURLではS3外部公開用URLを使わないようにします。
代わりに、メディアのURLを用意して(https://ドメイン/objectstorage/xxxxx)、/objectstorageに来たリクエストはすべてnginxを使いS3のURLに向き先を変えるようにします(リバースプロキシ)

クライアント ( PC / スマホ 等 )

↓ リクエスト

nginx が待ち受ける

↓

もし URL が /objectstorage だったら ---> [S3 の外部公開用URLへアクセス] 
それ以外 / だったら ---> [Misskey サーバー]

本当(というか他のサーバーだと)はオブジェクトストレージ用のドメイン、files.ドメインみたいなサブドメインを用意して、S3 + CloudFrontとかで公開して、CNAMECloudFrontを指すようにするのが良いかもしれないです。
(何言ってるか分からんと思うけど・・・)

nginx のコンフィグをいじる

コンフィグファイルを編集します。

sudo vim sudo cat /etc/nginx/sites-enabled/misskey.nginx

そしたら、/objectstorageに来たリクエストはS3のURLへリバースプロキシするようにします。
URL は都度買えてください。

よく知らないけど、location /の上に書いておけばよいのかな?

nginx server { } 443 の方です


# Media file storage is AWS S3.
# Use nginx proxy in AWS S3 to Internet transfer.
# thats because, Cant edit media file url.
location /objectstorage {
    proxy_pass https://s3.ap-northeast-1.amazonaws.com/バケット名;
}

# Proxy to Node
location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;

Imgur

そしたら保存してターミナルに戻って、nginxへ適用します。

sudo systemctl restart nginx

動作確認

実際にMisskeyのドライブにファイルを投げて、S3に上がっていれば成功です。
URL が /objectstorageで始まっていればうまく行ってます!!!

Imgur

Imgur

Imgur

お疲れ様でした!!!

多分これで構築は良いはず。

あとは適当にメモを残しておきます。

おすすめ設定?

管理画面から出来ます

  • ユーザー登録の受付を停止する を ON
    • お一人様なので
  • リモートのファイルをキャッシュする は OFF
    • 多分デフォルト OFF

Misskey サーバーの 停止 開始 再起動

  • 開始
    • sudo systemctl start misskey
  • 停止
    • sudo systemctl stop misskey
  • 再起動
    • sudo systemctl restart misskey

本体更新方法

フォークしたので本家に追従するにはまずgit rebaseとかやって更新を取り込む必要がある
こっちに書いた

https://github.com/takusan23/misskey#変更を本番に入れる本番更新手順

データベースのバックアップ

データベースを吹っ飛ばすと同じドメインでサーバーを建てられないらしい?ので、定期的にやる必要があります

まずはMisskeyを止めます

sudo systemctl stop misskey

次に、Misskeyで利用しているMongoDBのバックアップを取ります。
今回はホームディレクトリにバックアップしたデータを保存するようにしました。dumpフォルダが出来ます。
(ホームディレクトリは ~←チルダ で移動できます)

cd ~
mongodump -o "./dump"

**次に、PowerShell を開き(SSH クライアントとは別に)**以下のコマンドを叩いて手元の Windows マシンへバックアップデータを転送します。
scpコマンドです。

scp -i {鍵のパス} -r {リモートのユーザー名}@{IPアドレス}:{フォルダのパス} {ローカルのWindowsマシンの保存先パス}

例です

scp -i C:\Users\takusan23\key.pem -r ubuntu@000.000.000.000:~/dump C:\Users\takusan23\misskey_backup\

これで、ユーザー名のフォルダのところにあるはず(C:\Users\takusan23 みたいな)

後はこれをzipとかにして安全なところに保存しておきます( Google Drive とか? AWS S3 Glacier とか? )

Misskey をカスタマイズしたい(VPS ではなく、手元の Windows で Misskey を構築したい)

書いた。v10なのでv13だと直さないと使えない

https://github.com/takusan23/misskey#手元の開発環境構築

2023/08/06 追記 Cloudflare を利用して Misskey サーバーを保護する?

CertbotHTTPS通信できるようにしましたが、Misskey的にはCloudflareSSL (HTTPS)するのが良いらしい。

あらかじめ、Cloudflareにドメインを移管しておく必要があります。(いやCloudflare DNSを使えるようしておく必要があります)

まずはCloudflare ダッシュボードからWebサイトを選び、稼働しているドメインを選びます。
そしてSSL/TLSを押して、概要暗号化モードフルにします。不具合の原因になるみたい。

Imgur

次に、DNS>レコードと進み、MisskeyIPアドレスのレコードがプロキシ済みかどうか確認します。
プロキシ済みじゃない場合はしてください。雲のアイコンがオレンジ色になれば良いはず。
これで、Misskey サーバーとの通信の前にCloudflareが入るようになります。

[ブラウザ (PC / スマホ) ] <---> [Cloudflare] <---> [Misskey サーバー (VPS)]

さっきのSSL/TLSの設定はこの間に入るCloudflareの設定のために必要でした。

次にVPSへログインします。
まずはMisskeyを止めて、お好みでバックアップを取ってください。

sudo systemctl stop misskey

次にnginxのコンフィグを開いて、Let's Encryptではなく、自己署名証明書をセットします。

sudo vim /etc/nginx/sites-enabled/misskey.nginx
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name diary.negitoro.dev;
    ssl_session_cache shared:ssl_session_cache:10m;

    # Self-Certificate
    ssl_certificate     /etc/ssl/certs/ssl-cert-snakeoil.pem;
    ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;

    # Disbaled Certbot ( thats because, use Cloudflare )
    # To use Debian/Ubuntu's self-signed certificate (For testing or before issuing a certificate)
    # ssl_certificate /etc/letsencrypt/live/diary.negitoro.dev/fullchain.pem; # managed by Certbot
    # ssl_certificate_key /etc/letsencrypt/live/diary.negitoro.dev/privkey.pem; # managed by Certbot

保存して、Misskeyを起動し、ブラウザで開けるか確認します。

sudo systemctl start misskey

成功していれば、リクエストのレスポンスヘッダーにCloudflare関連の値が入るようになっているはずです。
Imgur

そしたらもう、今使っているLet's Encryptの証明書は不要になるので、消してしまいます。

sudo certbot revoke --cert-path /etc/letsencrypt/live/ドメイン名/cert.pem
Would you like to delete the certificate(s) you just revoked, along with all
earlier and later versions of the certificate?

Y

WARNING: Before continuing, ensure that the listed certificates are not being
used by any installed server software (e.g. Apache, nginx, mail servers).
Deleting a certificate that is still being used will cause the server software
to stop working. See https://certbot.org/deleting-certs for information on
deleting certificates safely.

Are you sure you want to delete the above certificate(s)?

Y

Deleted all files relating to certificate ドメイン名.が表示されれば完了です。