Files
blog/gitea-backup/docker-compose.yml
T

158 lines
6.4 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# =============================================================================
# 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