自动备份网站 #33
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: 自动备份网站 | |
| on: | |
| schedule: | |
| - cron: '0 4 */3 * *' | |
| workflow_dispatch: | |
| jobs: | |
| backup: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: 检出代码 | |
| uses: actions/checkout@v4 | |
| with: | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: 安装 HTTrack | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y httrack webhttrack | |
| - name: 创建备份目录 | |
| run: | | |
| mkdir -p backups | |
| - name: 设置日期变量 | |
| id: date | |
| run: | | |
| echo "date=$(date +'%Y%m%d_%H%M%S')" >> $GITHUB_OUTPUT | |
| - name: 创建临时目录 | |
| run: | | |
| mkdir -p /tmp/httrack-backup | |
| - name: 执行 HTTrack 备份 | |
| run: | | |
| BACKUP_DIR="/tmp/httrack-backup/deep-forest-club-${{ steps.date.outputs.date }}" | |
| mkdir -p "$BACKUP_DIR" | |
| cd /tmp/httrack-backup | |
| httrack "https://deep-forest-club.wikidot.com/system:list-all-pages" -O "$BACKUP_DIR" \ | |
| --mirror \ | |
| --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" \ | |
| --depth=3 \ | |
| --stay-on-same-domain \ | |
| --robots=0 \ | |
| --verbose | |
| echo "备份完成,保存在: $BACKUP_DIR" | |
| - name: 检查备份是否成功 | |
| run: | | |
| BACKUP_DIR="/tmp/httrack-backup/deep-forest-club-${{ steps.date.outputs.date }}" | |
| if [ -d "$BACKUP_DIR" ] && [ "$(ls -A $BACKUP_DIR)" ]; then | |
| echo "备份成功,目录不为空" | |
| ls -la "$BACKUP_DIR" | head -20 | |
| else | |
| echo "备份可能失败,目录为空" | |
| exit 1 | |
| fi | |
| - name: 压缩备份文件 | |
| run: | | |
| cd /tmp/httrack-backup | |
| BACKUP_NAME="deep-forest-club-${{ steps.date.outputs.date }}" | |
| # 压缩备份 | |
| tar -czf "$GITHUB_WORKSPACE/backups/${BACKUP_NAME}.tar.gz" "$BACKUP_NAME" | |
| echo "压缩完成: ${BACKUP_NAME}.tar.gz" | |
| - name: 生成备份信息 | |
| run: | | |
| cd $GITHUB_WORKSPACE/backups | |
| BACKUP_FILE="deep-forest-club-${{ steps.date.outputs.date }}.tar.gz" | |
| cat > backup_info_${{ steps.date.outputs.date }}.md << EOF | |
| # 备份信息 | |
| - **备份时间**: ${{ steps.date.outputs.date }} | |
| - **备份文件**: ${BACKUP_FILE} | |
| - **备份大小**: $(du -h ${BACKUP_FILE} | cut -f1) | |
| - **网站**: https://deep-forest-club.wikidot.com/ | |
| ## 文件列表 | |
| \`\`\` | |
| $(tar -tzf ${BACKUP_FILE} | head -30) | |
| \`\`\` | |
| *更多文件请解压查看* | |
| EOF | |
| - name: 更新软链接 | |
| run: | | |
| cd $GITHUB_WORKSPACE/backups | |
| # 删除旧的软链接 | |
| rm -f latest-backup.tar.gz latest-backup-info.md | |
| # 创建新的软链接 | |
| ln -s "deep-forest-club-${{ steps.date.outputs.date }}.tar.gz" "latest-backup.tar.gz" | |
| ln -s "backup_info_${{ steps.date.outputs.date }}.md" "latest-backup-info.md" | |
| - name: 提交备份到仓库 | |
| run: | | |
| git config --local user.email "action@github.com" | |
| git config --local user.name "GitHub Action" | |
| # 添加所有备份文件 | |
| git add backups/ | |
| # 检查是否有文件需要提交 | |
| if git diff --staged --quiet; then | |
| echo "没有新的备份文件需要提交" | |
| else | |
| git commit -m "自动备份网站 - ${{ steps.date.outputs.date }}" | |
| # 拉取最新更改并推送 | |
| git pull --rebase origin master | |
| git push origin master | |
| fi | |
| - name: 清理旧备份(保留最近30天的备份) | |
| run: | | |
| cd $GITHUB_WORKSPACE/backups | |
| # 删除30天前的备份文件 | |
| find . -name "deep-forest-club-*.tar.gz" -type f -mtime +30 -delete | |
| # 删除30天前的信息文件 | |
| find . -name "backup_info_*.md" -type f -mtime +30 -delete | |
| # 删除30天前的软链接(但保留latest链接) | |
| find . -name "latest-*" -type l -mtime +30 -delete | |
| - name: 上传备份文件作为工作流附件 | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: deep-forest-club-backup-${{ steps.date.outputs.date }} | |
| path: backups/deep-forest-club-${{ steps.date.outputs.date }}.tar.gz | |
| retention-days: 30 | |
| - name: 清理临时文件 | |
| run: | | |
| rm -rf /tmp/httrack-backup | |
| - name: 发送备份通知 | |
| if: always() | |
| run: | | |
| if [ "${{ job.status }}" == "success" ]; then | |
| echo "::notice::✅ 备份成功完成 - ${{ steps.date.outputs.date }}" | |
| echo "备份文件: deep-forest-club-${{ steps.date.outputs.date }}.tar.gz" | |
| else | |
| echo "::error::❌ 备份失败 - ${{ steps.date.outputs.date }}" | |
| fi |