项目关停前,需要备份项目代码到本地电脑。下面以php Laravel项目为例,介绍如何备份代码并下载到本地。
首先分析一下哪些文件需要排除:
📁 目录结构分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| /var/www/web/ ├── app/ ├── artisan ├── blank ├── bootstrap/ ├── composer.json ├── composer.phar ├── config/ ├── database/ ├── data.sql ├── public/ ├── README.md ├── resources/ ├── routes/ ├── start_card ├── storage/ ├── tests/ ├── vendor/ └── VueBackend文档.md
|
🚀 快速备份命令
方案1:一键备份(推荐)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| cd /var/www/web
tar -czvf web_backup_$(date +%Y%m%d_%H%M%S).tar.gz \ --exclude=vendor \ --exclude=storage/logs \ --exclude=storage/framework/cache \ --exclude=storage/framework/sessions \ --exclude=storage/framework/views \ --exclude=storage/framework/testing \ --exclude=node_modules \ --exclude=.git \ --exclude=.env \ --exclude=blank \ --exclude=start_card \ --exclude=tests \ --exclude=composer.phar \ --exclude=*.log \ --exclude=*.tmp \ --exclude=*.cache \ --exclude=*.sqlite \ .
|
方案2:使用排除文件列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| cd /var/www/web
cat > exclude_list.txt << 'EOF' vendor/ storage/logs/ storage/framework/cache/ storage/framework/sessions/ storage/framework/views/ storage/framework/testing/ node_modules/ .git/ .env blank/ start_card/ tests/ composer.phar *.log *.tmp *.cache *.sqlite EOF
tar -czvf web_backup_$(date +%Y%m%d_%H%M%S).tar.gz --exclude-from=exclude_list.txt .
rm exclude_list.txt
|
方案3:智能备份(区分不同内容)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| cd /var/www/web
tar -czvf code_backup_$(date +%Y%m%d).tar.gz \ app/ artisan bootstrap/ composer.json config/ \ database/ public/ README.md resources/ routes/ \ VueBackend文档.md
if [ -d "storage/app/public" ]; then tar -czvf uploads_backup_$(date +%Y%m%d).tar.gz storage/app/public/ fi
if [ -f "data.sql" ]; then cp data.sql data_backup_$(date +%Y%m%d).sql fi
|
📦 推荐的完整备份脚本
创建一个 backup_web.sh 脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #!/bin/bash
BACKUP_DIR="/backup/web" PROJECT_DIR="/var/www/web" TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="$BACKUP_DIR/web_backup_$TIMESTAMP.tar.gz" EXCLUDE_FILE="/tmp/web_exclude_$TIMESTAMP.txt"
mkdir -p $BACKUP_DIR
cat > $EXCLUDE_FILE << 'EOF'
vendor/ node_modules/
storage/logs/ storage/framework/cache/ storage/framework/sessions/ storage/framework/views/ storage/framework/testing/
.git/ .env .env.example
tests/ blank/ start_card/
composer.phar
*.log *.tmp *.cache *.sqlite *.swp *~ EOF
echo "=== 开始备份 /var/www/web ===" echo "备份时间: $(date)" echo "排除文件列表:" cat $EXCLUDE_FILE | grep -v "^#" | grep -v "^$"
echo "" echo "正在压缩..." cd $PROJECT_DIR tar -czf $BACKUP_FILE --exclude-from=$EXCLUDE_FILE .
BACKUP_SIZE=$(du -h $BACKUP_FILE | cut -f1) FILE_COUNT=$(tar -tzf $BACKUP_FILE 2>/dev/null | wc -l)
echo "" echo "=== 备份完成 ===" echo "备份文件: $BACKUP_FILE" echo "文件大小: $BACKUP_SIZE" echo "包含文件数: $FILE_COUNT" echo "MD5校验码: $(md5sum $BACKUP_FILE | cut -d' ' -f1)"
rm $EXCLUDE_FILE
find $BACKUP_DIR -name "web_backup_*.tar.gz" -mtime +7 -delete
echo "" echo "备份文件列表:" ls -lh $BACKUP_DIR/web_backup_*.tar.gz 2>/dev/null || echo "暂无备份文件"
echo "" echo "使用以下命令下载到本地:" echo " sz $BACKUP_FILE" echo "或" echo " scp $(hostname):$BACKUP_FILE ~/Downloads/"
|
给脚本执行权限并运行:
1 2
| chmod +x backup_web.sh sudo ./backup_web.sh
|
📥 下载到本地
方法1:使用sz下载
1 2 3 4 5 6
| cd /backup/web LATEST_BACKUP=$(ls -t web_backup_*.tar.gz | head -1)
sz $LATEST_BACKUP
|
方法2:使用scp下载(从本地终端执行)
1 2 3 4 5
| scp username@your_server_ip:/backup/web/web_backup_*.tar.gz ~/Downloads/
scp username@your_server_ip:/backup/web/$(ssh username@your_server_ip "ls -t /backup/web/web_backup_*.tar.gz | head -1") ~/Downloads/
|
方法3:使用rsync(支持断点续传)
1 2
| rsync -avz --progress username@your_server_ip:/backup/web/web_backup_*.tar.gz ~/Downloads/
|
🔍 验证备份内容
检查备份文件内容
1 2 3 4 5 6 7 8 9 10 11
| tar -tzvf /backup/web/web_backup_20241111_143022.tar.gz | head -20
tar -tzf /backup/web/web_backup_20241111_143022.tar.gz | wc -l
tar -tzf /backup/web/web_backup_20241111_143022.tar.gz | grep "app/Http/Controllers"
tar -tzvf /backup/web/web_backup_20241111_143022.tar.gz > /dev/null && echo "备份文件完整"
|
⚡ 最简快速备份命令
如果你只想快速备份并下载,使用这个单行命令:
1
| cd /var/www/web && tar -czvf ~/web_backup_$(date +%Y%m%d).tar.gz --exclude=vendor --exclude=storage/logs --exclude=storage/framework/cache --exclude=blank --exclude=start_card --exclude=tests --exclude=composer.phar --exclude=*.log . && sz ~/web_backup_*.tar.gz
|
📊 备份策略建议
按重要性分级备份
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| tar -czvf core_code.tar.gz app/ bootstrap/ config/ database/ routes/ artisan composer.json
tar -czvf frontend_resources.tar.gz public/ resources/ VueBackend文档.md README.md
if [ -f "data.sql" ]; then gzip -c data.sql > data_$(date +%Y%m%d).sql.gz fi
if [ -d "storage/app/public" ]; then tar -czvf uploads.tar.gz storage/app/public/ fi
|
排除规则说明
| 排除项 |
理由 |
是否必须排除 |
vendor/ |
可通过 composer install 重新生成 |
✅ 强烈建议 |
node_modules/ |
可通过 npm install 重新生成 |
✅ 强烈建议 |
storage/logs/ |
日志文件,无需备份 |
✅ 建议 |
storage/framework/cache/ |
缓存文件,无需备份 |
✅ 建议 |
.git/ |
版本控制,可通过git重新拉取 |
✅ 建议 |
.env |
包含敏感配置,不应备份 |
✅ 必须 |
blank/ |
根据名称判断可能是空目录或临时文件 |
✅ 建议 |
start_card |
未知文件,可能是临时文件 |
✅ 建议 |
tests/ |
测试文件,生产环境不需要 |
⚠️ 可选 |
composer.phar |
可执行文件,可重新下载 |
⚠️ 可选 |
*.log |
日志文件 |
✅ 建议 |
🎯 推荐的最佳实践
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| cd /var/www/web
tar -czvf /tmp/web_essential_$(date +%Y%m%d).tar.gz \ app/ artisan bootstrap/ composer.json config/ \ database/ public/ README.md resources/ routes/ \ VueBackend文档.md
if [ -d "storage/app" ]; then tar -czvf /tmp/storage_essential_$(date +%Y%m%d).tar.gz \ --exclude="storage/logs" \ --exclude="storage/framework/cache" \ --exclude="storage/framework/sessions" \ --exclude="storage/framework/views" \ storage/ fi
sz /tmp/web_essential_*.tar.gz /tmp/storage_essential_*.tar.gz 2>/dev/null
rm /tmp/web_essential_*.tar.gz /tmp/storage_essential_*.tar.gz 2>/dev/null
|
⚠️ 重要提醒
备份前确认:确保你有足够的磁盘空间
测试备份文件:下载后解压测试
1 2
| tar -tzvf ~/Downloads/web_backup_*.tar.gz | head -10
|
敏感信息:确保 .env 文件没有被包含
1
| tar -tzvf web_backup.tar.gz | grep "\.env"
|
数据库单独处理:data.sql 应该单独备份,因为它可能很大
1 2 3
| gzip -c data.sql > data_$(date +%Y%m%d).sql.gz sz data_*.sql.gz
|
最简单有效的命令:
1 2 3
| cd /var/www/web tar -czvf ~/web_backup.tar.gz --exclude=vendor --exclude=blank --exclude=start_card --exclude=storage/logs --exclude=storage/framework/cache . sz ~/web_backup.tar.gz
|
这样你会得到一个精简的、不包含依赖和缓存文件的代码备份,可以直接下载到本地。