宅内Misskeyサーバーを立てよう

MisskeyやFirefishの個人鯖立ててみたいけどいきなりweb上でやるの怖い!そうだ!宅内鯖に入れて宅内だけで通信しよう!!

イメージ図(??)

サーバーを立てる所からの個人的メモです~

続きを読む

Misskey公式サイト

MisskeyはTypeScriptという言語で組まれた分散型SNSのソフトウェアです。各サーバー管理者さん(だいたいは個人)が自分のサーバーマシンにMisskeyをインストールして公開してるのを使う感じになっています。

GitHub – Misskey

Misskey Hub – 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 noPubkeyAuthentication 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

あたりをぼちぼちやっていきたいです。何かあればまたメモしていきます~

Linux,Ubuntu,Misskey,自宅サーバー