Ian Chou's Blog

FDE 小型 IDP 指南(無 K8s 篇):用自架 PaaS 打造 Vercel 級部署體驗

前言:FDE 的「非 K8s」困境

身為 Forward Deployed Engineer (FDE),你常常遇到這種情況:

客戶的環境只有 1-2 台 VM,沒有 K8s 經驗,也沒有專職 DevOps。但他們希望「以後能自己部署、自己維護」。

這時候,你有三條路:

  1. 教他們用 Docker Compose — 但客戶每次要改東西都得 SSH 進去、打指令,很快就會來找你
  2. 幫他們裝 K8s — 但 K8s 的學習曲線太陡,1-2 台 VM 也不划算
  3. 裝一套「自架 PaaS」 — 給他們一個像 Vercel、Render 那樣的介面,Git push 就能部署

這篇文章要告訴你第三條路怎麼走。


一、工具分類:先搞懂你要什麼

在開始之前,先釐清兩類工具的差異:

類型 代表工具 定位 適合場景
Docker 管理 UI Portainer、dpanel 「增強版 docker 指令」 你已經懂 Docker,只想要個 UI
自架 PaaS Coolify、Dokploy、CapRover 「自己的 Heroku/Vercel」 想要 Git push 自動部署的完整流程

💡 關鍵差異:

如果客戶的痛點是「我不想打 docker run」,Portainer 就夠用。

如果客戶的痛點是「我想像 Vercel 那樣,推 code 就上線」,那你需要 Coolify


二、自架 PaaS 選手對比

三個主流的自架 PaaS 選項:

工具 特點 優勢 注意事項
Coolify 功能最完整、UI 最現代 Docker Compose 原生支援、內建資料庫/監控 資源需求較高(建議 2 core / 2GB RAM)
Dokploy 支援 Docker Compose + Swarm 多節點部署、Traefik 整合 相對較新,社群較小
CapRover 歷史最久、社群最大 One-Click Apps 生態系豐富 UI 相對老舊、Docker Compose 支援有限

本篇主角:Coolify

選擇 Coolify 的理由很簡單:它是這三個裡面最接近「Vercel 體驗」的選擇。你可以 Git push 自動部署、Web UI 管理環境變數、內建 Let's Encrypt SSL、還有漂亮的監控 Dashboard。


三、Coolify 架構介紹

在開始安裝之前,先了解 Coolify 的核心概念:

flowchart TB
    subgraph VM["Your VM / VPS"]
        subgraph Coolify["Coolify Dashboard (port 8000)"]
            direction TB
            
            subgraph Projects["Projects"]
                direction LR
                subgraph PA["Project A"]
                    A1["App 1"]
                    A2["App 2"]
                    PG["PostgreSQL"]
                end
                subgraph PB["Project B"]
                    B1["App 1"]
                    RD["Redis"]
                end
                subgraph PC["Project C"]
                    DB["Database"]
                    C1["App 1"]
                end
            end
            
            Traefik["🔀 Traefik (Reverse Proxy)
→ 自動路由 Domain → Container
→ 自動 Let's Encrypt SSL"] end Docker["🐳 Docker Engine"] end Projects --> Traefik Traefik --> Docker

核心元件

元件 角色
Coolify Dashboard Web 管理介面(:8000),管理 Project、App、Database
Traefik 反向代理,自動處理 Domain routing + SSL
Docker Engine 底層容器運行環境
PostgreSQL Coolify 自己的狀態資料庫
Redis 背景任務佇列

四、安裝 Coolify(10 分鐘)

前置條件

Step 1: SSH 進入伺服器

ssh root@your-server-ip

Step 2: 一行安裝

curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash

⚠️ 這行指令會做什麼?

安裝完成後,你會看到:

✅ Coolify installed successfully!
🌐 Open http://your-server-ip:8000 to get started.

Step 3: 初始化

  1. 瀏覽器開啟 http://your-server-ip:8000
  2. 建立第一個 admin 帳號

⚠️ 重要:立刻建立帳號!

安裝後的註冊頁面是公開的。如果有人先你一步註冊,他就會成為管理員。

Step 4: 設定 Domain(可選但建議)

如果你有 Domain,可以把 Coolify Dashboard 也綁上去:

  1. DNS 設定:coolify.yourdomain.comyour-server-ip
  2. 在 Coolify Dashboard → Settings → Instance Settings
  3. 設定 Instance's Domain

這樣就可以用 https://coolify.yourdomain.com 存取 Dashboard。


五、部署第一個 App(5 分鐘)

方式 A:從 GitHub 部署(Vercel 體驗)

  1. 建立 Project

    • Dashboard → Projects → New Project
  2. 新增 Application

    • Project 裡面 → Add Resource → Application
  3. 連接 GitHub

    • 選擇 GitHub(需授權)
    • 選擇 Repository 和 Branch
  4. 設定 Build

    • Build Pack:選擇適合的(Nixpacks / Dockerfile / Static)
    • Port:你的 app 監聽的 port
  5. 設定 Domain

    • 填入 Domain(例如 app.yourdomain.com
    • 記得先設好 DNS A record
  6. Deploy

    • 點擊 Deploy
    • 看 Build 和 Deploy log

🎉 完成!

之後每次 push 到該 branch,Coolify 會自動觸發部署(如果你開啟了 Auto Deploy)。

方式 B:用 Docker Compose

如果你已經有 docker-compose.yml

  1. 新增 Resource → Docker Compose

  2. 貼上你的 Compose 檔案

  3. 設定 Domain(給需要對外的 service)

  4. Deploy

Coolify 會自動:


六、部署 Database

這是 Coolify 比 Portainer 方便的地方——內建 Database 管理。

  1. Add Resource → Database

  2. 選擇類型

    • PostgreSQL
    • MySQL / MariaDB
    • MongoDB
    • Redis
  3. 設定

    • Password(自動生成或自訂)
    • Volume(資料持久化)
  4. Deploy

部署後,Coolify 會提供:

💡 好處:你的 app 可以直接用內部網路連資料庫,不用對外開 port。


七、管理與維運

日常操作

任務 操作位置
查看 Log Application → Logs
重新部署 Application → Redeploy
環境變數 Application → Environment Variables
手動 Rollback Application → Deployments → 選舊版本 → Rollback
Scale(需要資源) Application → Advanced → Replicas

備份

Coolify 支援自動備份到:

設定路徑:Application/Database → Backups

監控

Dashboard 首頁就有基本監控:

需要更詳細的監控?可以用 Coolify 一鍵部署:


八、FDE 交付 Checklist

當你把 Coolify 環境交給客戶時,記得準備:

文件

# 客戶交接文件

## 存取資訊
- Coolify Dashboard: https://coolify.yourdomain.com
- 管理員帳號: [提供]
- 伺服器 SSH: root@ip(備用)

## 日常操作
- 如何查看 log
- 如何重新部署
- 如何修改環境變數

## 備份
- 備份位置: [S3 bucket / local path]
- 備份頻率: Daily
- 恢復流程: [連結]

## 緊急聯絡
- [你的聯絡方式]

權限設定

Coolify 支援多使用者、Team、權限控制:

  1. Settings → Team
  2. 邀請成員(用 Email)
  3. 設定權限
    • Admin:完整權限
    • Developer:可部署,不能改設定
    • Viewer:只能看

自動更新

Coolify 預設會自動更新自己。如果客戶環境較保守:

# 關閉自動更新(安裝時)
env AUTOUPDATE=false bash -c 'curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash'

然後手動更新:Dashboard → Settings → Update


九、其他選項速覽

如果 Coolify 不適合你的場景,這裡是其他選項:

Dokploy — 需要多節點時

curl -sSL https://dokploy.com/install.sh | sh

優點:

適合:你需要 2-5 台 VM 組成「輕量級叢集」

CapRover — 想要最多 One-Click Apps

docker run -p 80:80 -p 443:443 -p 3000:3000 \
  -e ACCEPTED_TERMS=true \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /captain:/captain \
  caprover/caprover

優點:

適合:你想要最豐富的「一鍵部署應用」生態系

Portainer — 只需要 Docker UI

docker run -d -p 9000:9000 \
  --name portainer \
  --restart always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

優點:

適合:客戶已經熟 Docker,只需要 UI 管理


十、選擇決策樹

你需要的是什麼?
│
├─ 「我想要 Git push 自動部署」
│   └─ → Coolify(首選)或 Dokploy
│
├─ 「我需要管理多台 server」
│   ├─ 想要 PaaS 體驗 → Dokploy(內建 Swarm)
│   └─ 只需要 Docker 管理 → Portainer + Docker Swarm
│
├─ 「我想要最多一鍵安裝的 app」
│   └─ → CapRover
│
├─ 「我只想要個 Docker UI」
│   └─ → Portainer 或 dpanel
│
└─ 「我需要 K8s」
    └─ → 參考姊妹篇:Lean GitOps IDP

結論:找到「剛剛好」的平衡點

對 FDE 來說,交付給客戶的方案需要滿足三個條件:

  1. 客戶能自己操作:不用 SSH、不用打指令
  2. 你能快速部署:不用花兩週教 K8s
  3. 出問題能救:有 log、有備份、有 rollback

Coolify 是目前最接近這個平衡點的選擇。

一行指令安裝、10 分鐘上線、Web UI 操作、Git 自動部署。對於「1-2 台 VM、沒有 K8s、需要交給客戶維護」的場景,這就是你的答案。

💡 最後提醒

這篇是 私有雲小型 IDP 實戰:Lean GitOps 的「姊妹篇」。


附錄:常用指令速查表

任務 指令
安裝 Coolify curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash
安裝(關閉自動更新) env AUTOUPDATE=false bash -c 'curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash'
安裝(預設 admin 帳號) env ROOT_USERNAME=admin [email protected] ROOT_USER_PASSWORD=YourPass bash -c 'curl ...'
Coolify 資料目錄 /data/coolify
重啟 Coolify cd /data/coolify/source && docker compose up -d --force-recreate
查看 Coolify log cd /data/coolify/source && docker compose logs -f

參考資源