ユーザーの要望に最適な runtime を以下から選び、その runtime のルールに従ってコードを生成してください。
ランタイムの選択基準: 静的ページやゲームなら static、Python スクリプトなら python、Node ベースのツールなら node、PHP フォームなら php。
デプロイ環境の制約
ChatGPT、Claude、Gemini などの通常チャット環境では外部 HTTP リクエストが制限されているため、POST /deploy は実行できません。これらの環境ではコード生成のみを行い、人が ZIP を Console から upload してください。
Codex や Claude Code のようなローカル実行環境を持つ AI ツールであれば、API key を使った直接デプロイが可能です。
Static HTML / CSS / JavaScript
必要ファイル
- index.html
- style.css
- script.js
ルール
- 現在の runtime image は python:3.12-alpine ベースです
- 余計な解説は最小限にして、ファイルごとに分けて出力する
- 外部 CDN や build tool 前提にしない
- index.html は ZIP の root に置ける形にする
- Blue は割り当てた port への localhost TCP 接続で起動成功を判定します。特定の HTTP body や status code は不要です
- 1 ページで完結しつつ、見た目や動きが分かる UI にする
- static runtime では永続書き込みを前提にしません。画像や assets は同じ ZIP に含めてください
出力形式
FILE: index.html
```html
...
```
FILE: style.css
```css
...
```
FILE: script.js
```javascript
...
```
Python app.py + requirements.txt
ルール
- 現在の runtime image は python:3.12-slim ベースです
- app.py を entry file にする
- requirements.txt を付ける
- PORT 環境変数で listen する構成にする
- Blue は割り当てた port への localhost TCP 接続で起動成功を判定します。特定の HTTP body や status code は不要です
- コンテナの root filesystem は揮発扱いです。SQLite などの DB ファイルや保持したい app data は /workspace/data に置いてください(/workspace/code 内のファイルは HTTP 経由でアクセスされる可能性があります)
- 最初は Flask か Python 標準ライブラリで完結する小さめの app にする
出力形式
FILE: app.py
```python
...
```
FILE: requirements.txt
```text
...
```
Node package.json + server.js
ルール
- 現在の runtime image は node:22-bookworm-slim ベースです
- package.json に start script を入れる
- server.js は PORT 環境変数で listen する
- Blue は割り当てた port への localhost TCP 接続で起動成功を判定します。特定の HTTP body や status code は不要です
- コンテナの root filesystem は揮発扱いです。SQLite などの DB ファイルや保持したい app data は /workspace/data に置いてください(/workspace/code 内のファイルは HTTP 経由でアクセスされる可能性があります)
- 最初は小さく始めて、必要に応じて Express などを使ってよいです
- frontend が必要でも build step 前提にしない
出力形式
FILE: package.json
```json
...
```
FILE: server.js
```javascript
...
```
PHP index.php
ルール
- 現在の runtime image は php:8.3-cli ベースです
- index.php を root か public/ に置く
- Blue は割り当てた port への localhost TCP 接続で起動成功を判定します。特定の HTTP body や status code は不要です
- コンテナの root filesystem は揮発扱いです。SQLite などの DB ファイルや保持したい app data は /workspace/data に置いてください(/workspace/code 内のファイルは HTTP 経由でアクセスされる可能性があります)
- 最初は 1 ファイル中心で分かりやすくする
- フレームワークや composer 前提を避ける
- session や form submit が分かる小さめの app を優先する
出力形式
FILE: index.php
```php
...
```
FILE: style.css
```css
...
```
Deploy API
API key があれば ZIP を直接デプロイできます。なければ人が Console から upload します。
curl -X POST https://blue.sola.inc/deploy \
-H "X-API-Key: sk_xxxxx" \
-F "name=my-app" \
-F "file=@app.zip"
レスポンス例
{
"app_id": "app-xxxxx",
"state": "RUNNING",
"url": "https://app-xxxxx.blue.sola.inc",
"runtime": "python",
"visibility": "password_casual",
"generated_password": "Ab3x",
"failed_step": null,
"reason": null,
"next_action": null,
"logs": ["app started on port 40001"]
}
ログ確認
起動に失敗した場合: GET https://blue.sola.inc/apps/{app_id}/logs でログを取得し、同じ app_id で修正版を再デプロイしてください。
再デプロイ(アプリの更新) — 重要
デプロイ失敗時やコード修正時は、必ず同じ app_id を指定して再デプロイしてください。新しいアプリを作成してはいけません。
curl -X POST https://blue.sola.inc/deploy \
-H "X-API-Key: sk_xxxxx" \
-F "name=my-app" \
-F "app_id=app-001" \
-F "file=@app.zip"
app_id を指定すると、既存アプリが停止 → 新しいコードでデプロイ → 同じ URL で再公開されます。app_id は初回デプロイのレスポンスに含まれています。
初回デプロイのレスポンスに含まれる app_id を必ず保存し、以降のすべてのデプロイで使い回してください。
エラー時の対処方法
デプロイが失敗した場合、レスポンスの以下のフィールドを確認してください:
- failed_step: 失敗したステップ(upload / security_scan / detect / start / proxy_register)
- reason: エラーの原因(例: "healthcheck timeout")
- next_action: 推奨される次のアクション
- logs: コンテナの起動ログ(エラーの詳細がここに出ます)
ログの確認: GET https://blue.sola.inc/apps/{app_id}/logs
注意事項:
- 新しいアプリを作成しない — 同じ app_id で再デプロイしてください
- 再デプロイの前にログを確認する — logs フィールドまたは GET /apps/{app_id}/logs でエラー原因を特定してからコードを修正してください
- ランタイムの変更は慎重に — 要件に合う別のランタイムに変更するのは問題ありませんが、同じエラーが別ランタイムで直ることは稀です。ログを確認してコードの問題を修正するのが先です
よくある失敗原因:
- healthcheck timeout: アプリが PORT 環境変数で指定されたポートでリスンしていない
- detect 失敗: 必要なエントリファイル(index.html, app.py, package.json, index.php)がZIPのルートにない
- 依存パッケージのインストール失敗: requirements.txt や package.json に存在しないパッケージが指定されている
リソース制限
- メモリ上限: プランにより 128MB〜512MB(超過するとプロセスが強制停止されます)
- 起動タイムアウト: アプリは起動後 10 秒以内にポートをリスンする必要があります
- ディスク: コードは 20〜400MB、データは 40〜800MB(プランにより異なる)
- CPU: 0.25〜1.0 コア(プランにより異なる)
大きなフレームワークや多数の依存パッケージは起動タイムアウトやメモリ超過の原因になります。最小限の依存で始めてください。
セキュリティスキャン
デプロイ時にコードの自動セキュリティスキャンが実行されます。
- ブロック(デプロイ拒否): リバースシェル、システムファイルアクセス(/etc/passwd 等)、暗号通貨マイナー、環境変数の外部送信パターン
- 警告(デプロイは継続): eval() 等の動的コード実行、ファイル書き込み操作、ホスト名やメモリ情報の取得
マルウェアや不正な処理が検知された場合、デプロイがブロックされる場合があります。ブロックされた場合は該当コードを修正して再デプロイしてください。
node_modules、vendor、.venv 等の依存パッケージ内の検知は「info」扱いとなり、ブロックされません。
ファイルの取り扱い
- .env ファイル: .env、.env.local 等の環境変数ファイルは外部から直接アクセスできません。ただしデプロイ時に警告が表示されます。機密情報は含めないことを推奨します。
- DB ファイル: .db、.sqlite 等のデータベースファイルもデプロイ時に警告が表示されます。永続データは /workspace/data に配置してください。
- 自動削除: .git、__MACOSX、__pycache__、.DS_Store 等の不要ファイルは ZIP 展開時に自動削除されます。
- フラット化: ZIP 内にフォルダが1つだけの場合、自動的にフラット化されます(例: my-app/index.html → index.html)。
共通ルール
Blue はポートへの TCP 接続で起動成功を判定します。特定の HTTP レスポンスは不要です。
コンテナの root filesystem は揮発扱いです。永続データは /workspace/data に保存してください。
デフォルトの公開レベルは password_casual(閲覧にパスワードが必要)です。デプロイレスポンスに generated_password が含まれるので、ユーザーに伝えてください。
ランタイムの自動検出: ランタイムを指定する必要はありません。Blue はアップロードされたファイルから自動的に最適なランタイムを検出します(index.html → static、app.py → python、package.json → node、index.php → php)。
アプリ名: name パラメータには英小文字、数字、ハイフンを推奨します(例: my-todo-app)。日本語やスペースは自動的にハイフンに変換されます。