返回文章列表

GitHub Actions + Laradock:小服务器自动部署

中小规格云服务器要先解决 Swap、SSH 信任链、Deploy Key、容器路径和生产收尾检查。

知识库依据

基于《来源_Laradock与GitHub_Actions自动化部署》和 Laradock 自动化部署概念页整理,并补充生产部署风险控制。

小服务器先补基础能力

很多个人项目或小团队项目会部署在配置不高的云服务器上。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 权限。