Manifest 里有什么
k8s/vibestrap.yaml 按这个顺序定义了四种资源:
- Namespace ——
vibestrap - Deployment —— Next.js 应用,1 副本,
/api/ping探针,合理的资源 requests/limits - Service —— ClusterIP,端口 80 → 3000
- Ingress —— nginx + cert-manager TLS,内置
www → apex跳转
harbor.funkro.com/vibestrap/vibestrap。集群里
没有任何迁移 Job——见下文 数据库迁移。
CI 帮你做了什么
.github/workflows/docker-build-push.yml 在以下情况会跑:
- 推送到
main分支 - 推送
v*形式的 tag - 在 GitHub Actions UI 手动触发
1
构建镜像
Dockerfile 的 runner stage 打成
harbor.funkro.com/vibestrap/vibestrap:<version>,
同时额外打 :latest tag。2
推送到 Harbor
用 GitHub Actions secrets 里的
HARBOR_USERNAME + HARBOR_PASSWORD 登录。3
计算 version tag
Tag 推送用 git tag(比如
v1.2.0)。分支推送用 main-<sha7>。
两种格式都是不可变的,不像 :latest。4
自动回写 manifest
Workflow 把
k8s/vibestrap.yaml 里的 image: 行改成新版本,
并以 [skip ci] 提交回 main。git 里的 manifest 永远跟仓库里的镜像
版本一致。CI 里不放
kubeconfig。部署本身仍然是你手动敲命令 —— 这是有意为之。GitHub Actions secrets
在 Settings → Secrets and variables → Actions 里加这两个:首次部署
第一次kubectl apply 之前,集群里要先准备好三样东西。
1. Harbor 拉取密钥
让集群能从你的私有仓库拉镜像:harbor-secret,可以直接复制过来,不用
重新输密码:
2. 应用 Secret —— 只有两个字段必填
镜像启动时只校验DATABASE_URL 和 BETTER_AUTH_SECRET。其他环境变量
全部可选,留空时对应功能自动跳过——你可以先把服务跑起来,之后想要哪个
功能再回来填,重跑脚本 + kubectl rollout restart 就行。
kubectl create secret generic ... --from-env-file。Deployment
通过 envFrom: secretRef 把所有变量一次性注入。
3. ingress-nginx + cert-manager
Ingress 默认ingressClassName: nginx,并依赖一个名为 letsencrypt-prod
的 ClusterIssuer。如果集群里还没装:
letsencrypt-prod ClusterIssuer。
数据库迁移
迁移不在集群里跑。运行时镜像不带drizzle-kit,也没有 Job 要照看。
取而代之,触动 schema 的发布之前,从本机跑:
kubectl apply 新镜像。单副本部署本身就没竞态窗口——schema 什么时候动
完全你说了算。
生产 DB 在私有 VPC 里怎么办
如果本机直接连不到生产 DB,在集群内拉一个一次性 pod,借集群网络跑同一条命令。 完整的kubectl run 命令在 k8s/README.md 里;大致长这样: