はじめに
個人開発のモバイルアプリ(Flutterフロントエンド + Dartバックエンド + PostgreSQL + Firebase Authentication)において、VPSインスタンスをゼロから立ち上げてバックエンド環境を構築するまでの手順をまとめました。自身のサーバー再構築用マニュアルを兼ねて、コントロールパネルの選択肢からコマンドライン操作、セキュリティ設定まで順番に記録しています。
全体のシステム構成
- クライアント: Flutter(iOS / Android)
- 認証基盤: Firebase Authentication(IDトークン検証)
- サーバー環境: KAGOYA Cloud VPS(Ubuntu Server 24.04 LTS)
- バックエンド: Dart(REST APIサーバー)
- データベース: PostgreSQL
STEP 1:KAGOYA Cloud VPS でインスタンスを作成する
KAGOYAのコントロールパネルにログインし、「インスタンス追加」から以下の設定値を選択してサーバーを作成します。
1. OSとアプリケーションの選択
- OS: Ubuntu Server 24.04 LTS(GUIを含まない軽量なServer版かつ情報量の多いLTSを選択)
- アプリケーションセットアップ: OS標準(アプリケーションなし)
- 注意点: デフォルトで選択されやすいLAMP(KUSANAGI)やWordPress等のテンプレートは、WebサーバーやDBの設定が競合するため必ず外してプレーンなOSにする。
2. スペックと認証キーの設定
- プラン(スペック): メモリ2GB以上(DartプロセスとPostgreSQLを同居させるため、余裕を持たせるなら4GB推奨)
- ログイン用認証キー: 「キーペアを作成」を選択し、生成された秘密鍵ファイルをローカルPCの安全なフォルダへ保存する。
3. 詳細オプションの設定
- virtio: ON(ディスク読み書きとネットワーク通信を高速化するため有効化)
- コンソールログインパスワード: 推測されにくいパスワードを設定して控える(SSH接続できなくなった際の緊急コンソールログイン用)
- ユーザーデータ: 空欄(未入力)
-
インスタンス名: 任意の識別名(例:
myapp-server) - 備考: 空欄(必要に応じて構築日などをメモ)
作成ボタンを押して数分待ち、ステータスが「稼働中」になったら表示されるIPアドレスを控えます。
STEP 2:ローカルPCからサーバーへSSH接続する
ダウンロードした秘密鍵を使って、手元のターミナル(またはVS Codeのターミナル)からサーバーへ初回接続します。
1. 秘密鍵の権限変更(Mac / Linux の場合)
秘密鍵のパーミッションが開きすぎているとSSH接続が拒否されるため、所有者のみ読み取れるように変更します(Windowsの場合はユーザーフォルダ配下の適切な場所に配置すればそのまま利用可能です)。
mkdir -p ~/.ssh
mv ~/Downloads/ダウンロードした鍵ファイル名 ~/.ssh/myapp_key.pem
chmod 600 ~/.ssh/myapp_key.pem
2. SSH接続の実行
KAGOYAのUbuntu標準環境では、初回は root ユーザーで接続します。
ssh -i ~/.ssh/myapp_key.pem root@サーバーのIPアドレス
接続確認のメッセージ(Are you sure you want to continue connecting?)が表示されたら、yes と入力してログインします。
STEP 3:Ubuntuの初期設定とセキュリティ強化
サーバーに入れたら、不正アクセスを防ぐための基本セキュリティ設定とパッケージ更新を行います。
1. パッケージの更新と一般ユーザーの作成
普段の作業で root を直接使わないよう、作業用ユーザー(例:appuser ※実際の運用では推測されにくい独自の名前を設定)を作成して管理者権限(sudo)を付与します。
apt update && apt upgrade -y
adduser appuser
usermod -aG sudo appuser
2. 一般ユーザーへのSSH公開鍵のコピー
root に登録されている公開鍵を作業用ユーザーへ引き継ぎ、そのまま鍵認証でログインできるようにします。
rsync --archive --chown=appuser:appuser ~/.ssh /home/appuser
3. SSH設定の変更(rootログインとパスワード認証の禁止)
SSHの設定ファイルを編集し、セキュリティを高めます。
nano /etc/ssh/sshd_config
ファイル内の該当項目を以下のように変更(または追記)して保存します。
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
設定を反映させるため、SSHサービスを再起動します。
systemctl restart ssh
※この時点で現在のターミナルは閉じず、別ウィンドウのターミナルを開いて作成した一般ユーザー(appuser)でログインできるか必ず確認してください。
4. UFW(ファイアウォール)の有効化
必要な通信のみを許可するようにOS標準のファイアウォールを設定します。
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8080/tcp
sudo ufw enable
sudo ufw status
※8080番ポートはバックエンドの疎通確認用です。Nginx等のリバースプロキシを前段に置く場合は80番と443番のみの開放にします。
STEP 4:PostgreSQLのインストールとDB構築
アプリケーションのデータを保存するためのPostgreSQLをセットアップします。
1. PostgreSQLのインストールと起動確認
sudo apt install -y postgresql postgresql-contrib
sudo systemctl status postgresql
2. DBユーザーとデータベースの作成
PostgreSQLの操作ユーザーに切り替えて、アプリ用のロールとデータベースを作成します(ユーザー名やDB名は任意の名称に変更してください)。
sudo -u postgres psql
PostgreSQLのプロンプトが開いたら、以下のSQLを実行します。
CREATE USER sample_db_user WITH PASSWORD '強力なパスワードを設定';
CREATE DATABASE sample_db OWNER sample_db_user ENCODING 'UTF8';
\q
3. サンプルテーブルの作成
作成したデータベースに接続し、Firebase AuthenticationのUIDと紐付けるための最小構成のユーザーテーブルを作成します。
psql -U sample_db_user -d sample_db -h localhost
CREATE TABLE users (
id SERIAL PRIMARY KEY,
firebase_uid VARCHAR(128) UNIQUE NOT NULL,
nickname VARCHAR(50) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
\q
4. クライアントツールからの安全な接続確認
サーバー側でPostgreSQLの外部公開ポート(5432番)を開ける必要はありません。手元のPCのDBクライアントツール(A5:SQL Mk-2やpgAdminなど)からは、**SSHトンネル(SSHポートフォワーディング)**機能を使ってSTEP 2の秘密鍵を指定し、DBホスト名を localhost として接続すると安全にテーブルを操作できます。
STEP 5:DartバックエンドとFirebase連携の構築
1. Dart SDKのインストール
公式リポジトリを追加してDart SDKをインストールします。
sudo apt-get update
sudo apt-get install -y apt-transport-https wget gpg
wget -qO- [https://dl-ssl.google.com/linux/linux_signing_key.pub](https://dl-ssl.google.com/linux/linux_signing_key.pub) | gpg --dearmor -o /usr/share/keyrings/dart.gpg