1、docker-compose.yml 配置文件
docker-compose.yml
services: memos: image: neosmemo/memos:stable container_name: memos restart: unless-stopped ports: - "127.0.0.1:5230:5230" volumes: - ./.memos:/var/opt/memos
backup: image: alpine:latest restart: always depends_on: - memos volumes: - ./:/app command: > /bin/sh -c " apk add --no-cache git; echo '当前目录内容:'; ls -la /app; echo '设置执行权限...'; chmod +x /app/backup.sh; echo '验证文件权限:'; ls -la /app/backup.sh; echo '立即执行备份脚本...'; /app/backup.sh; echo '设置定时任务...'; echo '*/5 * * * * /bin/sh /app/backup.sh > /proc/1/fd/1 2>&1' | crontab -; crond -f " environment: - GITHUB_TOKEN=github_pat_xxx - GITHUB_USER=zouzonghao - WORK_DIR=/app # 不用改 - REMOTE_REPO=https://github.com/zouzonghao/memos.git #仓库地址 - GIT_BRANCH=main #分支名 - GIT_USERNAME=AutoBackup - GIT_EMAIL=github-actions[bot]@users.noreply.github.com logging: # 关键添加:限制日志大小 driver: json-file options: max-size: "1m" # 每个日志文件最大5MB max-file: "3" # 最多保留3个日志文件
2、backup.sh 备份脚本
backup.sh
#!/bin/sh
log() { printf "[$(date '+%Y-%m-%d %H:%M:%S')] $*\n"}
debug_log() { printf "[DEBUG][$(date '+%Y-%m-%d %H:%M:%S')] $*\n"}
die() { log "ERROR: $*" >&2 exit 1}
# 检查必要环境变量[ -z "$WORK_DIR" ] && die "未设置 WORK_DIR 环境变量"[ -z "$REMOTE_REPO" ] && die "未设置 REMOTE_REPO 环境变量"[ -z "$GIT_BRANCH" ] && GIT_BRANCH="main"[ -z "$GIT_USERNAME" ] && GIT_USERNAME="AutoBackup"[ -z "$GIT_EMAIL" ] && GIT_EMAIL="github-actions[bot]@users.noreply.github.com"
# 确保工作目录存在[ -d "$WORK_DIR" ] || die "工作目录 $WORK_DIR 不存在"
# 配置 Git 用户信息if [ ! -f "/root/.gitconfig" ]; then cat > /root/.gitconfig << EOF[user] email = $GIT_EMAIL name = $GIT_USERNAME[credential] helper = store[safe] directory = $WORK_DIR[pull] rebase = falseEOF log "初始化 Git 配置文件: /root/.gitconfig"fi
# 进入工作目录cd "$WORK_DIR" || die "无法进入 $WORK_DIR 目录"
# 检查是否需要初始化 Git 仓库if [ ! -d ".git" ]; then log "初始化 Git 仓库..." git init --quiet || die "Git 初始化失败" [ -f ".gitignore" ] || echo -e "*.tmp\n*.log\n.env*\n*.swp" > .gitignore git add .gitignore >/dev/null 2>&1 git commit -m "初始化仓库" >/dev/null 2>&1fi
# 设置远程仓库CURRENT_URL=$(git config --get remote.origin.url 2>/dev/null)
if [ -z "$CURRENT_URL" ]; then git remote add origin "$REMOTE_REPO" log "设置远程仓库: $REMOTE_REPO"elif [ "$CURRENT_URL" != "$REMOTE_REPO" ]; then git remote set-url origin "$REMOTE_REPO" log "更新远程仓库URL: $CURRENT_URL → $REMOTE_REPO"fi
# 检查远程仓库连接性check_remote() { debug_log "正在检查远程连接: $REMOTE_REPO" GIT_CURL_VERBOSE=1 GIT_TRACE=1 git ls-remote origin 2> remote-check.log
if [ $? -ne 0 ]; then log "⚠️ 远程连接测试失败,详见日志:" cat remote-check.log return 1 fi return 0}
# 配置访问凭据if [[ -n "$GITHUB_USER" && -n "$GITHUB_TOKEN" ]]; then CREDENTIAL_URL="https://${GITHUB_USER}:${GITHUB_TOKEN}@github.com"
# 获取当前凭证 CURRENT_CRED=$(cat /root/.git-credentials 2>/dev/null | head -1)
if [ "$CURRENT_CRED" != "$CREDENTIAL_URL" ]; then echo "$CREDENTIAL_URL" > /root/.git-credentials log "更新 GitHub 凭据" debug_log "使用凭据: ${CREDENTIAL_URL//$GITHUB_TOKEN/*****}" fielse log "警告:未设置 GITHUB_USER 或 GITHUB_TOKEN 环境变量"fi
# 添加所有变更git add . >/dev/null 2>&1
# 检查文件变化if git diff --cached --quiet; then log "没有检测到文件变化" exit 0fi
log "检测到文件变化 (变更数: $(git diff --cached --name-only | wc -l))"
# 创建自动备份提交commit_msg="AutoBackup $(date '+%Y-%m-%d %H:%M:%S')"git commit --quiet -m "$commit_msg" >/dev/null || die "提交失败"log "创建本地提交: $(git rev-parse --short HEAD)"
# 检查远程仓库可用性if git push --force origin HEAD:$GIT_BRANCH; then log "✅ 备份成功"else log "❌ 推送失败" die "推送失败,请检查日志"fi
1、Caddyfile 配置文件
Caddyfile
your.domain.com {
# 反向代理到本地服务 reverse_proxy http://localhost:5230
# 关闭 QUIC / HTTP/3 的标准方法(适用于 Caddy < v2.5) tls { protocols tls1.2 tls1.3 }
# 禁用 Alt-Svc 头部(防止浏览器尝试升级到 HTTP/3 ) header { -Alt-Svc }
# 压缩支持 encode { zstd gzip minimum_length 1024 }
# 日志配置 log { output file /var/log/caddy/memos.log { roll_size 1mb roll_keep 5 } }}