小服务器先补基础能力
很多个人项目或小团队项目会部署在配置不高的云服务器上。GitHub Actions 可以很方便地通过 SSH 连接服务器执行发布,但服务器本身需要先准备好 Swap、Docker、Laradock、目录权限和防火墙规则。
如果内存不足,composer install 或前端构建可能直接被系统杀掉。自动化部署之前,先让服务器具备稳定执行命令的能力。
- 低内存机器建议配置 Swap。
- SSH Key 只给发布需要的权限。
- 生产 .env 不放入 GitHub Secrets 以外的公开位置。
- 容器路径和宿主机路径要写清楚。
Actions 里的关键点
GitHub Actions 的流水线适合做拉取代码、上传或远程执行脚本。对于 Laravel + Laradock,通常让服务器自己拉取最新代码或接收 rsync,然后在容器内执行 composer install 和 artisan 命令。
docker compose exec 在 CI 非交互环境里要使用 -T,避免 TTY 问题。线上使用 composer install,不使用 composer update。
- 使用 secrets 保存 SSH_HOST、SSH_USER、SSH_KEY。
- 限制触发分支,例如只在 master 或 tag 发布。
- docker compose exec -T workspace 执行命令。
- 发布后检查 storage、bootstrap/cache 权限。
风险控制
自动部署最怕把错误自动化。每条流水线都应该有失败即停止、日志可追踪、回滚路径明确和敏感信息不输出四个要求。
如果项目还没有完整测试,至少要在部署前跑基本语法检查、依赖安装检查和关键接口健康检查。
- 不要在日志打印完整私钥或环境变量。
- 生产发布要记录 commit sha。
- 失败后不要继续执行缓存刷新等后续动作。
- 准备上一版本目录或 Tag 回退方案。
生产自动化先解决内存
知识库中特别提到,中小规格服务器执行 Composer 容易 OOM,因此建议先开启 4G Swap。这个细节很实际:很多 1 核 2G 或 2 核 4G 的机器,平时跑服务没问题,一到 composer install 就被系统杀掉。
Swap 不是性能优化,而是给部署过程一个安全垫。
- 创建 /swapfile 并设置 600 权限。
- mkswap、swapon 后写入 /etc/fstab。
- 用 free -m 验证 Swap 是否生效。
- Composer 仍建议加 --no-dev 和 --optimize-autoloader。
Actions 到服务器,服务器到 GitHub
GitHub Actions 部署至少有两段信任:Actions 能登录服务器,服务器能拉取 GitHub 私有仓库。前者通常通过 GitHub Secrets 保存服务器登录私钥,后者通过 GitHub Deploy Keys 保存服务器公钥。
这两段不要混淆。Actions 的私钥不是给服务器拉仓库用的;服务器自己的部署公钥才应该加入仓库 Deploy Keys。
- Secrets 保存 REMOTE_HOST、REMOTE_USER、SSH_PRIVATE_KEY。
- 服务器生成部署专用 SSH Key。
- 服务器公钥加入 GitHub Deploy Keys。
- 纯拉取部署不建议开启 Deploy Key 写权限。
workflow 的安全边界
很多 workflow 会执行 git reset --hard origin/master。这是可接受的,但前提是服务器目录不保留人工修改。生产服务器应该是可重建环境,而不是开发者临时改代码的地方。
另外 docker compose exec 要加 -T,因为 GitHub Actions 是非交互环境。这个小参数经常决定流水线是否卡住。
- 只监听 master 或 tag 发布。
- git reset --hard 前确认目标目录无手工变更。
- docker compose exec -T workspace 执行命令。
- 日志中不要输出完整私钥和环境变量。
Laravel 收尾动作
代码更新和依赖安装完成后,Laravel 项目通常还需要缓存和权限收尾。比如 config:cache、route:cache、view:cache、queue:restart,以及 storage、bootstrap/cache 的写权限修复。
这些动作要按项目实际情况选择,不要盲目全跑。比如路由闭包会影响 route:cache,配置动态读取也可能被缓存策略影响。
- 生产配置稳定时执行 config:cache。
- 确认路由可缓存后再执行 route:cache。
- 队列代码变更后执行 queue:restart。
- 发布后检查 storage 和 bootstrap/cache 权限。