宅内Misskeyサーバーを立てよう
MisskeyやFirefishの個人鯖立ててみたいけどいきなりweb上でやるの怖い!そうだ!宅内鯖に入れて宅内だけで通信しよう!!
サーバーを立てる所からの個人的メモです~
Misskey公式サイト
MisskeyはTypeScriptという言語で組まれた分散型SNSのソフトウェアです。各サーバー管理者さん(だいたいは個人)が自分のサーバーマシンにMisskeyをインストールして公開してるのを使う感じになっています。
ActivityPubプロトコルという通信のお約束事を使用しているので、同じプロトコルを採用している他のSNSのマストドンやPleromaなどとも相互にフォローしたりされたりができます。大手だとTumblrやmeta社のThreadsも対応予定だとか(ただ自分のサービスへは顧客を取り込みにくいので実装いつになるのかしらね)
サーバー準備
サーバーマシンの選定
どこで動かすかでパフォーマンスも変わってくるため、どこにMisskeyをインストールするかを考えます。
- クラウドサーバーを契約する → サーバーの数など柔軟に対応できる。お財布と相談
- VPSを契約する → 契約にも寄るけれど小規模向け。コスト低め。お財布と相談
- 宅内サーバーを使用する → 趣味の域 インターネット上へ公開する場合には固定IPを取るかDDNSで公開しセキュリティ関連は全部自己責任。機器の性能はお財布と相談
VPSに置こうと思ったのですがメモリを増やすとコストが上がるのと、個人的な遊びの面が強いので宅内鯖に入れて遊ぶことにしました。ベアボーンCeleron4コア/16GBを35,000円ぐらいで組んだので電気代込みで概算3年使って1,100円/月ぐらい、5年で850円/月ぐらい、VPS鯖の仮想4コア/4GBが1,500円~3,500円/月なのでサポート無しで遊ぶには良い感じ? Raspberry Pie4ならCPUはスペック落ちるにしろ4コア8GB 1.5万円~ぐらいで始められるかも
こちらの記事で設定したベアボーン(Intel NUC Celeron4コア+メモリ16GB/500GB)にインストールしていきます。
VirtualBoxなどの仮想マシンをWindows上などで動かしても良いのかもですがMisskeyは最低インストールにメモリ4GBは欲しい(2GBならスワップ領域確保)らしいので、結構PCスペックがいる予感
OSのインストール・準備
Ubuntu Server 22.04LTSをUSB経由でインストールしました。Rocky Linuxとかのが軽いかもですがDebian系を普段触ってるので…
インストール中のメニューで言語:English/キーボード:Japaneseにしておきます。またOpenSSHのインストールにもチェックを入れておきます。ネットワーク設定もインストール中に設定し、DHCP4自動割り当てにしておきます。
最初にやること
有線でインターネットに接続できたら各種アップデートとタイムゾーン設定を行います。
sudo apt update sudo apt -y upgrade sudo timedatectl set-timezone 'Asia/Tokyo'
ファイヤーウォールの設定
Ubuntu serverにはファイヤーウォールのuwsがプリインストールされています。uwsでパケットフィルタを行います。SSH用の22番ポートとNginxでのhttp, https接続を開放します。
sudo ufw allow 22 sudo ufw allow 'Nginx Full' sudo ufw enable
外部公開する際にはこれに加えてssh接続に接続元IPによるアクセス制限などを設定します。まだ行わないのでいずれまとめる予定
IP固定設定
sudo vi /etc/netplan/99-config.yaml
とコマンド入力して下記を保存し、sudo netplan apply
コマンドで有効にしてローカルIPを「192.168.10.56」(範囲内でお好きに)へ固定設定を行います。またip a
コマンドでイーサネットアダプタのMACアドレスを確認し、ルータ側でも静的ルーティングでIPを固定しておきます。
network: version: 2 ethernets: eno1: dhcp4: false dhcp6: false addresses: [192.168.10.56/24] routes: - to: default via: 192.168.10.1 nameservers: addresses: [192.168.10.1, 8.8.8.8]
これで同じLAN上にいる他のWindowsマシンなどから「ssh ユーザー名@192.168.10.56」でSSH接続にてリモート操作出来るようになりました。
ここから先はWindowsマシンからSSHリモート接続で弄ります。
SSH接続の設定
OpenSSHサーバーのインストールはOSインストール時にチェックを入れて行ったため省略。
秘密鍵と公開鍵の作成
ed25519アルゴリズムで公開鍵と秘密鍵を生成します。
# 公開鍵と秘密鍵を生成 ssh-keygen -t ed25519 # ディレクトリ移動、公開鍵ファイルをauthorized_keysへ追記、権限の変更 cd /home/ユーザー名/.ssh/ sudo cat id_ed25519.pub >> authorized_keys sudo chmod 600 authorized_keys
秘密鍵の内容をコピーしてWindowsマシンの「C:\Users\(Windowsのユーザー名)\.ssh」(フォルダがなければ作成)にid_ubuntuなどの名前で保存し、Ubuntu server上の秘密鍵ファイルは削除します。
「C:\Users\(Windowsのユーザー名)\.ssh\config」ファイルを編集し下記を追記
Host ubuntu HostName 192.168.10.56 User ユーザー名 Port 22 IdentityFile ~/.ssh/id_ubuntu
これでssh ubuntu
コマンドをコマンドプロンプトなどで入力すると公開鍵認証でSSH接続がすぐにできるようになります。
さらにパスワードでのログイン認証を無効にし、公開鍵のみでの接続に設定を変更します。Ubuntu serverログイン下で下記コマンドを入力し、テキストエディタvimでssh設定ファイルを開きます
# ssh接続の設定を編集 sudo vi /etc/ssh/sshd_config
該当のコメント行の#を外しPasswordAuthentication no
, PubkeyAuthentication yes
にして保存します。
WinSCPでSFTP接続
GUIでroot権限でファイルを操作したいのでWinSCPをWindowsマシンにインストールします。
上記で生成した秘密鍵をPuttygen(WinSCPに付属するソフト)でインポートし、.ppk形式で保存します。
Ubuntu server上でsudo visudo
コマンドで開いたテキストファイルに下記を追記しctrl+s
+ctrl+x
で保存してsudo権限を付与
ユーザー名 ALL=NOPASSWD: /usr/lib/openssh/sftp-server
WinSCPの「設定」→「SFTP」の「SFTPサーバー」に「sudo /usr/lib/openssh/sftp-server」を貼り付け、SSHの項目で秘密鍵の.ppkファイルを読み込むとroot権限でSFTP接続できるようになります。
ファイルのアップロード/ダウンロードやパーミッションの変更がエクスプローラー風の画面から簡単にできるようになりました。
Dockerインストール
アプリを環境ごとまるっと簡単に導入できるDockerをインストールします。公式サイトのマニュアル通りに
sudo apt-get update sudo apt-get install ca-certificates curl gnupg
# 公式GPCキーを取得 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg
# リポジトリのセットアップ echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker EngineやDocker Composeをインストール sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# hello-worldを走らせてテスト sudo docker run hello-world
(終わったらsudo docker rm コンテナID
で削除)
これでMisskeyをインストールする準備は完了です。やった~。
Misskeyのインストール
検索強化のためのMeilisearchも導入しようかと思ったのですが結構エンジンの形態素解析がいまいちらしい("あんぱんまん"を"あんぱん"でヒットできかったり。素のSQL文での検索のが正確)そうなので一旦断念。Meilisearch関連のコメントアウトはそのままにしてインストールします。
Misskey本体のインストール
Misskey Hub – Misskeyサーバーの作成を参考にDocker Composeでインストールします。
自分は実際にはMisskey公式Githubからforkした自分のリポジトリを指定していますが、公式をそのまま使うならgithubのURLはそのままでOK
git clone -b master https://github.com/misskey-dev/misskey.git cd misskey git checkout master
# 設定ファイルのサンプルをコピー cp .config/docker_example.yml .config/default.yml cp .config/docker_example.env .config/docker.env cp ./docker-compose.yml.example ./docker-compose.yml
公式の説明通りに設定ファイルを編集します。個人的な変更箇所↓
default.yml
URLとポート番号(使ってないポートを適当に)、データベース名とデータベースのユーザー名とパスワードを変更
url: https://misskey.local/ port: 49514 db: misskeydb # Auth user: データベースのユーザー名 pass: データベースのパスワード
docker.env
データベースのデータベース名とユーザー名、パスワード
docker-compose.yml
上記に合わせてportを「49514:49514」へ
DockerでMisskeyをビルド
設定ファイルを書き換えたらビルドします。わくわく。
sudo docker compose build sudo docker compose run --rm web pnpm run init
Misskeyを動かします
# Misskeyを起動 sudo docker compose up -d
無事起動しました🎊が、まだアプリケーションが動いただけでブラウザからアクセスできないので以下でその設定を行います。
オレオレ認証局でオレオレ証明書(自己証明書)の発行
暗号化されたhttps通信を行うためには通常サーバー証明書が必要です。本番環境だと無料のLet’s Encryptを使用する予定ですが宅内鯖ではどうしようもないのでオレオレ認証局を作ってSAN付きのオレオレ証明書を発行します。
# プライベートキー生成 openssl genrsa -out rootCA.key 2048 # ルート証明書生成 openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt
上記でルート証明書を作成し、下記でサーバーの証明書を発行
# 証明書署名要求(CSR)の設定ファイルを作成 cat > misskey.local.csr.cnf <<EOF [req] default_bits = 2048 prompt = no default_md = sha256 distinguished_name = dn [dn] C=JP ST=Tokyo L=Shinjuku O=myhome OU=home [email protected] CN = misskey.local EOF # SANの設定ファイルを作成 cat > v3.ext <<EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = misskey.local EOF # CSRを生成 openssl req -new -sha256 -nodes -out misskey.local.csr -newkey rsa:2048 -keyout misskey.local.key -config <( cat misskey.local.csr.cnf ) # 証明書を生成 openssl x509 -req -in misskey.local.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out misskey.local.crt -days 500 -sha256 -extfile v3.ext
できたルート証明書(rootCA.crt)をWindowsマシンへコピーしChromeの「設定→設定とセキュリティ」から読み込みます。
またmisskey.local.crt、misskey.local.keyは各証明書はUbuntu server上の
/etc/ssl/certs/misskey.local.crt
/etc/ssl/private/misskey.local.key
にそれぞれ移動させます。
Nginxの設定
Nginxはwebサーバーを立ててくれるアプリケーションです。http://misskey.local/にアクセスされたらmisskeyアプリ(ベアボーン内部のhttp://127.0.0.1:49514/)に飛ばすように設定します。サーバー証明書の場所もここに記入します。
/etc/nginx/conf.d/misskey.conf
を作成しMisskey Hub – Nginxの設定を参考に編集
# For 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 misskey.local; location / { return 301 https://$server_name$request_uri; } } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name misskey.local; ssl_session_timeout 1d; ssl_session_cache shared:ssl_session_cache:10m; ssl_session_tickets off; ssl_certificate /etc/ssl/certs/misskey.local.crt; ssl_certificate_key /etc/ssl/private/misskey.local.key; # SSL protocol settings 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; # Change to your upload limit client_max_body_size 80m; # Proxy to Node location / { proxy_pass http://127.0.0.1:49514; proxy_set_header Host $host; proxy_http_version 1.1; proxy_redirect off; # If it's behind another reverse proxy or CDN, remove the following. 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; # For WebSocket proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; # Cache settings proxy_cache cache1; proxy_cache_lock on; proxy_cache_use_stale updating; proxy_force_ranges on; add_header X-Cache $upstream_cache_status; } }
できたら下記コマンドで反映
# 設定を反映 sudo nginx -t sudo systemctl reload nginx
http://misskey.local/にWindowsマシンのChromeからアクセスして成功していれば管理者登録画面が出てきます。
自分のforkしたリポジトリとわかるようにMisskeyの文字の前に☆を追加していました。ちゃんと反映しています。SSL証明書もちゃんと働いているため警告が出ません。
YATTA~~~!!!!
Misskeyインストール後
管理者登録後
管理者登録もできたので投稿してみました。
画像ファイルがアップロードできなくて困ったのですが./misskey/files/フォルダの権限の問題でした。とりあえずパーミッション777にすることで可能になりました。
見た目の変更してみたりコントロールパネルを色々弄って遊んでみます。
今後の予定
・Firefishも同様にDockerでインストールして相互にフォローしてみる
・おひとりさま用サーバーのため、要らない機能のオミットなど改造
・こちらを参考にPGroongaをインストールし日本語全文検索導入
・Ubuntu自動アプデ設定
・停電・落雷対策
・インターネット上に公開するためのセキュリティ対策(fail2banやIP制限etc)、DDNS登録、CDNetc
あたりをぼちぼちやっていきたいです。何かあればまたメモしていきます~