Skip to content

Instantly share code, notes, and snippets.

@tamaina
Created August 30, 2021 12:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tamaina/e802047ec47daef6c787ce216918fd05 to your computer and use it in GitHub Desktop.
Save tamaina/e802047ec47daef6c787ce216918fd05 to your computer and use it in GitHub Desktop.
Docker Imageを使ったmisskeyの起動例

misskey設置例(docker image)

  • misskey の構築例です
  • Docker Hub で公開されているイメージを使用します
  • misskey/releaseTagsで最新のバージョンを確認する
  • 2021年8月 作成

凡例

  • から始まっているものは rootでの操作

  • [ユーザ]$ からはじまっているものは ユーザでの操作
  • [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キーペアを事前に用意しておく
  • メールは利用しない
  • ローカルストレージを利用する

Debian 基本設定

ここではConoHa VPSを利用し構築する。IPv4のみ使用する。

ConoHa VPS

  • サーバ: 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秘密鍵とペアになってる秘密鍵を使用する

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

CloudFlareにログインし、ドメインを設定する。ドメインを設定できたらレコード追加を行う。

SSL/TLS設定

  • 「SSL/TLS 暗号化モード フル」に設定
  • 「オリジン証明書」を作成し、秘密鍵を ドメイン名-priv.pem, 公開鍵を ドメイン名.pem で保存しておく。

DNS設定

  • 任意のホスト名を A レコードとして IPv4 アドレスを設定し、「プロクシ済み」にする。

nginx

# 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の部分は先ほど設定したホスト名に書き換える

参考: misskeyのnginx設定サンプル

# 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!」と表示されることを確認する

nginxの再調整

# 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エラーとなる

Docker

インストール

# 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

misskey

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

misskeyの仮起動

  • まずは仮起動を行う。この処理は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://ホスト名/ にアクセスする。

起動後すぐに必須な設定

  • 以下の設定は起動したらすぐに行う。
  • 準備が整うまで誰かに登録されないように「招待コードが必須」な状態にしておく。
  1. 画面の指示に従って、管理者アカウントを作成する。
  2. ログインする
  3. インスタンス → セキュリティー → 誰でも新規登録できるようにする のチェックをはずす → 保存

仮起動の停止とバックグラウンド起動

ターミナルに戻り、 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

DBのエクスポート

[app]$ docker-compose exec db pg_dump -Fc -U misskey -d misskey > misskey.dump
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment