# ============================================================================= # Gitea 可移植部署包 —— 把所有「博客相关服务」打包成 docker-compose # # 目标:任何一台机器上,只要: # 1. git clone 本仓库(含 gitea-backup/ 目录) # 2. 准备 data/ 数据卷(迁移时从旧机器打包过来) # 3. 复制 .env.example 为 .env 并填好 # 4. docker compose up -d # 就能拉起整套环境。 # # 包含的服务: # - gitea 代码托管(境外已停用 GitHub Actions,构建全走这里) # - runner Gitea Actions 的执行器(act_runner,跑博客构建/部署) # - upyun-sync 又拍云同步(原 1Panel 计划任务,容器化后不再依赖面板) # # write-server(写作后台)源码仍在仓库根 write-server/,这里用相对路径引用, # 不搬源码。如需一起管理,取消下面 write-server 段的注释。 # ============================================================================= name: gitea-backup services: # --------------------------------------------------------------------------- # Gitea —— 代码托管 + CI 调度中心 # 数据:SQLite 单文件(/data/gitea/gitea.db)+ app.ini,全部在挂载卷里 # 迁移:把旧机器 /opt/gitea/data 整个 rsync 到本机 ./data/gitea 即可 # --------------------------------------------------------------------------- gitea: image: gitea/gitea:1.28.0-rootless container_name: gitea restart: unless-stopped environment: - USER_UID=1000 - USER_GID=1000 - TZ=Asia/Shanghai # 数据库用内置 SQLite,无需额外容器 - GITEA__database__DB_TYPE=sqlite3 # 域名与基础 URL(必须与你备案域名一致) - GITEA__server__DOMAIN=${GITEA_DOMAIN} - GITEA__server__ROOT_URL=${GITEA_ROOT_URL} - GITEA__server__SSH_DOMAIN=${GITEA_SSH_DOMAIN} - GITEA__server__SSH_PORT=${GITEA_SSH_PORT} # 关闭注册,只有你一个人用 - GITEA__service__DISABLE_REGISTRATION=true ports: - "${GITEA_HTTP_PORT}:3000" - "${GITEA_SSH_PORT}:2222" volumes: - ./data/gitea:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/api/v1/version"] interval: 30s timeout: 10s retries: 3 start_period: 30s networks: - gitea-net # --------------------------------------------------------------------------- # act_runner —— Gitea Actions 执行器(跑博客的构建 + 部署流水线) # 首次启动后需到 Gitea 后台「站点管理 → Actions → Runners」拿注册 token, # 然后 exec 进容器执行一次注册(详见 README「首次初始化」) # --------------------------------------------------------------------------- runner: image: gitea/act_runner:0.2.11 container_name: gitea-runner restart: unless-stopped environment: - TZ=Asia/Shanghai - GITEA_INSTANCE_URL=${GITEA_ROOT_URL} # 注册 token:首次跑前手动填进 .env(见 README) - GITEA_RUNNER_REGISTRATION_TOKEN=${RUNNER_REGISTRATION_TOKEN} volumes: - ./data/runner:/data - /var/run/docker.sock:/var/run/docker.sock depends_on: gitea: condition: service_healthy networks: - gitea-net # --------------------------------------------------------------------------- # upyun-sync —— 又拍云同步(原 1Panel 计划任务「又拍云同步(国内中转)」) # 容器化后:不再依赖 1Panel,随 compose 一起迁移。 # 工作目录 ./data/upyun-sync 里放 sync.sh / upx / cos_sign.py 等。 # 注意:此服务用 host 网络(要访问宿主机已配好的证书/代理时更省事)。 # --------------------------------------------------------------------------- upyun-sync: image: alpine:3.20 container_name: upyun-sync restart: unless-stopped environment: - TZ=Asia/Shanghai # 又拍云凭据(从 .env 注入,容器内脚本读取) - UPYUN_SERVICE=${UPYUN_BUCKET} - UPYUN_OPERATOR=${UPYUN_OPERATOR} - UPYUN_PASSWORD=${UPYUN_PASSWORD} volumes: - ./data/upyun-sync:/opt/upyun-sync entrypoint: ["/bin/sh", "-c"] command: - | apk add --no-cache curl bash python3 py3-pip tar zstd openssl >/dev/null 2>&1 || true # 引导 upx(若 data 里没有) if [ ! -x /opt/upyun-sync/upx ]; then echo "引导 upx..." cd /tmp && curl -fsSL -o upx.tgz \ "https://collection.b0.upaiyun.com/softwares/upx/upx_0.4.9_linux_amd64.tar.gz" \ && tar -xzf upx.tgz upx && mv upx /opt/upyun-sync/upx && chmod 755 /opt/upyun-sync/upx || \ curl -fsSL -o upx.tgz \ "https://github.com/upyun/upx/releases/download/v0.4.9/upx_0.4.9_linux_amd64.tar.gz" \ && tar -xzf upx.tgz upx && mv upx /opt/upyun-sync/upx && chmod 755 /opt/upyun-sync/upx fi # 每分钟跑一次 sync.sh(等价原 1Panel 的 * * * * * 计划任务) while true; do if [ -x /opt/upyun-sync/sync.sh ]; then bash /opt/upyun-sync/sync.sh || echo "[$(date -Is)] sync.sh 退出码 $?" else echo "[$(date -Is)] 缺少 sync.sh,跳过" fi sleep 60 done networks: - gitea-net # --------------------------------------------------------------------------- # write-server(可选,默认注释)—— 写作后台 # 源码在仓库根 write-server/,这里用相对路径引用。 # 若要把写作后台也纳入本部署包,取消下面整段注释, # 并确保 write-server/ 目录与 gitea-backup/ 同级。 # --------------------------------------------------------------------------- # write-server: # build: # context: ../write-server # dockerfile: Dockerfile # container_name: write-server # restart: unless-stopped # ports: # - "8016:8016" # volumes: # - ../..:/blog # 博客根目录(与 write-server 原 compose 一致) # - ./data/write-server/recycle:/app/recycle # - ./data/write-server/logs:/app/logs # - ./data/write-server/backups:/app/backups # environment: # - NODE_ENV=production # - PORT=8016 # - BLOG_ROOT=/blog # - TZ=Asia/Shanghai # networks: # - gitea-net networks: gitea-net: driver: bridge