さくらのVPSにデプロイ
— Ubuntu、nginx、gunicorn でサイトを公開した記録
自分のPCで動いていたRSS収集・検索サイトを、デプロイ(サーバーにプログラムを置いて公開すること)するまでの記録です。さくらのVPS(サーバーを借りられるサービス)を契約し、Ubuntu(サーバーでよく使われるLinuxの一種)上で gunicorn(本番用のWebサーバーソフト)と nginx(Webサーバーソフト)を動かして公開しました。FTPでの公開経験はありましたが、Linuxサーバーへの接続や コマンドライン(文字だけで操作する画面)は初めて。そのやり取りを具体的に交えながら書きます。
1. 「サイトを公開するにはサーバーが必要」
自分のPCで動くサイトができ、「これを多くの人に使ってもらいたい」となりました。AIに聞きました。
「VPS(仮想専用サーバー=24時間動くコンピュータを借りるサービス)かレンタルサーバーが必要。自分でサーバーを触りたいならVPSが向いている」とアドバイスが返ってきました。料金や手軽さを比較し、さくらのVPS(サーバーを借りられるサービス)を契約。OS(コンピュータを動かす基本ソフト)は Ubuntu 24.04 amd64 を選びました。「初心者におすすめのLinux」とよく書いてあったからです。契約後に届くメールに、サーバーのIPアドレス(住所のような数字)が書いてありました。
2. サーバーにログインする:SSH とパケットフィルター
サーバーに接続する方法がわかりませんでした。
「SSH(遠くのサーバーに安全にログインする仕組み)を使う。PowerShell に ssh ubuntu@サーバーのIP と打つ」と教えてもらいました。実際に打つと「接続が拒否されました」と出る。調べると、さくらのVPSでは パケットフィルター(不正なアクセスを防ぐための壁=ポートを開けないと外から届かない)を設定する必要がありました。コントロールパネルで「SSH(22番ポート)を許可」にし、再度 ssh ubuntu@○.○.○.○ を実行。初めてログインできたときは、真っ黒な画面に ubuntu@〜$ と表示されて、「つながった」と実感しました。
3. プログラムをサーバーに送る:scp
自分のPCにある make-001 フォルダを、サーバーにコピーする必要があります。FTPは使ったことがありましたが、Linuxでは別の方法が一般的と聞きました。
「scp(SSH を使ってファイルをサーバーに送るコマンド)が簡単。SSH が通っていれば使える」と返ってきました。scp -r make-001 ubuntu@サーバーのIP:~/ でフォルダごと送り込みます。-r は「フォルダごと再帰的に」という意味。転送後、サーバー側で ls(ファイル一覧を表示するコマンド)を打つと、make-001 が表示されました。FTPソフトを別途用意しなくて済んだのがありがたかったです。
4. サーバー上でPython環境を整える:venv と pip
サーバーにPythonは入っていましたが、ライブラリは入っていません。プロジェクト用の環境を作る必要があります。
python3 -m venv venv で venv(このプロジェクト専用の環境を分ける仕組み)を作成。source venv/bin/activate で有効化すると、プロンプトの先頭に (venv) と出ます。その状態で pip install -r requirements.txt(必要なライブラリを一括で入れるコマンド)を実行。最初は ensurepip(venv に pip を入れる部分)のエラーが出ました。「apt install python3-venv でパッケージを入れてから venv を作り直す」と教えてもらい、解決しました。
5. ブラウザで開けるようにする:gunicorn と 0.0.0.0
サーバー上で python app.py や flask run で起動しても、自分のPCのブラウザでは「このページに到達できなかった」となります。
原因は二つありました。一つは、Flask の開発用サーバーは本番向きではないため、gunicorn(本番用のWebサーバーソフト)を使う必要があること。もう一つは、127.0.0.1(自分自身だけに受け付ける設定)だと外部から届かないため、0.0.0.0(外部からもアクセスできるようにする設定)に バインド(プログラムが受け付ける窓口を開くこと)すること。gunicorn -w 1 -b 0.0.0.0:5000 app:app で起動。あわせて、パケットフィルターで 5000番ポート(通信の窓口番号)を開ける必要がありました。ここまで直すと、http://サーバーのIP:5000 でサイトが表示されました。
6. Internal Server Error とタイムアウト
表示はされるようになったものの、「RSSを更新」ボタンを押すと Internal Server Error(サーバー側のエラー表示)が出ます。
gunicorn のログを確認するようアドバイスを受け、調べると タイムアウト(待ち時間の上限、当初は30秒)に引っかかっていました。50件以上のRSSを取得するのに数分かかるため、30秒で打ち切られていたのです。「gunicorn -t 600 でタイムアウトを10分に延長できる」と教えてもらい、さらに「和訳をスキップするオプションを追加して、取得時間を短くする」ことも提案されました。環境変数 SKIP_TRANSLATION_ON_UPDATE=1 で和訳をスキップし、数分で完了するようにしました。
7. ポート番号なしで開けるように:nginx とリバースプロキシ
ドメインを取得し、DNS でサーバーのIPを指定しました。ただ、http://aiaicursor.com:5000 のようにポート番号を付けないと開けません。「:5000」なしで開きたい。
「nginx(Webサーバーソフト)を リバースプロキシ(外から来たアクセスを裏のプログラムに渡す仕組み)として使う。80番ポート(普通のWebアクセス用の窓口)で受け付け、裏側の5000番で動くFlaskに転送する」と教えてもらいました。apt install nginx でインストールし、/etc/nginx/sites-available/ に設定ファイルを作成。proxy_pass http://127.0.0.1:5000 で転送先を指定し、nginx -t で設定確認、systemctl reload nginx で反映。これで http://aiaicursor.com だけでアクセスできるようになりました。
8. 「セキュリティ保護なし」を解消:HTTPS化
ブラウザのアドレスバーに「接続はプライベートではありません」や「セキュリティ保護なし」と表示されるのが気になりました。
「Let's Encrypt(無料で証明書を発行してくれるサービス)と certbot(証明書を自動で取得するツール)を使う」と提案がありました。apt install certbot python3-certbot-nginx でインストールし、certbot --nginx -d aiaicursor.com を実行。メールアドレスを入力し、規約に同意すると、数分で SSL証明書(「このサイトは本物です」と証明するもの)が取得され、HTTPS(通信を暗号化した安全な接続)でアクセスできるようになりました。証明書は90日ごとに自動更新されるため、手動での更新は不要です。
9. 24時間動かし続ける:systemd
いままで、SSH でサーバーにログインした状態で gunicorn を起動していました。SSH を閉じるとプログラムも止まります。サーバーを再起動したら、また手動で起動し直す必要があります。
「systemd(Linuxでプログラムを常駐サービスとして動かす仕組み)でサービスとして登録する」と教えてもらいました。/etc/systemd/system/ に .service ファイルを作成。中身は、起動コマンド(gunicorn のパスとオプション)、作業ディレクトリ、再起動設定など。systemctl daemon-reload で設定を読み込み、systemctl enable サービス名 で起動時に自動起動、systemctl start サービス名 で今すぐ起動。これで、SSH を閉じても、サーバーを再起動しても、プログラムが動き続けるようになりました。ここまで来て、本当の意味で「公開」できたと感じました。
10. 振り返り:一つずつ乗り越えた
FTPでの公開経験はありましたが、SSH、scp、gunicorn、nginx、certbot、systemd はすべて初めてでした。壁にぶつかるたびに「こういう状況です。どうすればいい?」とAIに聞き、返ってきた手順を一つずつ実行する。エラーが出たら、そのメッセージをそのまま貼って「これが出た」と伝える。そうやって進めていくと、気づけば https://aiaicursor.com でサイトが公開されていました。
「立ち上げストーリー」「プログラム構築の記録」とあわせて読むと、プログラム作成からデプロイまでの一連の流れがつかめると思います。まずはVPSを契約してSSHでログインするところから、試してみてください。
← 立ち上げストーリー
← プログラム構築の記録
← ボタン1つデプロイの記録
← デプロイでまたハマった話
← ログイン設定の記録
← 改善記録
← ファイル紹介の使い方
← OGP・SEOの記録
← 統合ログインの設計・経緯
← Search Console・サイトマップ
← 環境変数・.env の管理
← Git 入門・インストール
← インストール後に Git で行う設定
← カード神経衰弱の記録
← 異世界シューティングの記録
← 異世界シューティングの難易度
← 異世界戦記(全画面・迷路レイアウト)の記録
← 複数人でのゲーム進行
← 異世界衰弱(不具合の修正)
← 異世界衰弱(機能別フローチャート)
← 異世界ポイントの活用について
← 異世界ポイント市場の実装記録