- misskey の構築例です
- Docker Hub で公開されているイメージを使用します
- misskey/release と Tagsで最新のバージョンを確認する
- 2021年8月 作成
- [ユーザ]$ からはじまっているものは ユーザでの操作
- [local]$ はローカルマシンでの操作
コピペ
# bash -xeu << 'END_OF_SNIPPET'
...
END_OF_SNIPPET
# cat > /etc/nginx/conf.d/misskey.conf << 'EOS'
...
EOS
となっている部分は # の次から最後の行(END_OF_SNIPPETやEOS)までペーストするとファイルに書き込まれたり実行されたりします。
- Debian Buster(x86_64)
- グローバルIP
- Cloudflare
- 独自ドメイン
- OpenSSHキーペアを事前に用意しておく
- メールは利用しない
- ローカルストレージを利用する
ここではConoHa VPSを利用し構築する。IPv4のみ使用する。
- サーバ: 1GB以上
- OS: Debian 10.7(64bit)
- rootパスワードを設定(pwgen -ys 32 などで生成してメモ)
オプション設定
- 接続許可ポート IPv4 - 指定ポートのみ許可: SSH(22)とWeb(20/21/80/443)のみチェック
- 接続許可ポート IPv6 - 全て拒否
- SSH Key を選択するかキーを新規作成して作成した公開鍵(パブリックキー)を設定
サーバが作成できたらネームタグをクリックしIPv4のIPアドレスを確認してメモ
[local]$ ssh root@IPアドレス
- 設定したOpenSSH秘密鍵とペアになってる秘密鍵を使用する
sshで「rootユーザはパスワード認証ではログインできない」ように設定する
# vi /etc/ssh/sshd_config
PermitRootLogin yes
書き換え
PermitRootLogin without-passowrd
パスワード認証自体を禁止したい場合は
PasswordAuthentication no
のコメントもはずす。推奨。
sshd 再起動
# systemctl restart ssh
# systemctl status ssh
active (running) ならば正常、この状態で別ウィンドウで再度問題なくログインできるか確認する。
aptの更新
# apt update
apt upgrade の実行 git-core, curl wget vim の導入とvimの設定
# bash -xeu << 'END_OF_SNIPPET'
apt-get -y upgrade
DEBIAN_FRONTEND=noninteractive apt-get install -y git-core curl wget vim
cat > /etc/vim/vimrc.local << 'EOS'
syntax on
set wildmenu
set history=100
set number
set scrolloff=5
set autowrite
set tabstop=4
set shiftwidth=4
set softtabstop=0
set termencoding=utf-8
set encoding=utf-8
set fileencodings=utf-8,cp932,euc-jp,iso-2022-jp,ucs2le,ucs-2
set fenc=utf-8
set enc=utf-8
EOS
sudo sh -c "update-alternatives --set editor /usr/bin/vim.basic"
END_OF_SNIPPET
再起動して再度グイン
# reboot
1分ほど待つ
[local]$ ssh root@IPアドレス
CloudFlareにログインし、ドメインを設定する。ドメインを設定できたらレコード追加を行う。
SSL/TLS設定
- 「SSL/TLS 暗号化モード フル」に設定
- 「オリジン証明書」を作成し、秘密鍵を ドメイン名-priv.pem, 公開鍵を ドメイン名.pem で保存しておく。
DNS設定
- 任意のホスト名を A レコードとして IPv4 アドレスを設定し、「プロクシ済み」にする。
# apt install -y nginx
オリジン証明書の置き場所を用意
# mkdir -p /etc/nginx/certs
オリジン証明書のアップロード(ローカルから行う)
[local]$ scp ホスト名.pem root@IPアドレス:/etc/nginx/certs/
[local]$ scp ホスト名-priv.pem root@IPアドレス:/etc/nginx/certs/
アップロードの確認
# ls -al /etc/nginx/certs
設定の投入
- まずは「Hello World!」と表示させる
- example.tldの部分は先ほど設定したホスト名に書き換える
# vim /etc/nginx/nginx.conf
# server_tokens off;
書き換え
server_tokens on;
misskey向けの設定
# cat > /etc/nginx/conf.d/misskey.conf << 'EOS'
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;
server_name example.tld;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.tld;
ssl_session_cache shared:ssl_session_cache:10m;
ssl_certificate /etc/nginx/certs/example.tld.pem;
ssl_certificate_key /etc/nginx/certs/example.tld.pem;
ssl_protocols TLSv1.2;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:AES128-SHA;
ssl_prefer_server_ciphers on;
client_max_body_size 80m;
location / {
add_header Content-Type text/plain;
return 200 "Hello World!";
}
}
EOS
nginxの再起動
# systemctl restart nginx
- エラーがでたら /var/log/nginx/error.log を確認する
- この状態で https://ホスト名/ をブラウザで確認し、「Hello World!」と表示されることを確認する
# vim /etc/nginx/conf.d/misskey.conf
Hello Worldの location 部分を以下に書き換える
削除
location / {
add_header Content-Type text/plain;
return 200 "Hello World!";
}
書き換え
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;
add_header X-Cache $upstream_cache_status;
}
nginxの再起動
# systemctl restart nginx
- この時点でページを表示すると 502エラーとなる
インストール
# curl -L get.docker.com | sh
# sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chmod 755 /usr/local/bin/docker-compose
app ユーザを作成し、コンテナの操作などはこのユーザで行うようにする
# useradd -m -s /bin/bash app
app ユーザでdockerコマンドを実行できるようにする
# usermod -aG docker app
app ユーザに切り替え
# sudo su - app
misskey フォルダの作成
[app]$ mkdir -p ~/misskey
[app]$ cd ~/misskey
docker-compose 環境変数
[app]$ cat > .env << 'EOS'
# misskeyバージョン
MISSKEY_VERSION=12.87.0
EOS
docker-compose 設定
[app]$ cat > docker-compose.yaml << 'EOS'
version: "3"
services:
web:
image: misskey/misskey:${MISSKEY_VERSION}
restart: always
links:
- db
- redis
ports:
- "127.0.0.1:3000:3000"
networks:
- internal_network
- external_network
env_file:
- ./etc/docker.env
volumes:
- ./var/files:/misskey/files
- ./etc/misskey.yaml:/misskey/.config/default.yml:ro
redis:
restart: always
image: redis:4.0-alpine
networks:
- internal_network
volumes:
- ./var/redis:/data
db:
restart: always
image: postgres:12.2-alpine
networks:
- internal_network
env_file:
- ./etc/docker.env
volumes:
- ./var/db:/var/lib/postgresql/data
networks:
internal_network:
internal: true
external_network:
EOS
- dbpassword は任意のパスワードに変更すること
- example.tldは先ほど設定したホスト名に書き換え
- 上記以外の設定群は ~/misskey/etc にまとめる。
フォルダ作成
[app]$ mkdir etc
データベース設定
[app]$ cat > etc/docker.env << 'EOS'
POSTGRES_PASSWORD=dbpassword
POSTGRES_USER=misskey
POSTGRES_DB=misskey
EOS
misskey設定
[app]$ cat > etc/misskey.yaml << 'EOS'
url: https://example.tld/
db:
host: db
port: 5432
db: misskey
user: misskey
pass: dbpassword
redis:
host: redis
port: 6379
id: 'aid'
port: 3000
EOS
- db, redis, files はこのフォルダ以下に保存される
- このフォルダ以下のファイルはコンテナから作成されるため、rootユーザでないと操作はできない
フォルダ作成
[app]$ mkdir var
- まずは仮起動を行う。この処理はCTRL+Cを押すかSSHを切断すると終了する
フォアグラウンドで起動
[app]$ docker-compose up
しばらく待機する。
web_1 | > misskey@12.87.0 start
web_1 | > node ./index.js
web_1 |
web_1 | _____ _ _
web_1 | | |_|___ ___| |_ ___ _ _
web_1 | | | | | |_ -|_ -| '_| -_| | |
web_1 | |_|_|_|_|___|___|_,_|___|_ |
web_1 | v12.87.0 |___|
web_1 |
web_1 | Misskey is an open-source decentralized microblogging platform.
web_1 | If you like Misskey, please donate to support development. https://www.patreon.com/syuilo
web_1 |
web_1 | --- 5a4a477797af (PID: 52) ---
web_1 | INFO * [core boot] Welcome to Misskey!
web_1 | INFO * [core boot] Misskey v12.87.0
web_1 | INFO * [core boot env] NODE_ENV: production
web_1 | INFO * [core boot env] You have root privileges
web_1 | INFO * [core boot nodejs] Version 16.6.2
web_1 | DONE * [core boot config] Loaded
web_1 | INFO * [core boot db] Connecting...
web_1 | DONE * [core boot db] Connected: v12.2
web_1 | DONE * [core boot] Misskey initialized
web_1 | INFO * [core boot] Starting 1 worker...
web_1 | DONE * [core boot] All workers started
web_1 | DONE * [core boot] Now listening on port 3000 on https://examle.tld
- 以下のような表示がでたら起動したので、ブラウザで https://ホスト名/ にアクセスする。
- 以下の設定は起動したらすぐに行う。
- 準備が整うまで誰かに登録されないように「招待コードが必須」な状態にしておく。
- 画面の指示に従って、管理者アカウントを作成する。
- ログインする
- インスタンス → セキュリティー → 誰でも新規登録できるようにする のチェックをはずす → 保存
ターミナルに戻り、 CTRL+C でサーバを停止する。
バックグラウンドで起動
[app]$ docker-compose up -d
これを実行するとバックグラウンド起動になる。これで運用開始。あとはブラウザから各種設定を行う。
これらのコマンドは appユーザで ~/misskey(/home/app/misskey) に移動して実行する
内容 | コマンド |
---|---|
起動 | docker-compose up -d |
終了 | docker-compose down |
ログ | docker-compose logs |
ログ(web) | docker-compose logs web |
ログモニタ(web) | docker-compose logs -f web |
管理者に指定 | docker-compose run --rm web node built/tools/mark-admin @example |
psql | docker-compose exec db psql -U misskey |
pg_dump | docker-compose exec db pg_dump -Fc -U misskey -d misskey > misskey.dump |
データベース
[app]$ docker-compose pull
[app]$ docker-compose up -d db
[app]$ cat misskey.dump.gz | docker-compose exec -T db pg_restore -U misskey -d misskey
ファイル
[app]$ mkdir -p var
[app]$ cp -a PATH_TO_FILES var/files
[app]$ sudo chown -R root:root var/files
[app]$ docker-compose exec db pg_dump -Fc -U misskey -d misskey > misskey.dump