LoginSignup
1
0

Raspberry PiにMisskeyサーバーを建てる

Posted at

前置き

Raspberry Pi に Misskey おひとりさまサーバーを建ててみました。同じような記事は各所にあると思いますが、備忘も兼ねて記録していきたいと思います。(2024-03-24時点の手順)

なんだか見直したらapt installで記述が重複してたりしてますが、実際に打ち込んだコマンドを記述していきたいと思います。再セットアップの機会があれば更新していきます。

なお、Raspberry Piの初期セットアップはこちらの手順で実施済みとします(特に、ファイアウォール)。また、sudoの記述は省略します。

建設予定地の準備

  1. お名前.com(など)で、ドメインをゲットする。サーバーは申し込まない
  2. MyDNS.JP(など)で、アカウントを作成。サーバーは申し込まない
  3. お名前.comのほうに、ネームサーバー情報を登録
  4. MyDNS.JP に対し、下記で定期的にIPアドレスを通知
$ crontab -e
---
// 毎時0分に通知する。
0 */1 * * * /usr/bin/wget -O- 'https://[MyDNS ID]:[MyDNS PASS]@ipv4.mydns.jp/login.html'
---

諸々のインストール

build-essential

$ apt install build-essential

corepack

$ corepack enable

Node.js (20)

$ apt-get update
$ apt-get install ca-certificates curl gnupg
$ mkdir -p /etc/apt/keyrings
$ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
$ NODE_MAJOR=20
$ echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
$ apt-get update
$ apt-get install nodejs

PostgreSQL (16)

$ wget https://salsa.debian.org/postgresql/postgresql-common/raw/master/pgdg/apt.postgresql.org.sh
$ sh apt.postgresql.org.sh -i -v 16

$ systemctl status postgresql
// enableじゃなかったら
$ systemctl enable postgresql
$ systemctl start postgresql
// 実行確認
$ psql -U postgres

実行確認するとたぶん peer はダメだよって言われるので
/etc/postgresql/16/main/pg_hba.conf の local all の peer を trust にする。

Redis

$ curl -fsSL https://packages.redis.io/gpg | gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
$ echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/redis.list
$ apt update
$ apt install redis

$ systemctl status redis-server
// enableじゃなかったら
$ systemctl enable redis-server
$ systemctl start redis-server

nginx

$ apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor  | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
$ gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
$ echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | tee /etc/apt/preferences.d/99nginx
$ apt update
$ apt install nginx

$ systemctl status nginx
// enableじゃなかったら
$ systemctl enable nginx
$ systemctl start nginx
// 動作確認
$ curl http://localhost
--> Welcome to Nginx!!

ローカルで確認出来たらルーターのフォワーディング設定で 80,443 をマシンに向ける。
MyDNS.JP にグローバルIPが記録できていれば、下記で確認できる。

// 動作確認
$ curl http://[YOUR DOMAIN]
--> Welcome to Nginx!!

Let's Encrypt

$ apt-get install letsencrypt
$ apt-get install python3-certbot-nginx
// 前述のnginx設定がうまくいっているとして
$ certbot certonly --nginx -d [YOUR DOMAIN]
--> /etc/letsencrypt/live/[YOUR DOMAIN] 以下に証明書ファイルができる

諸々の設定

Misskey実行ユーザー(misskey)を作成

$ adduser --disabled-password --disabled-login misskey

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 [YOUR DOMAIN];

    # For SSL domain validation
    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 http2;
    listen [::]:443 ssl http2;
    server_name [YOUR DOMAIN];

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

    # To use Let's Encrypt certificate
    ssl_certificate     /etc/letsencrypt/live/[YOUR DOMAIN]/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/[YOUR DOMAIN]/privkey.pem;

    # 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:3000;
        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;
    }
}

この時点で https://[YOUR DOMAIN] にアクセスして、502 Bad Gateway になることを確認。

PostgreSQL

ロール(misskey)、DB(mk1)を作成。

$ sudo -u postgres psql
> CREATE ROLE misskey LOGIN CREATEDB PASSWORD 'misskey';
> CREATE DATABASE mk1 OWNER misskey;

Misskeyセットアップ

misskeyユーザーで作業する。

$ su - misskey

git clone

$ git config --global user.name "[YOUR NAME]"
$ git config --global user.email "[YOUR EMAIL]"
$ git clone --recursive https://github.com/misskey-dev/misskey.git
$ cd misskey
$ git checkout master
$ git submodule update --init

設定ファイル

$ cd .config
$ cp example.yml default.yml
$ vi default.yml
---
// とりあえず修正するのは下記ぐらい
url: https://[YOUR DOMAIN]/
db:
  db: mk1
  user: misskey
  pass: misskey
---

ビルド

$ cd ~/misskey
$ NODE_ENV=production pnpm install --frozen-lockfile
$ NODE_OPTIONS="--max-old-space-size=1024" NODE_ENV=production pnpm run build

DB初期化

$ pnpm run init

起動確認

$ NODE_ENV=production pnpm run start
// https://[YOUR DOMAIN] にアクセスして初期設定画面が出ることを確認したら一旦中断
$ Ctrl+C

デーモン化

$ vi /etc/systemd/system/misskey.service
---
[Unit]
Description=Misskey daemon

[Service]
Type=simple
User=misskey
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/misskey/misskey
Environment="NODE_ENV=production"
TimeoutSec=60
SyslogIdentifier=misskey
Restart=always

[Install]
WantedBy=multi-user.target
---

$ systemctl daemon-reload
$ systemctl status misskey
// enabledじゃなかったら
$ systemctl enable misskey
$ systemctl start misskey

これで正式に https://[YOUR DOMAIN] からアクセス可能となる。おつかれさまでした。

備考:Misskeyアップデート

$ su - misskey
$ cd misskey
$ git pull
$ npm run clean
$ NODE_ENV=production pnpm install --frozen-lockfile
$ NODE_ENV=production pnpm run build
// DB更新
$ npm run migrate

systemctl restart misskeyで再起動して更新完了。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0