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 = false
EOF
    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>&1
fi

# 设置远程仓库
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/*****}"
    fi
else
    log "警告:未设置 GITHUB_USER 或 GITHUB_TOKEN 环境变量"
fi

# 添加所有变更
git add . >/dev/null 2>&1

# 检查文件变化
if git diff --cached --quiet; then
    log "没有检测到文件变化"
    exit 0
fi

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
        }
    }
}