skip to content
Logo 三七の小站

Memos + Caddy 反代 + Github 备份

/ 5 min read

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