chore(infra): 新增 Gitea+Jenkins CI/CD 部署与凭据整改

- infra/cicd:docker-compose(gitea/jenkins)、JCasC(凭据统一 ${ENV} 注入,无硬编码)、
  备份/恢复、健康检查、凭据轮换与 git 历史清除脚本
- docs/deployment/cicd:安装、高可用备份监控、凭据事故复盘
- .env.example 仅为占位模板;真实 .env 由 .gitignore 排除
This commit was merged in pull request #27.
This commit is contained in:
2026-09-20 10:37:57 +08:00
parent 7df2dde438
commit 4ab2f3cd8e
15 changed files with 2092 additions and 0 deletions
+112
View File
@@ -0,0 +1,112 @@
# ============================================================
# Jenkins Configuration as Code (JCasC)
#
# 目的:把安全域、授权策略、CSRF、凭据、节点协议全部声明化,
# 避免"某次手工点了全局可写"这类不可追溯的漂移。
#
# 挂载:CASC_JENKINS_CONFIG=/var/jenkins_config/casc.yaml
# 校验:Jenkins -> Manage Jenkins -> Configuration as Code -> View Configuration
# 或用 jenkins-plugin-cli 的 casc 校验器 docker run 预检
#
# 变量来自 .env(容器 env),不要在此文件写明文。
# ============================================================
jenkins:
systemMessage: |
Novalon CI/CD (ci.f.novalon.cn) —— 生产环境,操作留痕。
未授权访问将被记录并追责。
# ---------- 安全域:Jenkins 自有用户库,禁用匿名 ----------
securityRealm:
local:
allowsSignup: false # 禁止自助注册
enableCaptcha: false
users:
- id: "${ADMIN_USER}"
# 密码由 bcrypt 存储;首次由 JCasC 写入,之后通过 UI/API 改
password: "${ADMIN_PASSWORD}"
# ---------- 授权:登录后可读,管理员全权 ----------
authorizationStrategy:
loggedInUsersCanDoAnything:
allowAnonymousRead: false # 关键:关闭匿名读取(构建日志含路径/命令,属敏感信息)
# ---------- 全局安全 ----------
crumbIssuer:
standard:
excludeClientIPFromCrumb: false
remotingSecurity:
enabled: true # 启用 agent -> controller 的调用过滤(防 RCE 类滥用)
# 无 agent 时关闭 JNLP 入站端口;有 agent 再改为 fixed:50000
agentProtocols:
- "Ping"
# Jenkins URL 必须与实际一致,否则 CSRF crumb 与邮件/通知链接会失效
location:
url: "https://ci.f.novalon.cn/"
adminAddress: "team@novalon.cn"
# ---------- 构建并发与队列 ----------
numExecutors: 2
quietPeriod: 5
scmCheckoutRetryCount: 2
# ---------- 全局环境变量(作业里用 ${...} 引用) ----------
globalNodeProperties:
- envVars:
env:
- key: "PROJECT_NAME"
value: "novalon-website"
- key: "SERVER_IP"
value: "139.155.109.62"
- key: "SERVER_USER"
value: "root"
- key: "DEPLOY_ROOT"
value: "/home/novalon/docker-app"
- key: "NGINX_CONTAINER"
value: "novalon-nginx-secure"
- key: "DOMAIN"
value: "https://novalon.cn"
- key: "NPM_REGISTRY"
value: "https://registry.npmmirror.com"
- key: "BACKUP_RETENTION_COUNT"
value: "3"
# ---------- 凭据:统一由环境变量注入,绝不写死在 JCasC ----------
credentials:
system:
domainCredentials:
- credentials:
- usernamePassword:
scope: GLOBAL
id: "gitea-credentials"
username: "${ADMIN_USER}"
password: "${GITEA_TOKEN}"
description: "Gitea 代码拉取令牌(read:repository)"
# ---------- 工具安装(与 Jenkinsfile 中 nodejs('18') 对应) ----------
tool:
nodejs:
installations:
- name: "18"
home: ""
properties:
- installSource:
installers:
- nodeJSInstaller:
id: "18.20.4"
npmPackagesRefreshHours: 72
# ---------- 插件更新站点 ----------
# updateCenter:
# sites:
# - id: "default"
# url: "https://updates.jenkins.io/update-center.json"
# ---------- 安全加固:禁用 CLI over HTTP / 旧协议 ----------
unclassified:
# 关闭 Jenkins 内置 CLI over HTTP(历史漏洞面)
# 通过 startupProbe 之外的手段无法在 JCasC 直接关,
# 已在 docker-compose 的 JAVA_OPTS 中以 -Djenkins.CLI.disabled=true 处理