「Claude Codeに任せたら全部やってくれた!」
みなさんも毎日経験していますよね。すごい時代がやってきました。
以下は、知識がほぼゼロの状態から、たった数時間で インフラ(VPSやDocker)の知識を身につけてから(ここが重要) 、Rails 8アプリを本番環境(さくらVPS)に全自動デプロイした過程の記録です。
「面倒なことは全部勝手にやってくれるRails 8に手を出してみたいけれど、インフラ構築やデプロイで足踏みしている」ソロプレナーや少人数スタートアップの皆さんにとってはとても具体的な記事ですし、そうでない方にとっても 「メタ指示書駆動」 (AIが命名しました)による作業がうまく回った実例としてご参考になるかもしれません。
結論から言うと、私自身はほとんど手を動かしてコードを書いたりコマンドを叩いたりしていません。 やったことは「 AIへの指示書(Markdownファイル) を育てて、AI自身に作業させること」だけです。
「Claude Code」と「Comet(AIブラウザ)」を使った「メタ指示書駆動」のリアルなプロセスを共有します。
(念のための確認ですが、以下の文章はAIを補助的に使って書いています。「AI臭い」表現もありますが、ご容赦下さい)
1. 「明日、顧客に見せなきゃいけない!」 vs 「AI丸投げの罠」
私は現在、 「Science Planner(理科手帳)」 というアプリを開発しています。
これは、超多忙な小学校の先生方が、理科の時間割や実験の段取りをスマホで10秒で確認できるアプリです(ちなみにホームページなどはまだ全然作っていません)。
事の発端は「明日(2月27日)、実際の先生(顧客)にα版を見せてヒアリングをしたい」という状況でした。ローカル環境ではなく、スマホから実機で触ってもらう必要があります。
今回、インフラとして 「Rails 8 + Kamal + さくらVPS」 を選んだのには明確な理由がありました。
ソロプレナーとしてHerokuなどのPaaSの ランニングコストを抑えつつ (さくらVPSなら格安)、 最速で デプロイできる構成だと踏んだからです。そもそもRailsは 「面倒な設定はフレームワークに任せてビジネスに集中しなさい」 という思想を持っており、それに沿って私は顧客開発に集中したかったのです。
しかし、私には大きな壁がありました。
「VPS、Docker、Kamalについて、名前は聞いたことがあるが、知識はほぼゼロ」 だったのです。
- さくらVPS? Visual Positioning Systemのこと?(違うでしょ)
- Docker? どっからインストールするの?(オヤジか!)
- Kamal? Rails 8の標準らしいけど、どう使うの?(そもそも何語?)
これをイチから勉強して、明日までにデプロイを完了させる。一人で開発するソロプレナーにとって、これは絶望的なタイムリミットでした。
「ならAIに全部丸投げして作ってもらえばいいのでは?」 と思うかもしれません。しかし、私には苦い経験がありました。
いわゆるバイブコーディングや「指示しただけでアプリを作ってくれるサイト」を試した際、一見ちゃんと動いているように見えても、細かい挙動やロジックがおかしいことがほとんどだったのです。
内容を理解せずにAIで実装を進めるのは危険であり、行き当たりばったりで作業を進めさせるのは結果的に時間を無駄にすると痛感していました。
2. 計画フェーズ:「全自動化」ではなく「メタ指示書による半自動化」
時間が圧倒的に足りない中、私が取った手段は 「Claude Code(以下、CC)」と「Comet(AIブラウザ)」を徹底的に使い倒すこと でした。
ただし、「よしなにデプロイして」と丸投げしてもAIは途中で迷子になります。ネット上にある先人たちの記事に書かれている 「ハマりどころ」 を先に押さえておかなければ、結局行き詰まるのです。
そこで、 「メタ指示書駆動」 というアプローチをとりました。これは、TDD(テスト駆動開発)の考え方をAIのタスク実行に応用したものです。
- まずは ザックリとしたDoD(Definition of Done=完了の定義) をMarkdownファイルに書く。
- そのファイルをCCに渡して 「これを満たして」 と指示し、調査、文書作成などをさせる。結果は同じファイルに記入してもらう。
- 出てきた文書を見て、自分(人間)が 「ここが足りない」「ここを補足して」 とDoDを修正・追加し、再実行してもらう。
このループを、私が 「なるほど、自分がやるべきことが(概念的には)完全に理解できた」 と思えるまで繰り返しました。
ここで私は、重要なトレードオフ(割り切り)をしました。
それは、 「本当に細かいことの理解は諦める。大まかな仕組みと事前のハマりどころさえ理解しておけば、実際の解決策はAIに任せる(半自動化する)」 という判断です。
💡 コラム:中学生にもわかる「デプロイの全体像」
インフラ知識がゼロだった私は、まずAIに「これからやることの全体像を、中学生にもわかるように説明して」と指示しました。そこでCCが教えてくれたのが、この 「宅配便と引っ越し」のたとえ話 です。
- デプロイとは?:自分が作ったアプリを、インターネット上の「お店」に並べて誰でも使えるようにすること。
- さくらVPSとは?:インターネット上にある「自分専用の空き部屋(サーバー)」。24時間電気がついていて、世界中からアクセスできる。Visual Positioning Systemではない。
- Docker(コンテナ)とは?:アプリと必要な道具を全部詰めた「引っ越しの段ボール箱」。この箱ごと運べば、どの部屋でもすぐにアプリが動く。
- Docker Hubとは?:作った段ボール箱を預けておく「貸し倉庫」。
- Kamal(カマル)とは?:「①アプリを箱に詰めて → ②倉庫に預け → ③サーバーの部屋に届けて箱を開ける」という作業を、コマンド1つで全自動でやってくれる「超優秀な引っ越し業者」。
- データの永続化とは?:Dockerの「段ボール箱」は使い捨てです。アプリを新しくするたびに、古い箱は捨てて新しい箱に入れ替えます。しかし、箱の中に「ユーザーのデータ(SQLiteのデータベース)」を入れたままにすると、箱を捨てた瞬間にデータも全部消えてしまうという大問題が起きます。
このような大枠の全体像が掴めたおかげで、私は 「今、AIに何をさせているのか」 を(概念的には)完全に理解しながらメタ指示を出すことができました。
3. 作業フェーズ:メタ指示書が完成したら、AI用プロンプトを書かせる
DoDのループを回し、「さくらVPS(1GBプラン/石狩)を借りて、手動でDocker Hubリポジトリを作って、Kamalでサブドメイン+SSL設定でデプロイするのがベスト」という方針が固まりました。
ここで自分で作業を始めるのではなく、 「今決まった手順を実行するための、Comet用とCC用のプロンプトを書いて」 と指示しました。
出てきたプロンプトは、例えばこんな感じです。
Cometへのプロンプト例:
さくらのVPS(https://vps.sakura.ad.jp/)で以下の条件でVPSを契約してください:
- プラン:1GB / リージョン:石狩 / OS:Ubuntu 24.04 / 支払い:月払い
契約完了後、VPSのIPアドレスを教えてください。
あとは、これをそのままAIに突っ込むだけ・・・とまでは、いきませんでした。
AIブラウザ(Comet)が弾かれた「最後の1クリック」
ブラウザ上の作業(VPSの契約、ポートの開放、お名前.comでのDNS設定など)は、AIブラウザのCometに任せました。見ているだけで勝手に画面が遷移し、設定が完了していくのは快感です。
しかし、1箇所だけCometでは突破できない壁がありました。 さくらVPSの申し込みの「最終決定ボタン」です。
おそらくBotやUser-Agentを検知するセキュリティ機構が働いたのだと思います。結局、人間である私がChromeを開き、Cometが進めたのと同じ画面まで行き、自分でポチッと最終決定ボタンを押しました。
AI全盛の時代でも、最後の一押しは人間がやる泥臭さ。 「無理に100%の全自動化にこだわらず、人間が要所で介入する(半自動化)」 という心の準備をしておけば、ここでイライラすることなく、スッと手作業に切り替えて前に進むことができます。
CCによるターミナル作業の全自動化
VPSが用意できたら、次はターミナルでの作業です。
ここでも、CCに対して「先ほど作ったDoD(指示書)に従って作業して」と投げるだけ。同じように、作業が進むたびにチェックリストが埋まるように指示をしました。
私はCCが指示待ち(エラーでの確認など)になったときに通知が来るようにHooksを設定し、別の作業(顧客に見せる資料作りなど)をしていました。しかし・・・
「まだ来ないの?」
と思いつつ別の作業をしていると、だいぶ時間が経ってから通知が来ました。
ターミナルを開いてみると、そこには驚くべき光景が広がっていました。
全部、終わっていたのです。
VPSへのSSH鍵設定、パスワードなしsudoの構成、Dockerのインストール、Docker Hubへのログイン、kamal setupの実行、そしてSQLiteの永続化確認まで。すべてが私の代わりに完了していました。途中でエラーが出ても、CCが勝手にログを読んで自己解決(トラブルシュート)してくれていたのです。
まさに青天の霹靂でした。ちょっぴり罪悪感もあったのは否定できません。
AIに任せた高度な判断
前述の通り、私は「本当に細かいことの理解は諦める」と決めていました。大まかな仕組みさえ理解しておけば、いわゆる「ハマりどころ」への具体的な対処はAIに任せた方が良いと考えているからです。
CCが調査・実践してくれた「ハマりポイントと解決策」をいくつか紹介します。恥ずかしながら私は深いところまではわかっていませんが、これらは次にRails 8 + Kamalデプロイをやる方(人とは限らない)の参考になるはずです。
-
さくらVPSはrootでSSHできない問題
Kamalはデフォルトでrootユーザーとしてサーバーにログインしようとしますが、さくらVPSのUbuntuはセキュリティ上それを弾きます。CCはこれを事前調査で検知し、deploy.ymlにssh: user: ubuntuを追記してさらっと回避しました。 -
SQLiteのデータがデプロイのたびに消える問題(最重要)
Dockerコンテナは使い捨てです。DBをホストにマウントすると権限エラーが起きやすいため、CCはNamed Volume(science_planner_storage:/rails/storage)を採用し、安全にデータを永続化する設定を組み込んでいました。 -
「令和は初手からサブドメイン+SSL」
大胆なフレーズですが、IPアドレスでデプロイしてから後でSSL化すると、Rails側のforce_sslの修正など複数箇所の手戻りが発生します。「既存ドメインのサブドメインを初手で切り、Kamal ProxyにLet's Encryptの自動SSL更新を任せるのがベスト」という先人の知見をCCが見つけてきて、最初からその構成でデプロイを完遂しました。
4. 学び:「私がやるべき事は技術開発ではなく、顧客開発」
無事にスマホから本番URLにアクセスでき、鍵マーク(SSL)が輝いているのを見たとき、私は率直にこう思いました。
「まさに魔法!先人の苦労のおかげで、本当に感謝しかない!私がやるべき事はソフト開発ではなくて、顧客開発だ!」
インフラ知識がほぼゼロの状態から、本番環境への自動デプロイが完了するまでわずか数時間(しかも待っている間は他の仕事をしていました)。私がやったのは、AIと壁打ちして「何をすべきか(DoD)」のメタ指示書を定義し、ブラウザが路頭に迷ったときに軌道修正しただけです(SSHキーの導入はちょっと作業が必要でした)。
少人数スタートアップやソロプレナーにとって、Rails 8とAIエージェント(CC + Comet)の組み合わせは、もはや 「極めて合理的で優秀なエンジニアを一人雇っている」 のと同じです。
インフラ構築で何日も費やす時代は終わりました。私たちは、浮いた時間で「顧客の本当の課題は何か?」「このアプリで本当に先生たちの多忙は解決できるのか?」という、 人間にしかできない「顧客開発」 にフルコミットできるようになったのです。
最後に:いっしょにCCで世の中の問題を解決しませんか?
私は普段は記事を書く時間は全然ありません。しかしこの記事は、Rails 8の知見を惜しみなく公開して下さっている方々への感謝と、Claude Code+Rails 8のノウハウがさらに増えて、世の中の問題解決がもっと増えてほしいという思いで書きました。
熱意さえあればその問題は解決できる。そういう時代が来たのだと思います。
もし、「この記事のここ、もっとこう書いた方がいいよ」「今のKamalならこういうやり方もあるよ」というツッコミがあれば、ぜひこの記事に対してコメントやDMや修正リクエストで教えてください。
また、「Claude Code + Rails 8を使った高速開発」をテーマにした勉強会 の開催を考えています(すでに身内で1回だけやりました)。「AIに指示書を作らせて自動化するフロー」を実際に見せ合って共有し合うような、実践的な場にしたいです。
ご興味のある方は、ぜひ以下のいずれかの方法で 「勉強会興味あり」 とメッセージを送ってください!
現状の課題感や、今作っているアプリの話など、カジュアルに雑談ベースでお話しできたら嬉しいです。
「とりあえずローカルで動いた」で終わらせず、一気にユーザーテストまで駆け抜けましょう。ご連絡をお待ちしております!
参考:本番デプロイを支えてくれた先人たちの知見
私がAI(Claude Code)に調査を依頼した際、CCはインターネット上の数多くの素晴らしい記事を読み込み、そこから最適な手順を導き出してくれました。
「令和は初手からサブドメイン+SSL」「さくらVPSの固有の罠」など、自力で踏み抜いていたら何日も費やしていたであろう落とし穴を事前に回避できたのは、こうした知見を公開してくださっている先輩エンジニアの皆様のおかげです。
本当にありがとうございます!
【Kamal 2 + さくらVPS + Rails 8 の実践ノウハウ】
-
石原 淳也 さん(株式会社まちクエスト)
さくらVPSにRails 8アプリをKamal 2でデプロイする
※「初手からサブドメイン+SSL初期有効化」という令和のベストプラクティスを学ばせていただきました。 -
駒形さん(FJORD BOOT CAMP)
Rails 8をKamalでデプロイする -
e601201 さん(Zenn)
Rails8 + Kamal2 + さくらVPSでデプロイする手順
※「DockerHubリポジトリは手動で事前作成が推奨」という知見に救われました。 -
naofumik さん(Zenn)
Kamal2 + さくらVPSでのデプロイ備忘録
【SQLiteの永続化・Kamal公式ドキュメント】
-
Erik Minkel さん
Deploy an app with Kamal, SQLite and ActiveStorage -
Rails Discussion
Kamal2 deploy of v8.0.0 app with SQLite... resets volume on every deploy -
公式ドキュメント
*Kamal公式ホームページ
付録:そのまま使える「AI自動デプロイ」用プロンプト
私が実際にAI(Comet + CC)に渡して、全自動デプロイを成功させたチェックリストの雛形です。
ご自身のプロジェクトにコピー&ペーストし、環境に合わせて< >の部分を書き換えるだけで、AIが自律的にインフラ構築とデプロイを進めてくれます。
気をつけて頂きたいのですが、Cometはよく路頭に迷います。
動きを見ていて「あとは自分でできるな」と思ったら早々にAIを止めて手作業で引き継ぐのがコツです。あと、セキュリティも気をつけましょう。「これは手作業でやった方がいいかも」と感じたら、同じく早々にAIを止めて手作業やChromeで進めた方が良いと思います(私個人は 「すべて記録されている」 という意識で使っています)。
ブラウザ操作の部分
1. さくらVPSの契約
まずはサーバーを借りるための指示です。
※本編でも触れましたが、最後の「申し込み確定ボタン」だけはBot検知で弾かれたため、ここだけは私がChromeで引き継いでポチッと押しました。
さくらのVPS(https://vps.sakura.ad.jp/)で以下の条件でVPSを契約してください:
- プラン:1GB
- リージョン:石狩
- OS:Ubuntu 24.04
- 支払い:月払い(クレジットカード)
契約完了後、VPSのIPアドレスを教えてください。
2. さくらVPSの初期設定(パケットフィルター・SSH鍵)
Kamalでのデプロイに必要なポートの開放と、SSH鍵の登録を自動でやってもらいます。
さくらのVPSコントロールパネル(https://secure.sakura.ad.jp/vps/)にログインし、以下を行ってください:
1. SSHキー管理から公開鍵を追加
2. OSを再インストールし、先ほどのSSHキーを追加
3. 契約したVPSの「パケットフィルター設定」で以下のポートを許可してください:
- SSH(ポート22)
- Web(ポート80)
- Web(ポート443)
最後に、VPSコントロールパネルでVPSを起動させて下さい。
3. Docker Hubの準備(リポジトリ手動作成)
Kamalの自動作成に頼らず、事前にDocker Hubの「倉庫」を手動で作っておくための指示です。最後に、作成したユーザー名とPAT(トークン文字列) を記録しておきます。
Docker Hub(https://hub.docker.com/)で以下を行ってください:
1. アカウントを作成(またはログイン)
2. 「Create Repository」で「<あなたのプロジェクト名>」という名前のPrivateリポジトリを作成
3. Account Settings → Security → 「New Access Token」でRead & Write権限のPATを作成
4. DNS設定(サブドメインの追加)
サブドメインとSSLを初手から有効化するために、ドメイン管理サービス(例:お名前.com)でAレコードを追加させます。
設定完了後のスクリーンショットをCCに見せて、キチンと設定できているか確認させると良いでしょう。なお、DNS反映には数分〜最大24時間かかることがあります(私の場合はすぐに反映されました)。
お名前.com(https://navi.onamae.com/)にログインし、
既存ドメインにサブドメインのAレコードを追加してください:
- ドメイン管理 → DNS設定 → 対象ドメインを選択
- レコード追加:
- ホスト名:<希望するサブドメイン名(例:alpha)>
- タイプ:A
- 値:<VPSのIPアドレス>
- TTL:3600
デプロイ用DoDチェックリスト(コピペ用)
以下は、フェーズごとにAIに達成させるべき「完了の定義(DoD)」です。最後のメタ指示書と一緒にCCに読み込ませてください。
5. さくらVPSの初期セットアップ(インフラ構築)
### Definition of Done(VPS初期セットアップ)
- [ ] `ssh ubuntu@<あなたのVPSのIPアドレス>` でローカルから鍵認証接続できる
- [ ] `sudo` がパスワードなしで実行できる状態になっている(`/etc/sudoers.d/ubuntu` の設定)
- [ ] サーバーにDockerがインストール済み(`curl -fsSL https://get.docker.com | sh`)
- [ ] dockerグループに `ubuntu` ユーザーが追加済み(`sudo usermod -aG docker ubuntu`)
- [ ] サーバー上で `docker run hello-world` が ubuntu ユーザーで成功する
- [ ] 以上のプロセスで何をやったのかが、中学生にもわかるように説明されている
6. Kamal設定ファイルの編集(コード修正)
### Definition of Done(Kamal設定)
- [ ] `config/deploy.yml` にサーバーIP・proxy(SSL含む)・ssh(user: ubuntu)・volumes(Named Volume)設定が正しく記述されている
- [ ] ドメイン(例:`<あなたのサブドメイン.com>`)のDNS設定(AレコードにVPSのIPを登録)が完了し、`dig` コマンド等で反映が確認できている
- [ ] `.kamal/secrets` に `KAMAL_REGISTRY_PASSWORD` と `RAILS_MASTER_KEY` が設定されている
- [ ] `config/environments/production.rb` のSSL設定(`assume_ssl`, `force_ssl` など)が環境に合わせて適切にコメントアウト解除・調整されている
- [ ] デプロイ前に必要な Docker Hub のユーザー名(`<あなたのDockerHubユーザー名>`)と PAT(アクセストークン)が準備できている
7. Kamalデプロイ実行と動作確認(本番適用)
### Definition of Done(デプロイ実行)
- [ ] Kamal設定の変更がリポジトリにコミットされている
- [ ] ローカル環境で `export KAMAL_REGISTRY_PASSWORD=<アクセストークン>` が設定済みで、Docker Hub にログインできている
- [ ] `kamal setup` がエラーなく正常完了している(exit code 0)
- [ ] `curl https://<あなたのサブドメイン.com>` でレスポンス(HTTP 200)が返ってくることが確認できている
- [ ] `kamal app exec 'ls -la /rails/storage/'` を実行し、SQLiteのDBファイル(`production.sqlite3` 等)が存在し、データが永続化されていることが確認できている
💡 成功の秘訣:AIを動かす「メタ指示ワークフロー」
ただチェックリストを渡すのではなく、以下の4ステップをタスクの冒頭に定義し、 「この通りに私(人間)とキャッチボールしてね」 とCCに約束させることが、AIを迷子にさせない最大のコツです。
### AIへの基本指示(メタ指示書)
以下のワークフローに従って、ユーザーとCCで協力して作業を進めてください。
- [ ] (ユーザー)DoD(完了の定義)を作成する。
- [ ] (CC)作業ステップを作成し、作業→DoDチェックを繰り返す。都度、作業結果を実行ログに記録する。作業がすべて完了したら人間に通知する。
- [ ] (ユーザー)作業結果を見てDoDの妥当性をチェックする。完了している項目に人間が自分でチェックし、不足があればDoDに必要な項目を追加する。追加し終わったらAIにそのことを伝え、再度作業させる。人間が満足したら次のステップへ進む。
- [ ] (CC)作業結果を丁寧にまとめる。
皆さまのご参考になりましたら幸いです!