CalckeyのサーバーをGCP上に立てた話 + 運用してみた感想 :: rettuce

およそ2年ほど前から Google Cloud Engine 上に Calckey のサーバーを建て運用していました。 この度、クラウド環境でなくても良いと思い始めたこと、また支払いがドルであるため円安の影響を受けやすいことから、国内VPSへの移転作業を実施しました。

  • 移行元: Google Compute Engine (Ubuntu 22.04)
  • 移行先: シンVPS (Ubuntu 24.04)

これまで Ubuntu 22.04 で稼働していましたが、Ubuntu 24.04 にして特段困ることはないのでは? と思われたのでついでに更新していきます。

作業要約

  1. 新しいサーバーに普通にIceshrimpを構築する
  2. データベースだけ移行前サーバーから移行後サーバーにリストアする
    • メディアファイルは Google Cloud Storage 上にあるものを継続利用するため作業なし
  3. DNS設定変更

移行手順

  • 以下の内容は 2025/05 時点での作業内容を記載しています
  • 実際の操作とは一部異なったり、抜けがある可能性があります

事前作業

  • シンVPSのコンソールから「パケットフィルター」をOFFにする
    • 別途ファイアウォールの設定を実施するため、VPS側のフィルタは不要
  • シンVPSの初期設定を確認 (いずれもシンVPSでは設定済み)
    • タイムゾーンが JST になっていること
    • swap領域が確保されていること
  • 更新作業
# JSTになっていることを確認
date

# swap領域が確保されていることを確認
free -m

# システムの更新など
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget git build-essential

Iceshrimp の実行ユーザーを作成

  • Iceshrimp の実行ユーザーを作成
    • 以下の例では user とする
sudo useradd -m user
sudo passwd user # パスワードを設定
usermod -G sudo user # sudo 可

ログイン設定

  • 実行ユーザーは公開鍵認証でログイン可能にする
  • rootユーザーではログイン不可にする
# 以下、userで操作
# 秘密鍵作成
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519

cd ~/.ssh && pwd
mv id_ed25519.pub authorized_keys
chmod 400 authorized_keys
# 以下、rootで操作
# 実行ユーザーにsudo権限を付与
sudo visudo

記述を追加

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
user ALL=(ALL) ALL # 追加
# ssh接続の設定を編集
sudo vi /etc/ssh/sshd_config.d/default.conf

/etc/ssh/sshd_config/etc/ssh/sshd_config.d/*.conf を Include する設定が記述されていたため、新規ファイルを作成して設定を記述

PermitRootLogin no
AllowUsers user
# 再起動
sudo systemctl restart ssh
  • 実行ユーザーで公開鍵認証によるログインが出来ることを確認する
  • root ユーザーでログインが出来ないことを確認する

ファイアウォール設定

  • 必要なポートの開放 (80/443)
  • SSH接続先ポートを22から変更する (以下の例では 12345 とする)
# 有効化
sudo ufw enable

# デフォルト拒否&必要なポート開放
sudo ufw default deny
sudo ufw limit 22
sudo ufw allow 80
sudo ufw allow 443

# 読み込み&確認
sudo ufw reload
sudo ufw status

# 自動起動の有効化
sudo systemctl enable ufw

# SSH接続時のポート番号を22から変更
sudo vi /etc/ssh/sshd_config.d/default.conf

新しいSSH接続用のポート番号を追記

Port 12345
# 再起動
sudo systemctl restart ssh

# SSH接続を行うポート番号を解放
sudo ufw limit 12345

# 読み込み&確認
sudo ufw reload
sudo ufw status

# ssh.socket の設定
sudo vi /lib/systemd/system/ssh.socket

下記を記載

ListenStream=12345
# 確認
sudo ss -tuln | grep 12345

# 22を塞ぐ
sudo ufw delete limit 22

# 読み込み&確認
sudo ufw reload
sudo ufw status
  • 設定したポート番号でSSH接続ができることを確認する
  • 22番でSSH接続出来ないことを確認する

fail2ban のインストール

sudo apt install fail2ban

# よしなに設定
sudo vi /etc/fail2ban/jail.conf

# 再起動および自動起動設定
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban

# 再起動
sudo reboot

gsutil のインストール

  • 旧サーバーのDBダンプファイルの受け渡しは Google Cloud Storage 経由で行う
  • DBの日時バックアップも Google Cloud Storage 上に保存する
  • 上記の実現のため gsutil を導入する
sudo apt install -y apt-transport-https ca-certificates gnupg curl
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list

sudo apt update
sudo apt install -y google-cloud-sdk

# インストール確認
gsutil version

# Google Cloud へログイン (ブラウザでログインしてキーを入力)
# ログインは暫定対応 (将来的にサービスアカウントキーに切り替えたい)
gcloud auth login

# デフォルトプロジェクトの設定
gcloud config set project your-gcp-project

# 動作確認 (バケット一覧を表示)
gsutil ls

Iceshrimp の動作に必要なソフトウェアのインストール

Git LFS

curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt update
sudo apt install -y git-lfs

Node.js

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt update
sudo apt install -y nodejs npm

# インストール確認
node -v
npm -v

# corepackをインストール
sudo npm install -g corepack

PostgreSQL

sudo apt install -y postgresql postgresql-contrib

# 起動&自動起動設定
sudo systemctl start postgresql
sudo systemctl enable postgresql

Valkey

sudo apt install -y valkey

# 確認 (PONG が帰ってくればOK)
valkey-cli ping

# 起動
sudo systemctl start valkey

libvips

sudo apt install -y libvips

FFmpeg

sudo apt install -y ffmpeg

Caddy

# Caddy の公式リポジトリを追加
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list

sudo apt update
sudo apt install -y caddy

# 設定ファイルを編集
sudo vi /etc/caddy/Caddyfile

下記を記載

your.domain {
	reverse_proxy localhost:3000
}
# 再起動
sudo systemctl restart caddy

# 確認&自動起動設定
sudo systemctl status caddy
sudo systemctl enable caddy

Iceshrimp のインストール

# Git LFS のインストール&確認
git lfs install
git lfs --version

# リポジトリをクローン
git clone https://iceshrimp.dev/iceshrimp/iceshrimp.git

移行前サーバーからデータ取得

# サービス停止
sudo systemctl stop iceshrimp nginx

# 現在のサーバーでデータベースのバックアップを作成
sudo -u postgres pg_dumpall | gzip -c > /your/dir/backup.gz

# Google Cloud Storageにバックアップをアップロード
cd /your/dir
gsutil cp backup.gz gs://your-gcs-bucket/backup.gz

移行先サーバーにデータ移行

# バックアップを取得
gsutil cp gs://your-gcs-bucket/backup.gz .

# ファイル展開
gunzip -k backup.gz

# リストア
psql -U postgres < backup

Iceshrimp 設定ファイルの作成

  • 既存の設定ファイルは Calckey 時代からのものなので、せっかくなので設定ファイルは作り直す
cd /home/user/iceshrimp/.config

cp example.yml default.yml
vi default.yml # よしなに設定を記載

ビルド・起動

cd /home/user/iceshrimp

# 依存関係のインストール
corepack enable
corepack prepare --activate
yarn

# build
yarn build

# マイグレーション
yarn run init

# 起動
NODE_ENV=production yarn run start

起動コマンドでエラーが出ないことを確認して Ctrl + C で停止

service設定

# systemdサービスファイルの作成
sudo cp /home/user/iceshrimp/docs/examples/iceshrimp.service /etc/systemd/system/
vi /etc/systemd/system/iceshrimp.service

# よしなに設定 (既存の設定の中身を見るとよさそう)

# リロード
sudo systemctl daemon-reload

# 起動&自動起動設定
sudo systemctl start iceshrimp
sudo systemctl enable iceshrimp

DNS設定

  • calc.rettuce.page の向き先を既存サーバーから新規サーバーに変更する

旧サーバーの停止

  • 旧サーバーのインスタンスを停止
  • 各種スケジュールを無効化
  • 静的IPアドレスを解放

バックアップ用Scriptの作成

DBバックアップ

  • 前回の構築時と同様にscriptを作成・cronを設定する

サーバー再起動設定

  • 1日1回、サーバーの再起動を実行する
  • cron のログが出力されていないのであわせて設定
sudo vi /etc/cron.d/restart

下記を記載

30 5 * * 0 /usr/sbin/shutdown -r now
sudo systemctl restart cron

cron のログ取得

  • 出力が設定されていなかったので出力するようにする
# ログが出力されていないので設定
sudo vi /etc/rsyslog.d/50-default.conf

# 下記行のコメントアウトを外す
# cron.* /var/log/cron.log

# 再起動
sudo systemctl restart rsyslog

雑感

1日かけてサーバーの設定をして、1日かけてデータ移行をしての2日で完了させる予定でしたが、なんやかんや1日で完了したのでよかったです。

今のところは動作に問題はなさそうで、かつかなり軽快に動いているのもありがたいですね。