Coolify 架构分析
分析版本:v1.0 | 分析日期:2026-05-09
1. 项目概览
| 项目 | 信息 |
|---|---|
| GitHub | coollabsio/coolify |
| 编程语言 | PHP 8.4 / Laravel 12 |
| Star 数 | ~35k |
| 许可证 | 开源 |
| 核心维护者 | coollabsio |
项目简介
Coolify 是一个开源的、可自托管的 PaaS(Platform as a Service)平台,是 Heroku / Netlify / Vercel 的替代品。使用 PHP 8.4 / Laravel 12 构建,前端采用 Livewire 3 + Tailwind CSS v4 + Alpine.js,数据库使用 PostgreSQL 15,队列与实时通信依赖 Redis + Soketi(WebSocket 自托管方案)。
2. 技术栈
| 类别 | 技术选型 |
|---|---|
| 框架 | Laravel 12 |
| 前端 | Livewire 3 + Alpine.js |
| 样式 | Tailwind CSS v4 |
| 数据库 | PostgreSQL 15 + Redis 7.x |
| WebSocket | Soketi(自托管) |
| 反向代理 | Traefik / Caddy(双选项) |
| 认证 | Laravel Fortify + Sanctum |
| 队列 | Redis + Laravel Horizon |
| 测试 | Pest PHP 4 |
| CI/CD | GitHub Actions |
| 构建系统 | Nixpacks / Dockerfile / Docker Compose / Docker Image |
| 包管理 | Composer + npm |
3. 整体架构
graph TB
subgraph "User Layer"
UI[Livewire UI<br/>Blade + Alpine.js]
API[REST API<br/>/api/v1]
CLI[Artisan CLI<br/>Commands]
end
subgraph "Application Layer"
CONT[Controllers<br/>HTTP + API + Webhook]
LW[Livewire Components<br/>Page-level]
ACT[Actions<br/>Single-Purpose Domain Ops]
JOB[Jobs<br/>Queue Workers]
EVT[Events / Listeners]
end
subgraph "Domain Layer"
SRV[Services<br/>Business Logic]
MOD[Models<br/>Eloquent ORM]
ACT2[Actions<br/>Reusable]
end
subgraph "Infrastructure Layer"
SSH[SSH Multiplexing<br/>Remote Execution]
DOCKER[Docker Engine<br/>Remote Servers]
PROXY[Traefik Proxy<br/>Managed per Server]
SENTINEL[Coolify Sentinel<br/>Agent on Servers]
end
subgraph "Data Layer"
PG[(PostgreSQL)]
RD[(Redis<br/>Cache/Queue)]
FS[Filesystem<br/>SSH Keys / Configs]
end
UI -->|Livewire| LW
API --> CONT
CONT --> ACT
CONT --> JOB
LW --> ACT
LW --> JOB
ACT --> MOD
JOB --> MOD
JOB --> ACT
JOB -->|SSH| SSH
JOB -->|Docker API| DOCKER
SSH --> FS
MOD --> PG
MOD --> RD
EVT -->|Broadcast| RD
架构分层
User Layer: 用户交互入口,包括 Livewire 前端 UI、REST API 和 Artisan CLI。 Application Layer: 处理请求的核心层,包含控制器、Livewire 组件、领域动作(Actions)、队列任务和事件监听器。 Domain Layer: 业务逻辑和领域模型,包括 Eloquent 模型、服务和可复用的 Actions。 Infrastructure Layer: 远程服务器管理,通过 SSH 多路复用执行 Docker 命令、管理代理和 Sentinel 探针。 Data Layer: 持久化存储,PostgreSQL 为主数据库,Redis 用于缓存/队列,文件系统存储 SSH 密钥和配置。
模块职责
| 模块 | 职责 | 关键文件/目录 |
|---|---|---|
| Livewire | 所有面向用户的 UI 页面组件 | app/Livewire/ |
| Jobs | 队列任务(部署、备份、清理、服务器管理等) | app/Jobs/ |
| Models | Eloquent 数据模型,核心领域实体 | app/Models/ |
| Services | 复杂业务逻辑(配置生成、Docker 镜像解析、容器状态聚合等) | app/Services/ |
| Helpers | SSH 复用、SSL 助手以及大量全局函数 | app/Helpers/ + bootstrap/helpers/ |
| Http/Controllers | API 控制器 + Webhook 处理器 | app/Http/Controllers/ |
| Enums | PHP 强类型枚举 | app/Enums/ |
| Events | 领域事件(状态变更、代理变更等) | app/Events/ |
| Notifications | 多渠道通知 | app/Notifications/ |
4. 核心模块详解
4.1 领域模型架构
核心实体关系:Team → Project → Environment → Application / StandaloneDatabase / Service。关键模型:Server(~55KB,管理 SSH 连接、Docker、代理、Sentinel 探针)、Application(~98KB,管理构建包、Git 仓库源、环境变量、预览部署)、Service(~75KB,预制服务栈)。
4.2 Actions 设计模式(领域动作)
使用 lorisleiva/laravel-actions 包,Action 类实现了 Command 模式,可多态使用:作为普通对象、Job、Controller 或 Listener。四种调用方式:StartDatabase::run() 同步调用、StartDatabase::dispatch() 异步 Job、绑定路由作为控制器、$this->listen() 事件响应。
4.3 部署流水线(核心流程)
部署是 Coolify 最复杂的流程,实现在 ApplicationDeploymentJob(~4400 行)中。流水线步骤:
- 验证服务器和私钥
- 生成 docker-compose.yml
- 解析 SSH 多路复用连接
- 克隆代码仓库(可配置独立 Build Server)
- 构建 Docker 镜像(Nixpacks/Dockerfile)
- 推送镜像到 Registry(可选)
- 在目标服务器拉取并运行容器
- 健康检查
- 配置 Traefik Labels
- 清理旧容器
关键特性:构建/部署分离、多服务器部署、PR 预览部署、SSH 多路复用连接池、滚动更新。
4.4 SSH 远程执行系统
SshMultiplexingHelper 管理 SSH 连接池,支持 ControlMaster=auto 长连接复用、连接年龄追踪和自动刷新、健康检查。ExecuteRemoteCommand Trait 被所有需要远程执行命令的 Job 使用。
4.5 代理(Proxy)管理
每台服务器有一个代理实例(Traefik 或 Caddy),Coolify 自动管理其配置。Docker 容器的 Labels(标签)驱动代理配置——利用 Docker 原生标签机制将域名、路由、SSL 证书注入容器的 Traefik/Caddy 元数据。
5. 关键设计决策
| 决策 | 选择 | 替代方案 | 理由 |
|---|---|---|---|
| 远程管理方式 | SSH 多路复用 | 在每个服务器安装 Agent Daemon | 零侵入,服务器仅需标准 SSH 和 Docker,无需额外部署进程 |
| 默认构建包 | Nixpacks | Dockerfile | 用户无需写 Dockerfile,自动检测应用类型,降低使用门槛 |
| 前端框架 | Livewire + Alpine.js | React / Vue | 全栈 PHP 开发者无需写 JS,渐进式增强,天然与后端状态同步 |
| 反向代理 | Traefik 和 Caddy 双支持 | 仅选择一种 | 用户有选择权;Caddy 自动 HTTPS 更友好,Traefik 功能更丰富 |
| 构建/部署分离 | 可选独立 Build Server | 统一服务器 | 部署服务器无需构建工具链;构建不影响运行中应用;可独立扩展 |
| 实时通信 | Soketi(自托管 WebSocket) | Pusher 等外部服务 | 避免依赖外部服务,完全自托管 |
6. 数据流 / 请求流
sequenceDiagram
participant User
participant WebUI as Livewire UI
participant API as REST API
participant Queue as Redis Queue
participant Horizon as Horizon Worker
participant Sentinel as Sentinel Agent
participant WebSocket as Soketi WS
User->>WebUI: Click "Deploy"
WebUI->>API: POST /api/v1/deploy
API->>Queue: Dispatch ApplicationDeploymentJob
Queue->>Horizon: Dequeue on 'high' queue
Horizon->>Horizon: Clone repo / Build image / Run container
Horizon->>Sentinel: (Optional) Monitor metrics
Horizon-->>Queue: Fire ApplicationStatusChanged Event
Queue-->>WebSocket: Broadcast to Private Team Channel
WebSocket-->>WebUI: Update status in real-time (Livewire)
WebUI-->>User: Green checkmark / build logs
7. 设计模式
| 模式名称 | 使用位置 | 目的 |
|---|---|---|
| Observer 模式(事件系统) | app/Events/, app/Listeners/ |
监听状态变化,触发广播、通知、日志记录 |
| Strategy 模式(构建包) | ApplicationDeploymentJob, BuildPackTypes |
根据构建包类型分发到不同构建策略 |
| Repository 模式 | ConfigurationRepository |
统一配置源,将多模型的配置聚合成标准格式 |
| 多租户(Multi-Tenancy) | Team 模型,Policy 层 | 通过 Team 实现资源隔离,Policy 拦截跨团队访问 |
8. 工程实践
测试策略
使用 Pest PHP 4 测试框架。Feature Tests ~120+(部署流、API CRUD、认证、权限隔离、Webhook),Unit Tests ~100+(SSH 命令转义、Docker 镜像解析、环境变量处理),Browser Tests (Dusk) ~5+(登录、注册、Dashboard),Architecture Tests(安全约束)。测试亮点:安全测试优先、跨团队隔离测试、SSH 连接测试、TDD 实践。
发布流程
Docker 多阶段构建(开发/生产环境),S6 Overlay 进程管理(db-migration、horizon、scheduler-worker 等),一键安装脚本。
版本管理
代码版本管理:Git(GitHub),依赖管理:Composer + npm,数据库迁移:Laravel Migrations,静态分析:PHPStan,代码风格:Laravel Pint。
9. 总结与评价
亮点
- 零侵入性设计:不需要在目标服务器上安装特定 Agent,仅依赖标准 SSH + Docker
- 多策略构建系统:Nixpacks/Dockerfile/Docker Compose/Docker Image 四套构建策略
- 强大的隔离性:Team → Project → Environment 三层资源隔离,Policy 全覆盖
- 可扩展的资源层次:Application、Standalone Database、Service(多容器栈)三种资源类型
- 企业级工程化:全面测试覆盖、代码质量工具链、多通道通知
可改进之处
ApplicationDeploymentJob超长(~4400 行):职责过重,建议拆分为多个子 Job/ActionServer模型(~55KB)/Application模型(~98KB):Eloquent 模型承载了过多业务逻辑- 全局函数泛滥:
bootstrap/helpers/中 18 个文件包含数百个全局函数 - SSH 命令拼接安全风险:虽然采取了严格的 escapeshellarg,但仍是攻击面
- 缺乏 API 版本化策略:所有 API 在
v1前缀下,未考虑向后兼容策略
参考
- 项目源代码:
coollabsio/coolify - 官方文档:https://coolify.io/docs
- 使用的关键包:
lorisleiva/laravel-actions,spatie/laravel-activitylog,livewire/livewire,pestphp/pest,laravel/horizon,soketi/soketi