彷徨うキムンカムイ

家の鍵失くしちゃった

ド素人がMisskeyインスタンスをAWSで立ち上げた方法のまとめ②(Misskeyが起動するまで)

前回の記事では、VPCを作成したりEC2インスタンスを立ち上げたり、Cloudflareでドメインを管理したり……などといった事前準備を行った。今回は、Web+appサーバーとDBサーバーのそれぞれでMisskeyを立ち上げるまでの作業を一気に紹介しようと思う。

  • 全体の事前準備(クラウドネットワーク構築など)→前回の記事はこちら

  • Web+appサーバーとして使用するEC2インスタンスでの作業※

  • DBサーバーとして使用するEC2インスタンスでの作業※
  • Misskeyのビルド+デプロイ+デーモン作成※
  • 定期バックアップ実行などの後処理

※:今回の記事にする部分
以下「Web+appサーバーとして使用するEC2インスタンスでの作業」は「Web+appサーバーでの作業」とのように表記。
 
▼目次

なお、本記事での解説は、概ね下記の記事に沿って進めている。
Ubuntu版Misskeyインストール方法詳説│Misskey Hub
Misskeyを手動で構築する

Web+appサーバーでの作業

まずはMisskeyの実行・動作のため必要なパッケージをインストール。その後にウェブサーバー(nginx)のインストールとSSL証明書の取得を行う。 Misskey Hubではufwファイアウォール)をホワイトリスト形式にして接続ポートを許可する手順の案内があるものの、今回はAWSのセキュリティグループで通信を制御しているため設定しない。

必要なパッケージのインストール

Misskey Hubによれば、下記のパッケージのインストール+corepackを有効にする作業が必要とのこと。

  1. Node.js (20.4.x以上)
  2. PostgreSQL (15以上)
  3. Redis
  4. FFmpeg
  5. build-essential(Debian/Ubuntuの場合)

Web+appサーバーに2と3は必要ない。そこで、1・4・5+corepackを有効にする作業を行うことになる。

▼最初にやるおまじない
Ubuntuの更新。おなじみのおまじないコマンド。

sudo apt-get update
sudo apt-get upgrade

▼Node.jsのインストール作業
標準リポジトリからのインストールだとメジャーバージョンが入ってくれないので、GitHub掲載の方法 に従って導入する。 ついでにcorepackも有効にしておく。

# GPGキーを入れ直し、メジャーバージョン=20.xをインストール
sudo rm /usr/share/keyrings/nodesource.gpg;
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/nodesource.gpg;
NODE_MAJOR=20; echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list;
sudo apt update;
sudo apt install -y nodejs;

# Node.jsがインストールされたので、バージョンを確認する。
node -v

# corepackを有効にする
sudo corepack enable

FFmpegのインストール
Misskeyのアプリ内で画像や動画の処理をさせるため必要。ドキュメントも一応確認しながら次の操作を行う。

# インストール
sudo apt-get -y install ffmpeg

# バージョン確認
ffmpeg -version

▼build-essentialをインストール
開発パッケージ。gitでインストールしていく。

# インストールコマンド
sudo apt install -y git build-essential

以上で前提となるパッケージの導入は完了。続いて、Webサーバーの設定を行う。

nginxの導入+設定

まずはドキュメントUbuntuへのインストール手順に従い、導入を進める。

# 前提となるパッケージのインストール
sudo apt install -y curl ca-certificates gnupg2 lsb-release ubuntu-keyring

# 署名鍵のインポート
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

# 下記のコマンドで出力に 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 とあるか確認
# フィンガープリントが上記と異なればファイルを削除する必要がある
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" | sudo tee /etc/apt/sources.list.d/nginx.list
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | sudo tee /etc/apt/preferences.d/99nginx

# nginxのインストール
sudo apt update
sudo apt install -y nginx

次にnginxが起動しているか確認し、永続化させる作業を行う。

#  systemctlでデーモンの状態を確認。
systemctl status nginx

# 起動していなければ起動させ、永続化
sudo systemctl start nginx
sudo systemctl enable nginx

SSL証明書の取得
使用するドメインSSL証明書を取得し、格納されたファイルの場所をメモしておく(Misskeyの設定で必要)
取得はcertbotとCloudflareプラグインを利用して行う。ドキュメントなどを参照しながら進めていく。まずはインストールから。

# cetbotとCloudflareプラグインをインストール
sudo apt install -y certbot python3-certbot-dns-cloudflare

次に、CloudflareのAPI情報を設定ファイルに格納する。管理画面を開きながら作業。

# 設定ファイルを格納するディレクトリを作成
mkdir /etc/cloudflare

# 設定ファイルを作成+編集画面に遷移
nano /etc/cloudflare/cloudflare.ini

# nanoの編集画面で下記情報を入れる。
# dns_cloudflare_emailはCloudflareに登録しているメールアドレス
# dns_cloudflare_api_keyはグローバルAPIキー(確認方法は後述)
dns_cloudflare_email = bar@fuga.foo
dns_cloudflare_api_key = xxxxxxxxxxxxxxxxxxxxxxxxxx

# 設定ファイルを保存したら、パーミッションを変更
sudo chmod 600 /etc/cloudflare/cloudflare.ini

CloudflareのグローバルAPIを確認するには、管理画面左上のアイコンから「マイプロフィール」に進む。左メニューのAPIトークンを選択し、ページ下の方にスクロールすると、Global API Keyを表示させる項目が出てくる。ここをクリックしてパスワードを入力すると、上記設定ファイルに入れるべきキーが表示される。

マイプロフィールの「APIトークン」でグローバルIPの確認ができる
CloudflareのグローバルIPを確認する方法

さて、いよいよSSL証明書の取得に移る。コマンドは次の通り。

# 最後から3行目と2行目にあるexample.tldはMisskeyで使用するドメインに置換する
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/cloudflare/cloudflare.ini \
--dns-cloudflare-propagation-seconds 60 \
--server https://acme-v02.api.letsencrypt.org/directory \
-d example.tld
-d *.example.tld \
--key-type rsa

コマンドの内容は次の通り。

  1. certbotを管理者権限(sudo)で実行し、新しい証明書を取得
  2. DNS認証にCloudflareプラグインを使用
  3. loudflare APIの認証情報が記載されたファイルのパスを指定
  4. DNSレコードの伝播時間を60秒と指定
  5. Let's EncryptのACMEサーバーのURLを指定
  6. 証明書を発行するドメインを指定
  7. サブドメインを含むワイルドカード証明書を指定
  8. キータイプの変更

途中出てくる質問に適当に回答して実行し終えると、SSL証明書(pemファイル)が格納されているディレクトリが表示される。これをどこかにコピー&ペーストして保存しておくか、ターミナルを分割するなどしていつでも確認できるようにしておく。

DBサーバーでの作業

PostgreSQLとRedisをインストールする。PostgreSQLについては、ユーザーとデータベース作成のほかに、Web+appサーバーからのアクセス許可をする必要がある(重要) まずは基本的な手順を一通り済ませる。

PostgreSQLのインストール+ユーザー&データベース作成
おまじないアップデートから行ってインストール、起動しているか確認。

# おまじないアップグレード
sudo apt-get update
sudo apt-get upgrade

# PostgreSQLインストール
sudo apt install -y postgresql-common
sudo sh /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -i -v 15;

# systemctlでデーモンの状態を確認。
sudo systemctl status postgresql

# 起動していなかった場合
sudo systemctl start postgresql

次にユーザーとデータベースの作成に入る。仮にユーザーはmisskey、データベース名はmk1とする。

# psqlに入る
sudo -u postgres psql

# ユーザー名とパスワードを作成
CREATE ROLE misskey LOGIN PASSWORD 'hogehoge';

# 先に作成したユーザーをオーナーとしてデータベースを作成
postgres=# CREATE DATABASE mk1 OWNER misskey;

とりあえずここまでやって、アクセス許可の設定は後回し。

▼Redisのインストール
大体こんな感じ。

# インストール
sudo snap install redis

# systemctlでデーモンの状態を確認。
sudo systemctl status redis-server

# 起動していなかった場合
sudo systemctl start redis-server

PostgreSQLのアクセス許可設定
Web+appサーバーとDBサーバーで分割する上で、最も重要なステップ。前者からのアクセス許可がポスグレ上で行われていないと、Misskeyアプリからのデータベース操作ができないし、投稿も閲覧も不可能になる。
そこで変更したいのがpg_hba.confの記述内容。これまで説明したPostgreSQLのインストール方法に沿うと、通常は/etc/postgresql/15/main/にある。nanoで開きつつ、AWSのコンソール上でWeb+appサーバーのプライベートIPを確認しながら作業しよう。

# nanoで開く(開かない時はsudo権限で)
nano /etc/postgresql/15/main/pg_hba.conf

# 最後の行に下記を追加。
#分かりやすいようにコメントで”Web+appサーバーからのアクセス許可”などと追加しておいても良い。
host    mk1             misskey         Web+appサーバーのIP/プレフィックス長          md5
hostssl mk1             misskey         Web+appサーバーのIP/プレフィックス長          md5

# 保存したのち、ポスグレ再起動
sudo systemctl restart postgresql

Misskeyのビルド+デプロイ+デーモン作成(Web+appサーバーで作業)

いよいよMisskeyのインストールを立ち上げる。
まずはユーザーを作成してgit cloneし、必要なnpmパッケージをインストール

# misskey用のユーザーを作成
sudo adduser --disabled-password --disabled-login misskey

# misskey用のユーザーに切り替え
sudo su - misskey

# git cloneする
git clone -b master https://github.com/misskey-dev/misskey.git --recurse-submodules

# cloneしたディレクトリに入る
cd misskey

# masterブランチに切り替え
git checkout master

# 必要なnpmパッケージをインストール
NODE_ENV=production pnpm install --frozen-lockfile

まだビルドはしない。misskeyの設定とnginxのリバースプロキシの設定が必要になるからだ。

misskeyの設定

urlの記述のほかに、DBがどこにあるのか指定する必要がある。まずは設定ファイルを作って開く。

# misskeyディレクトリ内で実行
nano .config/default.yml

記述内容はexample.ymlの通りだが、変更すべきポイントがある。 DBサーバーのプライベートIPが必要なので、AWSのコンソールを開いておこう。

  • 66行目:url: https://example.tld/https以降をMisskeyで使用するドメインを使用したアドレスに置き換える
  • 97行目~106行目:PostgreSQLの場所を指定(データベースサーバーに向ける)
  • 135行目~137行目:Redisの場所を指定(同上)

仮に、Misskeyで使用するドメインをhogehoge.com、データベースのユーザーはmisskey(パスワードはhoge-hoge)、データベース名はmk1だとすると、記述内容は次のようになる。

# ---66行目---
url: https://hogehoge.com/

# ---97行目~106行目---
db:
  host: <DBサーバーのプライベートIP>
  port: 5432

  # Database name
  db: mk1

  # Auth
  user: misskey
  pass: hoge-hoge

# ---135行目~137行目---
redis:
  host: <DBサーバーのプライベートIP>
  port: 6379

nginxの設定

いったんルート権限に戻り、nginxのリバースプロキシ設定を書く。ここは公式の手順と大きな違いはない。

# ルート権限に戻る(AWSの場合はubuntuに戻る)
exit

# nginxの設定ファイルを作り、開く
sudo nano /etc/nginx/conf.d/misskey.conf

設定ファイルにはMisskeyのドキュメントの内容をコピペ、下記のように編集する。

  • 18行目と30行目のドメイン
  • 34-35行目の証明書へのパスをCertbotで取得したものに (基本的にexample.tldを置き換えるだけでOK)
  • 56行目 (If it's behind another reverse proxy or CDN, remove the following.) から4行を削除

同じくhogehoge.comをドメインとして使用すると仮定すると、以下のようになるはず。

# 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 hogehoge.com;   # hogehoge.comに置き換え

    # 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 hogehoge.com;   # hogehoge.comに置き換え

    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/hogehoge.com/fullchain.pem;   # SSL証明書取得時に表示されたpemキーの場所
    ssl_certificate_key /etc/letsencrypt/live/hogehoge.com/privkey.pem;   # 同上

    # To use Debian/Ubuntu's self-signed certificate (For testing or before issuing a certificate)
    #ssl_certificate     /etc/ssl/certs/ssl-cert-snakeoil.pem;
    #ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.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:3000;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_redirect off;

       # ここにあったはずの4行は削除

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

nginxの設定ファイルを保存したら、キチンと機能しているか確認する。 エラーが出たら「余計な行が入っている」などの可能性があるため、もう一度設定ファイルを開いて見直し。

# 機能確認
sudo nginx -t

# デーモン再起動
sudo systemctl restart nginx

# デーモンのステータスを確認。activeならOK
sudo systemctl status nginx

ここまで終わったら、いよいよMisskeyのビルド+デプロイに入る。

Misskeyのビルド+デプロイ

まずはmisskeyユーザーに変更し、ディレクトリ内に入る。

sudo su - misskey
cd misskey

Misskeyのビルド+デプロイへ

# データベースの初期化
pnpm run init

# Misskey起動
NODE_ENV=production pnpm run start

万一にもエラーが出たら、次の項目を確認する。

  • DBサーバーのpg_hba.confでアクセス許可設定を適切に行えているか?
  • DBサーバーのredis-serverは動いてるか?(systemctlで確認)
  • Misskeyのdefault.ymlの設定は適切か?

起動はしているようだがアクセスできない……そんなときはCloudflareの設定をチェックする。

  • DNSレコードはきちんと設定されているか?(Web+appサーバーのElasticIPに向けられているか)
  • SSL/TLS暗号化モードは「フル(厳格)」になっているか?

きちんと起動し、アクセスもできたら、いったんctrl+Cでキルしてexitでubuntuユーザーに戻る。いよいよ最後のステップ。

Misskeyデーモン作成

systemctlでステータスチェックや起動・停止・再起動ができるように、デーモンを作成しておく。 まずはubuntuユーザーで下記コマンドを入力し、nanoでファイルを開く。

sudo nano /etc/systemd/system/misskey.service

ファイルが開いたら、下記をコピー&ペースト。UserとWorkingDirectoryを適切に設定する。作成したMisskeyユーザーの名前が"misskey"だとすれば、次のようになる。

[Unit]
Description=Misskey daemon

[Service]
Type=simple
User=misskey  # 作成したユーザー名を入力
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/misskey/misskey  #通常は/home/作成したユーザー名/misskeyになる
Environment="NODE_ENV=production"
TimeoutSec=60
StandardOutput=journal
StandardError=journal
SyslogIdentifier=misskey
Restart=always 

[Install]
WantedBy=multi-user.target

これでひとまずMisskeyで遊べるようになった。

Misskeyのアプリケーションの起動・停止・ステータスチェックの方法

デーモンを作成できたら、ubuntuユーザーから次のコマンドで起動・停止・ステータスチェックなどができるはず。

# Misskeyの起動
sudo systemctl start misskey

# Misskeyの停止(更新作業などの際に行う)
sudo systemctl stop misskey

# Misskeyの状態確認
sudo systemctl status misskey

# Misskeyの再起動(設定ファイルを変更した場合など)
sudo systemctl restart misskey

ここまでの作業を終えたら、あとはWebブラウザからMisskeyの管理者アカウントを作り、コントロールパネルでモデレーションをやっていくだけ。 その方法については続く記事で紹介する。

ド素人がMisskeyインスタンスをAWSで立ち上げた方法のまとめ①(全体の事前準備)

※2024/03/29:ネットワーク構成図を更新+データベースサーバーの更新作業に関する課題を追記。Cloudflareへのドメイン登録作業に「SSL/TLS暗号化モードの設定」を追記。

IT技術に全く触れたことがないタダの「モノを書かずにはいられない性分の者」がAWSでMisskeyインスタンスを運用してみた。その所感は以前の記事で述べた通りである。今回の記事では、いったいどのようにしてインスタンスを立ち上げたのか、システム構成図などを交えて詳細に解説したいと思う。

前提として、データベース(Misskeyのユーザーデータや投稿の本体)があるサーバーは、ユーザーがアクセスできるWeb+appサーバーから切り離すものとする。加えて、Misskey本体がメモリを食い尽くす様子を見たため、Dockerは使用してインスタンス内で他にサービスを提供するのはやめておこうと思った。
 
 
前置きはここまでとして、今回説明する全体の手順は次のようになる。

  • 全体の事前準備(クラウドネットワーク構築など)←この記事で説明するのはココ
  • Web+appサーバーとして使用するEC2インスタンスでの作業
  • DBサーバーとして使用するEC2インスタンスでの作業
  • Misskeyのビルド+デプロイ+デーモン作成
  • 定期バックアップ実行などの後処理

以下、EC2インスタンスの作業である旨は省略し「サーバーで~」などと表記する。 また、ここまでの手順は、一旦立ち上がったものを試行錯誤しながら組み上げたものであり、再現性に一部欠ける可能性がある点に留意してほしい。
 
▼目次

前回の記事:hal-2045.hateblo.jp

全体の事前準備

全体の事前準備は以下で構成される。

ドメイン+メールサーバーの取得

MisskeyインスタンスのURLとなるドメインに加え、ユーザーがアカウント設定(主にパスワード変更)に使用するためのメールサーバーを用意する必要がある。今回はお名前ドットコムでドメインを取得し、同サービス+取得したドメインでお名前メール(エコノミープラン)を契約した。メールアドレスは"noreply@~"だとか"postmaster@~"だとかを設定しておこう。

メールアドレスの作成まで出来たら、DMARC認証をオンにしておく。手順が終了すると新しいDNSレコードがひとつ追加で発行される。やり方はこの通りだ。

  1. お名前ドットコムからお名前メールに遷移
  2. 左メニューのメールを選択。
  3. 上部の「メールセキュリティ」に移動
  4. ページ下部の「DMARC認証設定」をオンにする

お名前メールのDMARC認証設定
お名前メールのDMARC認証設定

この手順を踏むべき理由は、GmailやYahooメールで登録するMisskeyユーザーのためだ。これらのユーザーは送信ドメイン認証(SPFDKIM、DMARC)が完備されたアドレスからでないとメールを受信できず、パスワードリセットなどで大いに困ることになる。私のようなほとんど知り合いだけの小規模インスタンスを運営するつもりならともかく、50人、100人と受け入れるつもりがあれば、ユーザーからの問い合わせに対応する時間なんて割けないし、ユーザー側でも面倒になって連絡しない……なんてことになる。送信ドメイン認証については下の記事に詳しい。

新潮流になるか?GoogleとYahooが発表した「今後は受信しないメール」の条件

どうでもいいが、先日ちょうど「Gmail宛にメールが届かなくてお偉いさんが頭を下げる」なんて事態が発生していた。こういうのを理解できるようになるのも、非IT系としてはためになった(前置きしたが完全に余談)

Cloudflareにドメイン登録+SSL/TLS暗号化モードの設定

Cloudflareのロードバランシング機能やキャッシュ機能などを使うため、まずはドメイン登録してネームサーバーを利用できるようにする。手順は以下の通り。

  1. Cloudflareのアカウントを開設する
  2. アカウントのホーム画面で「サイトを追加」を押す
  3. ドメインを入力、表示されるネームサーバーを確認
  4. ドメインを取得したサービスで上記ネームサーバーを登録※
  5. Cloudflareのアカウントに戻って、Webサイトがアクティブになるのを待つ

※今回ならお名前ドットコムになる。

手順4で示したお名前ドットコムの作業は次の通り。
ログイン→ネームサーバー設定→画面下部で「他のネームサーバーを利用」タブを選択→Misskey用に取得したドメインにチェックを入れ、ネームサーバー情報にCloudflareに表示されたサーバー情報を入れる→確認から手続き終了へ

Cloudflareで表示されたネームサーバー情報を登録する
お名前ドットコムのネームサーバー変更画面

ドメイン登録が完了するとCloudflareホーム画面で「アクティブ」表示になる
Cloudflareでドメイン登録が完了した状態

Cloudflareでドメインがアクティブになるまで、最大で24時間くらいかかる。お名前ユーザーの私の場合は1時間ほどで済む。

ドメインがアクティブになったらやること(SSL/TLS暗号化モードの設定)
Cloudflareでドメインをクリックし、詳細設定の画面に入る。左メニューのSSL/TLSをクリックし、SSL/TLS暗号化モードを「フル(厳密)」 に変更しておく。

CloudflareのSSL/TLS暗号化モードはフル(厳密)にしておく
Cloudflareに登録したドメインSSL/TLS暗号化モード設定画面

Cloudflare R2でオブジェクトストレージ設定

Cloudflareにアカウント登録すると、左側のメニューバーにR2というのが出てくる(登録したドメインをクリックすると出てこない。その場合はホーム画面に戻ろう)

R2とはAWS S3に相当するオブジェクトストレージのサービスだ。ここを押して、バケット作成から"misskey-image"だのなんだの、Misskeyに投稿される画像・動画を格納する場所であることが分かるような名前を付けておく。目的は左記のとおりで、実際にバケットの使用開始設定をするのはMisskeyのビルド+デプロイ+デーモン作成の後だ。

AWSクラウドネットワーク構築

Misskey用になるべくセキュアなネットワークを立ち上げる。初めてAWSを使用する人はMFA認証の登録を忘れないように!
大体の手順は次の通り。

  • AWS VPCでネットワークを作る
  • EC2に移動し、セキュリティグループを作る
  • EC2インスタンスを2台立ち上げる

構成図にすると次の通り。

Misskeyインスタンスのためのネットワーク構成図
Misskeyインスタンスのためのネットワーク構成図

正直言って、セキュリティグループの設定で何とかしている感じ。ルール設定には過不足があるかもしれない。
Web+appサーバーとデータベースサーバーを分離、別のサブネットに置く。それぞれにセキュリティグループを作り、そこで最小限のネット構成を作る。DBサーバーを増やす(レプリケーションしつつフェイルオーバー設定をする)場合に備えて、セキュリティグループの単位でWeb+appサーバーのあるグループと通信できるようにルール設定しておく。さらに、DBサーバーを置いているサブネットのルートテーブルにはS3バケット用のVPCサブネットを作って紐づけておき、データベースバックアップ用のルートを確保しておく。 課題として、データベースサーバーの更新作業が挙げられる。今はNATゲートウェイを都度付け外しすることで対応している。

EC2インスタンスの立ち上げ

EC2インスタンスを2台立ち上げる。RDSを使えばいいのでは?というツッコミは気にしない。 概ねこんな感じ。

▼名前とタグ
web+appサーバーかDBサーバーか区別できるようにする。
ex."Misskey-web" "Misskey-db"

▼OSイメージ選択
Ubuntu22.04選択

インスタンスタイプ
今回はどちらもTタイプ(クレジットを消費してCPUパワーを使う)にした。
Web+appサーバーはメモリ4GBあると安心。

▼キーペア(ログイン)
まだない場合は新しいキーペアを発行する。
ダウンロードしたキーペアは、Windowsなら"C:\Users\$user.ssh"に移動させておく。あとでVScodeを使ってリモート接続するため。

▼ネットワーク設定
どちらも「編集」を押して、事前に設定したVPCとセキュリティグループを選択。

▼ストレージ
どちらも30GiBにする。

▼高度な設定
終了保護と停止保護をかける。

ここまで出来たら、ElasticIPを2台それぞれに関連付ける(DBサーバーの方は必要あるのか?)

CloudflareでのDNSレコード登録

Cloudflareにログインし、ホームからMisskeyに使用するドメインをクリックして遷移。

左メニューの「DNS」をクリックし、DNS管理でレコードを追加していく。追加するレコードは以下の通り。

▼Web+appサーバーに向けたAレコード
ドメイン+ElasticIPをAレコードで設定、プロキシはオン。

▼メールサーバー用のレコード
お名前ドットコムにログイン→お名前メールに遷移。左メニュー「ドメイン」をクリックし、Misskeyインスタンスで使う管理用メールアドレスの「DNS」をクリック。レコード一覧が出てくるので、これをちまちまと転記するようにしてCloudflareに登録していく。DMARC認証をオンにしていれば、登録すべきレコードとしてTXTレコードで出ているはず。

お名前メールのDNSレコード確認画面
お名前メールのDNSレコード確認画面

CloudflareのDNSレコード追加画面
CloudflareのDNSレコード追加画面

その他の準備

DeepLアカウントを開設し、APIキーを取得できるようにしておく。Misskeyインスタンス立ち上げ後にコントロールパネルでAPIキーを入力しておけば、ノート(投稿)の翻訳ができるようになる。
それ以外は特になし。

→次の記事 hal-2045.hateblo.jp

老いたる生活

概ね20時から24時のあいだに寝て起きる。位牌に線香を上げ、気分に合わせて学習と事業運営で作業を切り替える。明け方になると食事を摂る。8時過ぎに朝礼を行い、データを採取して分析する仕事を少し齧る。引っ越したばかりの家の片付けを少し進めることもある。

昼間はパートナー会社の相談業務を手伝う。手伝うと言っても、聞き専かテキストベースでのコミュニケーションを代わりに引き受けるだけ。パートナー会社と自社のマーケティング戦略を練り、実行する。いま企画しているAIを活用した事業のプロダクトも進める。夕方は自動化した録音文字起こしから必要な対応を整理する。簡単な食事を摂りながら経理作業。気絶するように眠る。

 

最近はこの繰り返しだ。人と話すこともあるが、自分の話はしない。メンタルケアと業務のフォロー、あとはただ相手の聞いてほしい話を聞くだけ。精彩のある生活が失われ、記憶に残らない目まぐるしいだけの一日が残る。

 

やたらとハングリー精神の強い経営者からは見下される。どこか作業者目線に傾くきらいのある経営者とは話がかみ合わない。植物のように、老いたる生活。

近況(苦痛の波打ち際で)

この頃は睡眠薬があっても日に3時間しか眠れず、午前中はビデオ会議の間・午後は翌日に向けた処理の間に短い睡眠をとるのが癖になっている。睡眠薬の中でも最も強い、麻酔の仲間に属する種類を求めに行ったが、自死の懸念が未だ大きい状態であるとして毎度却下されている。


悲しいことに、私の脳は非常に馬力がある(別のタイミングで複数回実施したIQテストの結果でも顕著である)。週末も国民の休日も休みなく働き、他人より5時間程度長い日常を処理しても、愚にもつかない事柄を考える空隙がなお存在する……苦痛に満ちた記憶と身体の不調が寄せては返すように忍び込んでくる。

関西を去る日まで残り数日

出奔して山海に挟まれた田舎町に移住してから4か月、ついに関西を去る日がやってきた。仕事のため首都圏にごく短期間住むことはあっても、日常生活の拠点を全く縁のない都会に移すのは、34年余の人生で全く初めてのことだ。

田舎町での日常は「虚弱体質」であることが知れ渡り、わりあい不健康な人間の生活の方が水に馴染むというのがあって、ビデオ通話とテキストチャットで外部交通する日々に変わった。私自身の場所が変わっても何ら問題はない。

この頃の体調について

昨年受けた医学的処置の影響が長引いている。白髪が生え、抜歯を行った。爪は割れる。私の一部は少なくとも当分のあいだ機能しない。筋弛緩効果のある薬を飲んでなお肩や腰の筋肉痛が抜けないので、稼働時間の半分は布団のなかにいる。

そのせいもあって、起因となった辛い記憶や、はるか昔のよくない思い出が蘇ることが多くなった。苦痛を振り払うように、午前中はグロッキーな気分のままオンラインでアポを消化し、午後はDiscordに入りながらパソコンに向かう。まずまずの成果がある。

自律の弊害、苦痛の波打ち際で

以前どこかで書いたことがあるけれど、公私共に心身の乱れが現実に反映されることは滅多にない。

朝起きて、デジタルとアナログで日々徒然を認め、前日に学んだことを復習し、カロリーのある飲み物を摂り、線香に火を点け、化粧して、会議に向かう。終わったら化粧を落とし、掃除し、所持品を一か所にまとめて場所を整え、軽く仮眠をとり、パソコンに向かって公私共にテキストベースのコミュニケーションを取りながら委託業務や自分の事業を進める。夜は雑務と生産性の高い作業、暇なら勉強、合間に風呂と軽食。3時に寝て、6時にまた起きる。たまに気分で休みを取り、半日から丸一日を通院か就寝に費やす。酒は余程眠れないときしか飲まない。

 

あるトラブルの処理に関わっている大体4人を除いては、自律極まる淡々とした生活の隅にある本当の想いを知らない。先日引き取った仏具を見た時に湧き上がる感情や、物理的身体の痛みや怠さとともに神経を伝わる「何か」。もうそれは終わったものとして扱われている。実際、若い人やさわりしか知らない人には、品のない悪口を垂れ流すなどして誤魔化している。最近ようやく気付いたが、恐らく自分は、このまま周囲に嫌われてフェードアウトしようとしているのだろう。

自分の前にはいつも「生活のリアリティ」が不動の山として立ち塞がっている、というか、それと一体化してしまったのかもしれない。根本が苦痛の波で侵食され、いつ倒れるか分からないから、現実味のない重いものをどんどん下して耐えるしかない。それも無駄で、いつか突然倒れるのだが。

 

幼いあの日、親に「殺すつもりだった」と告白された。失敗作だったと。もしかしたら、自分も同じようにも思っていたのではないか。自分の存在は間違いだったのではないか。

要領を得ない内容だが、とにかく「私は大丈夫ではない」と伝えたかった。

 

 

非IT系人間のMisskeyサーバー運用所感

私は思いついたことを書かずにはいられない性分で、なかでもネガティブな感情は「誰かに見てもらえる期待」を込めてついネットに放流してしまう。これでは共感疲労を広げるばかりでいけないと思い、最近になってある試みをした。オープンソースの分散型SNSアプリケーションであるMisskeyAWSのEC2インスタンスにインストールし、何人か受け入れられる状態で運用を始めたのである。

これと言って面白いオチはないが、良かったと思うことをいくつか挙げてみる。

Webサービス運用という新しい体験と趣味を得た

自分にとってもっとも利益があると思えるのは、Webサービスを運用、提供するという新しい体験ができたことである。

そして、いわゆる「おひとり様サーバー」ではなく、発見してくれた人を何人か受け入れられる様態にしたことで、その奥深さを知ることも叶った。ユーザビリティ、セキュリティや可用性を考えた構成が必要であるから、システム構成と呼べるひとつの体系を自分で編み出さざるを得ない(その領域に足を踏み入れることになった)のである。

 

手を動かしていると、作業時間の9割は調査・学習に割かざるを得ない。もともと私は新しい知見を得ることを至上の喜びとする性質である。問題解決から得られる報酬系の刺激も大きい。運用を開始して、サーバーを止めること数十回、知らず知らずのうちに新しい趣味を得ることになった。

IT系の資格の勉強になった

以前から「自分の最も強い分野にITを組み合わせて事業展開したい」と考えていたが、一歩踏み出すことができなかった。身の回りに業界人がおらず、どの程度の学習や実績を積めばいいのか測ることが叶わなかったためである。そうとなれば、国家資格に挑戦して実力の自己測定と証明をするのが近道だが、テキストを開くと知らない用語ばかりで退屈であった。

Misskeyサーバーの運用では「IPアドレスとは何か」「ハッキング手法にはどんなものがあるのか」「データベースやSQL文の基本」といった基礎知識が欠かせない。ネットでツギハギの知見を得て運用を開始することになったが、トラブルが発生した際は、上記の基礎を体系的に見直すところから対処が始まる。こうして私は富士通メディアラーニングの基本情報技術者試験テキストを実践的に使うことになった。おかげで科目A・科目Bともにかなり自信がつき、すぐ試験に臨める段階になった。

 

※余談だが、科目Bの学習は、既存の技術スタックを使ったWebサービス運用だけでは間に合わなかった。生業として技術を提供する人にとっては、そりゃそうだろうという話であろう。何はともあれ、テキストとは別にIDEを使って学ぶ動画講座をUdemyで買い求め、知識を網羅した。

想いの石棺としての、自主運用SNS

私の抱えるネガティブな想いは、法律的な問題も絡むし、カウンセラーや医師から「災害」だと指摘されている。薄ら開示できる様態で書かざるを得ないという性分に抗えないとすれば、見る人の感情を著しく汚染する加害行為に注意を払う必要がある。私には、かの原発事故で言う「石棺」のような場所が必要だった。

いつでも閉鎖できる自主運用SNSはまさにふさわしいツールであるし、Misskeyの投稿機能も目的にかみ合った。フォロワー限定の投稿だけでなく、URLが分からないとたどり着けないがサーバー内には公開されるチャンネル機能も搭載されており、己の性が求めるままに想いの公開範囲をコントロールできる。

 

私の自主運用SNSのコンセプト、ポリシーについては、少し体裁を整えた上で、サーバーの説明として掲載した。現在利用していただいている方々には、言うなれば「長距離バスの座席に設置されている袋」のように、意図した使い方をしていただいている。

石棺のタイムラインが全く流れないのは、周囲の幸福や新しい旅立ちを暗に示している。このようにしてゆるく繋がる世界をまさに求めていたし、提供したかった。良い運用体験を今も得続けている。

 

以上、Misskeyサーバー運用に関する走り書きとする。

早くどこかに帰りたい

失踪企図を始めてからしれっと100日が経ち、やっと全部終わるかと思いきや、年末にタクシーで夜間救急にいくことになった。感染と炎症が見られるとのこと。産婦人科系の後遺症である。

 

手術は決まっていて、この頃は痛みや違和感のせいで不眠気味だ。眠れないと人は余計なことを考える。つきまとう過去、平然と目の前を闊歩する相手方。

私は生に呪われている。首吊り縄を編んでいるまさにその時、あの地震が来た。宮城から移住した人が興奮して「何かせなあかん」と言う。私は失踪前の居所から回収したスマートフォンを開く。石川から御母堂に連れられて大阪の学校に通っていた同級生で、筝曲の演奏が並外れて上手かったあの人の連絡先を辿る。無事であるならスタンプかリアクションで大丈夫、と送ったけど、まだ返事が来ない。基地局の電池が落ちているのか、それとも、昨日発表されたリストに名前があるのか。怖いから見ていない。Twitterのミュートワードも随分増えた。私だけが死に至れず、かといって生の世界にも留まれない。現地の人にとってはそれどころではなかろうが。

 

夜に決まってみる夢がある。自分から何かの汚染が広がって、見知った人を恐怖させる夢。夢から覚めた私は淡々と仕事する。電話をとり、Zoomミーティングに同席し、集めたデータをAIに流し込む。英単語を復誦し、Obsidianに基礎的なIT知識を書き込み、改正法案を読み、その他諸々の勉強する。悩んでいる友達数名に素早く返信する。星を眺める。悲しいほど心は元気だ。

報酬を支払っている有資格者が「けじめをつける案」を出してきた。私はこうしたいと述べると、それは極めて困難だと返ってくる。私の生存圏は失われたのだ。それでも元気だから生きるしかない。

 

だらだらと気持ちを書いてしまった。帰る場所も行く場所もない。早くどこかに帰りたい。ここは居るべき場所ではない。元気な不健康者は全員を汚染する、反対に、元気のない健康な人は汚染にすら気付かせず悠々とそこにいて、居場所の保証を得られる。

カウンセラーは「極めて危機的な」と言う。危機なんかどうでもいい。関東に引っ越す旨を話すと「会いたい」と言われる。それもどうでもいい。帰らせてくれ。どこか静かなところへ帰りたい。悲しい。

失踪100日を終えて

死んだふりをした上で遁走してから100日目になった。この半年はあまりにも状況が過密で、辛く、生き残れたというより「生き残ってしまった」としか言えない。

ひとまず、成果を簡単にまとめておく。

新天地での新事業の業績

12月の収入は320万円見込み、月次で売上高純利益率を試算して平均すると大体35%くらいになる。売上原価はほとんどかからず、一般管理費がちょっと圧迫するなと思っていたが、この辺にお金をかけるのは極めて意義あることなのでよい。宗教上の理由みたいなものだが、広告宣伝費にドバドバお金をかけ続けなければならないモデルにならなくて良かったな、と思う。

起業の楽しさを思い出した

「家族を養わなくてはならない」という圧力から解放されて、起業を純粋に楽しめている。意図せず死んだふり作戦が公然の秘密になったせいで、元々あった人脈で下駄を履いた状態でのスタートになったが、それでも最初の頃の「アドレナリン不足を補ってやや余りある程度の緊張感」を思い出すにあたって十分な緊張感があった。

それと、時代の変化も感じられたのが良い。足で開拓する基本のスタンスに変化はないが、リアルの足じゃなくてもLINE通話やZoomで十分になっている。うまく言えないが、純粋に実績&スキルの権威性・専門性で勝負をかけている私にとって、女性起業者に期待される「若干の色気」が不要とされる現環境は心地よい。

人間関係について

ある賢者が言うところによると、人間関係は水物だ。私はもう旅立つべきなのだろう。皆それぞれ居場所を見つけ、自分なりに生活している。

安っぽい言葉だが、こと私は生涯に渡って孤独を甘受する立場にあると信じている。ポジティブでもネガティブでもない。鏡像認識が始まった頃から「ひょんなことからこの世に生まれ落ちた異形の怪物」を自認していた。

何にせよ、一所に留まるのは私らしくない。元居た場所の人間関係は思い切って整理して、ネット上の繋がりもごく限定的にしようと思う。来てくれる人は当然拒まないけど、もう辛いことがないように、一枚壁を置いてやっていきたい。

 

Twitterアカウントは整理し、今後のネットでの露出は、この日記と自ら運営するMisskeyサーバー、それとBlueSkyに限定しようと思う。