运维部署
需要将 Node.js 应用容器化并用 GitHub…
适用于 Node.js 项目需要 Docker 多阶段构建、GitHub Actions CI/CD、GHCR 推送和 SSH 远程服务器部署的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要将 Node.js 应用容器化并用 特定
解决思路
- 交互式询问 `port`(容器内端口,默认 3000)、`host_port`(对外暴露端口,默认同 `port`)、`env_file`(服务器 env 路径,可选)。
- 智能检测项目类型:有 `package.json` 则识别为 Node.js(当前唯一支持的项目类型);已有 `Dockerfile` 则跳过生成。
- 如需要,按 `templates/Dockerfile.nodejs` 生成优化的 Node.js `Dockerfile`:多阶段构建、非 root 用户、健康检查。
- 从 `templates/docker-deploy.yml` 生成 workflow,替换 `{{PORT}}`(容器端口)、`{{HOST_PORT}}`(对外端口)和 `{{ENV_FILE}}` 变量。
- `build-and-push` job:登录 GHCR → 使用 Buildx 构建 → 推送镜像(tag: `latest` + `sha`)→ 使用 GHA 缓存。
- `deploy` job:SSH 连接 → 拉取镜像 → 停旧容器 → 启新容器(支持 env 文件)→ 清理旧镜像。
- 提示用户在 GitHub Settings → Secrets 配置 `DEPLOY_HOST`、`DEPLOY_USER`、`DEPLOY_SSH_KEY`(服务器私钥)。
- 优先使用 SSH key 而非密码部署;若服务器只支持密码,可改用 `password: ${{ secrets.DEPLOY_PASSWORD }}`,但不推荐。
- 不要只用 `latest` 单 tag,同时打 `latest` + `${{ github.sha }}` 方便回滚。
- 声明 `permissions: packages: write`,GHCR 推送需要。
- deploy 时先 `docker stop` + `docker rm` 检查/删除已有容器,避免端口冲突。
- 部署后执行 `docker image prune -f` 清理旧镜像,节省磁盘空间。
- Dockerfile 添加 `USER node` 或非 root 用户,遵循容器安全最佳实践。
- 不在 workflow 中硬编码 Secrets,使用 `${{ secrets.XXX }}` 引用,避免密钥泄露。
- 配置 Docker BuildKit 缓存,使用 `cache-from` / `cache-to` 结合 GitHub Actions cache,避免每次全量构建。
- 部署后验证健康检查,处理构建失败的回滚,避免上线错误版本。
- 按服务器架构声明平台:`linux/amd64` 或 `linux/arm64`;多平台构建时写 `linux/amd64,linux/arm64`,避免目标架构不匹配导致运行失败。
- 支持命令行:`/docker-build-deploy`;`--port` 指定容器内应用端口(默认 3000),`--host-port` 指定服务器对外暴露端口(默认同 `--port`),`--env-file` 指定服务器 env 文件路径(默认空),例如 `/docker-build-deploy --port 8080 --env-file /opt/app/.env`。
适用边界 · 注意事项
- 只想写 Dockerfile,不需要 GitHub Actions 构建、推送和 SSH 部署完整流程。
- 使用 Kubernetes,或部署到 AWS ECS/EKS、Google Cloud Run、Azure Container Instances 等平台,工作流不同。
- 不使用 GitHub Actions,而使用 GitLab CI、CircleCI 等其他 CI。