開始 coding 前先讀:1gb.us 的部署環境、技術選型、硬性限制
如果 user 請你幫他開發一個要部署到 1gb.us 的專案,請先完整讀完這份規範,再根據限制挑選技術棧與架構。部署實際操作請讀 1gb.us/deploy.html。
| 項目 | 規格 |
|---|---|
| Server RAM | 1 GB(總量,含系統) |
| Server CPU | 共享 VPS,建議視為單核 |
| Storage | ~15 GB 可用 |
| CPU 架構 | linux/amd64 only |
| 對外網路 | Cloudflare Tunnel,自動 HTTPS |
| 網址 | https://<你的站名>.1gb.us |
| Server 網路 | IPv6-only(部分 IPv4 服務抓不到,build 請在本地做) |
| 限制 | 數值 | 意義 |
|---|---|---|
| RAM | 200 MB | 超過直接 OOM 被 kill |
| CPU | 0.5 核 | 避免單人吃爆 |
| Image 上傳 | 500 MB | gzip 後大小 |
| 單檔上傳 | 200 MB | 靜態站用 |
| 層 | 技術 | RAM |
|---|---|---|
| 前端 | Astro SSG(純靜態輸出) | 0 MB |
| 後端 + DB + Auth + Admin | PocketBase(單 Go binary,內建 SQLite) | ~10 MB |
為什麼首選:新手最友善、RAM 最省、完全不用自己寫後端。PocketBase 自動生成 REST API + 後台管理 UI + 檔案上傳 + 認證。
部署模式:Astro build 出 dist/ → 逐檔 PUT 上傳(走靜態站流程);PocketBase 另外包 Docker image 部署到另一個子域。前端直接打 PocketBase 的 API。
適合:CMS、上稿後台、會員系統、表單收集、blog、todo、任何 CRUD。
| 層 | 技術 | RAM |
|---|---|---|
| 後端 runtime | Node 20 + Hono | ~40 MB |
| ORM | Drizzle ORM | (included) |
| DB | better-sqlite3 → /data/app.db | 0 額外 |
| 前端互動 | HTMX + Alpine.js(CDN 引入) | 0 MB |
| 樣式 | Tailwind CDN | 0 MB |
| 模板 | Hono JSX 或 server-side HTML string | 0 MB |
為什麼:TypeScript 全棧、要自己寫後端邏輯時的最省組合。HTMX 讓後端 return HTML 就能做 SPA 體驗,不用寫前端 JS。
適合:要自訂業務邏輯、想學 TS 全棧。
| 層 | 技術 | RAM |
|---|---|---|
| 後端 | FastAPI + uvicorn | ~60 MB |
| DB | SQLModel 或 sqlite3 → /data/app.db | 0 額外 |
| 前端 | Jinja2 + HTMX + Tailwind CDN | 0 MB |
為什麼:Python 生態對 AI 最友善、自動生成 Swagger docs。
適合:Python 老手、AI/ML 相關、需要 API docs。
| 禁用 | 原因 |
|---|---|
| Next.js / Nuxt | 啟動 200-400 MB,跑不起來 |
| Laravel | php-fpm 150 MB+,且 AI 生成品質差 |
| Django | ~120 MB,太肥 |
| Rails | 200 MB+ |
| Spring Boot | 400 MB+,直接出局 |
| 自帶 Postgres / MySQL / MongoDB container | 200-400 MB,禁止 |
| Redis container | 30 MB,請用 SQLite 當 cache/queue |
| Elasticsearch / Meilisearch | 太吃 RAM,請用 SQLite FTS5 |
| 選項 | 狀態 | 說明 |
|---|---|---|
SQLite(檔案存 /data/) | ✅ 推薦 | 零額外 RAM、零設定、重部署不掉資料 |
| 外部 DB(Supabase / Neon / PlanetScale / Turso) | ✅ 可用 | 連線字串透過環境變數傳入 |
| 自己帶 DB container | ❌ 禁止 | RAM 不夠 |
PRAGMA journal_mode = WAL; → 讀寫並發更好/data/app.dbServer 是 IPv6-only,但我們在基礎設施層裝了 Cloudflare WARP + privoxy,每個 container 在啟動時會自動注入這些環境變數:
HTTP_PROXY=http://172.20.0.1:8888
HTTPS_PROXY=http://172.20.0.1:8888
NO_PROXY=localhost,127.0.0.1,.1gb.us
所以 container 裡的 app 可以直接呼叫 IPv4-only 的外部 API(OpenAI、Google Maps、天氣 API 等),不用做任何特殊處理。
| 語言 / library | 自動吃 | 備註 |
|---|---|---|
Node:fetch(undici) | ✅ 新版 | Node 20+ |
Node:axios、got、node-fetch | ✅ | — |
Python:requests、httpx、urllib | ✅ | — |
Go:net/http | ✅ | 預設讀 HTTP_PROXY env |
Ruby:Net::HTTP、httparty | ✅ | — |
PHP:curl、Guzzle | ✅ | Guzzle 要設 proxy config |
Java:HttpClient | ⚠️ | 要用 ProxySelector.of(...) 或 JVM 旗標 |
Rust:reqwest | ⚠️ | 要 Client::builder().proxy(...) |
| 自己用 raw socket | ❌ | 不吃 HTTP proxy,建議改走 HTTP client |
# 從任何 container 內執行
curl https://api.ipify.org
# 回傳的 IPv4 會是 WARP 的出口 IP(例如 104.28.x.x)
NO_PROXY 包含 .1gb.us 和 localhost,表示打 1gb.us 內部其他服務(例如另一個 user 的 container)不走 proxy,保持內網低延遲。
/data/Container 內寫到 /data/ 的檔案會 mount 到 host 上的 volume,重新部署不會掉。
/data/app.db/data/pb_data//data/uploads//data/,用 /tmp/| 用途 | 推薦 |
|---|---|
| 頁面結構 | Server-side render(Hono JSX、Jinja2、PocketBase hook)或 Astro SSG |
| 互動 | HTMX(後端返 HTML 片段) |
| 局部狀態 | Alpine.js(15 KB,宣告式) |
| 樣式 | Tailwind CDN(https://cdn.tailwindcss.com,零 build) |
| icon | Heroicons / Lucide(SVG inline) |
| 複雜互動 | Svelte 或 Vue 靜態 bundle(若真的需要) |
docker build --platform linux/amd64。node:20-alpine、python:3.12-alpine、alpine:3.19,image 小 deploy 快。0.0.0.0,不是 127.0.0.1,不然 container 外連不進來。port 對齊。docker logs 看。/health endpoint 回 200。./data/app.db(或設環境變數)docker build --platform linux/amd64 -t test .docker run -p 3000:3000 -v $PWD/data:/data test 測通