5 minutes
Iceshrimpサーバー GCP→VPS移行の走り書き
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 にして特段困ることはないのでは? と思われたのでついでに更新していきます。
作業要約
- 新しいサーバーに普通にIceshrimpを構築する
- データベースだけ移行前サーバーから移行後サーバーにリストアする
- メディアファイルは Google Cloud Storage 上にあるものを継続利用するため作業なし
- 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日で完了したのでよかったです。
今のところは動作に問題はなさそうで、かつかなり軽快に動いているのもありがたいですね。
2477 Words
2025-05-06 19:15 +0900