Nextcloud私有网盘的备份与迁移
本文详细记录了在CentOS 7虚拟机环境中搭建Nextcloud云存储服务的全过程。主要内容包括: 通过VMware创建CentOS 7虚拟机(1核1G/20G存储) 配置桥接网络并设置静态IP 安装Docker环境(使用阿里云镜像源) 部署1Panel面板管理工具 通过Docker安装MySQL数据库和Nextcloud应用 克隆创建第二台虚拟机并修改网络配置 创建Nextcloud专用数据库
一、虚拟机环境搭建
本次实践是通过Vmware虚拟机是实现的,
- 基于CentOS 7 64位系统,
- 1核1G 20G
- 网络桥接
- 使用1panel面版
- docker部署的mysql和nextcloud
接下来开始
创建第一台虚拟机
打开VMware虚拟机–>新建虚拟机–>典型–>下一步–>选择自己准备好的映像文件(CentOS-7-x86_64-DVD-2009.iso)–>下一步–>自己取名字和位置–>下一步–>20G,将虚拟磁盘拆分为多个文件–>下一步–>
自定义硬件–>网络适配器–>桥接模式,复制物理网络连接状态–>完成
编辑–>虚拟网络编辑器–>更改设置–>桥接模式–>以桥接至WiFi–>应用,完成
自己初始化开机
用户:root
密码:123456
- 关闭防火墙
systemctl disable firewalld
- 编写网络配置
vi /etc/sysconfig/network-scripts/ifcfg-ens33
ifcfg-ens33文件内容
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static # <--ip地址改为静态
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=c001d0a2-561f-xxxxxxxx-59853fe09d04
DEVICE=ens33
ONBOOT=yes # <--这里必须改为yes
# 以下是要添加的内容,可以根据自己的宿主机确定ip地址的网关和子网掩码
IPADDR=192.168.3.31
NETMASK=255.255.255.0
GATEWAY=192.168.3.1
DNS1=8.8.8.8
- 保存重启系统
init 6
- 查看ip地址
ip a
- ping一下外网
ping www.baidu.com

网络连接成功
6. 更新源
sudo vi /etc/yum.repos.d/CentOS-Base.repo
CentOS-Base.repo
[base]
name=CentOS-$releasever - Base - Alibaba Cloud
baseurl=http://mirrors.aliyun.com/centos/7/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
enabled=1
[updates]
name=CentOS-$releasever - Updates - Alibaba Cloud
baseurl=http://mirrors.aliyun.com/centos/7/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
enabled=1
[extras]
name=CentOS-$releasever - Extras - Alibaba Cloud
baseurl=http://mirrors.aliyun.com/centos/7/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
enabled=1
[centosplus]
name=CentOS-$releasever - Plus - Alibaba Cloud
baseurl=http://mirrors.aliyun.com/centos/7/centosplus/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
enabled=0
清理缓存 + 重建缓存
sudo yum clean all
sudo yum makecache
- 更新
sudo yum install update -y
sudo yum install upgrade -y
- 按装可能需要的指令
yum install vim -y
yum install screen -y
yum install tree -y
yum install rsync -y
安装docker
9.按装docker
在 CentOS 7 上安装 Docker 的步骤如下。由于 CentOS 7 已于 2024 年 6 月 30 日停止维护(EOL),官方 Docker 不再支持直接通过 docker-ce 安装,但你仍可通过以下方法成功安装 Docker Engine(社区版) 或使用替代方案。
💡 前提:已配置好网络(能访问外网),并更换了 yum 源(如阿里云源)
第一步:卸载旧版本(如有)
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
第二步:安装必要依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
第三步:添加 Docker 官方仓库(使用阿里云镜像代理)
⚠️ 官方
download.docker.com在 CentOS 7 上可能无法解析或下载失败,建议使用 阿里云 Docker CE 镜像
sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
这个地址是阿里云对 Docker 官方仓库的镜像,速度更快且兼容 CentOS 7。
第四步:安装 Docker Engine
sudo yum install -y docker-ce docker-ce-cli containerd.io
如果提示找不到包,可先列出可用版本:
yum list docker-ce --showduplicates | sort -r
然后指定版本安装(例如):
sudo yum install -y docker-ce-20.10.21 docker-ce-cli-20.10.21 containerd.io
第五步:启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
验证是否运行:
sudo docker --version
输出示例:
Docker version 20.10.21, build baeda1f
ipanel面板
- 安装1panel面板
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && bash quick_start.sh
以上接下来的安装步骤省略
安装mysql
允许外部访问
容器名:mysql
root账户密码:123456
安装nextcloud
允许外部访问
容器名:nextcloud

创建第二台虚拟机
以克隆的方式,关机,给现在的虚拟机拍快照
虚拟机–>管理–>克隆–>下一页–>克隆自虚拟机当前状态–>创建完全克隆,下一页–>克隆名字自己取–>完成
启动,修改ip地址
vi /etc/sysconfig/network-scripts/ifcfg-ens33
改为一以下:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=dc5079e4-1f77-4d20-8e81-37ffed5dfd6f
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.3.32 # <--这里修改了
GATEWAY=192.168.3.1
PREFIX=24
DNS1=8.8.8.8
保存重启虚拟机
查看ip地址
ip a

创建名字为NextcloudDB的数据库
下面的密码为123456

三、 数据备份
查看docker-compose.yml
networks:
1panel-network:
external: true
services:
nextcloud:
container_name: ${CONTAINER_NAME}
deploy:
resources:
limits:
cpus: ${CPUS}
memory: ${MEMORY_LIMIT}
environment:
- PUID=1000
- PGID=1000
- TZ=${TIME_ZONE}
image: linuxserver/nextcloud:32.0.2
labels:
createdBy: Apps
networks:
- 1panel-network
ports:
- ${HOST_IP}:${PANEL_APP_PORT_HTTPS}:443
restart: always
volumes:
- ./data/config:/config
- ./data/data:/data
这是docker-compose.yml文件
根据 docker-compose.yml 文件内容,我们可以确定 Nextcloud 的数据目录和配置文件的挂载路径。
关键信息解析
从 docker-compose.yml 文件中可以看到以下重要信息:
- 服务名:
nextcloud - 网络:使用外部网络
1panel-network - 环境变量:包括 PUID、PGID 和时区等
- 镜像:
linuxserver/nextcloud:32.0.2 - 端口映射:将宿主机的
${HOST_IP}:${PANEL_APP_PORT_HTTPS}端口映射到容器内的 443 端口 - 卷(volumes)挂载:
./data/config:/config./data/data:/data
数据与配置文件位置
基于上述信息,可以得出以下结论:
-
Nextcloud 用户文件存储目录(即数据目录)是挂载在宿主机的
./data/data路径下。
在1panel中,这应该是/opt/1panel/apps/nextcloud/nextcloud/data/data目录。这个目录对应容器内部的/data路径。 -
Nextcloud 配置文件 是挂载在宿主机的
./data/config路径下。对应的完整路径为
/opt/1panel/apps/nextcloud/nextcloud/data/config,该目录对应容器内部的/config路径。
备份策略
1. 备份用户文件(数据目录)
# 假设备份目录为 /backup/nextcloud
mkdir -p /backup/nextcloud/data
# 使用 rsync 或 tar 进行备份
rsync -a /opt/1panel/apps/nextcloud/nextcloud/data/data/ /backup/nextcloud/data/
# 或者使用 tar 压缩备份
tar czvf /backup/nextcloud_data_$(date +%F).tar.gz -C /opt/1panel/apps/nextcloud/nextcloud/data data
2. 备份数据库
首先需要确认 MySQL/MariaDB 容器名称。假设容器名为 mysql-container(请替换为实际的容器名),执行如下命令进行数据库备份:
# 找到 MySQL 容器名
docker ps --format "table {{.Names}}\t{{.Image}}" | grep -E "(mysql|mariadb)"
# 假设 MySQL 容器名为 mysql-container
docker exec -i mysql-container sh -c 'exec mysqldump -u root -p"your_mysql_password" nextcloud' > /backup/nextcloud_db_$(date +%F).sql
# 如果密码包含特殊字符或为了安全考虑,推荐使用 .my.cnf 文件来避免明文密码
3. 备份 Nextcloud 配置文件
cp -r /opt/1panel/apps/nextcloud/nextcloud/data/config /backup/nextcloud/
四、数据迁移
数据恢复过程
在上面的环境中(1Panel + Docker + linuxserver/nextcloud 镜像),恢复 Nextcloud 数据需要按顺序恢复 数据库 和 文件数据(包括配置)。下面是一个完整、安全、可操作的恢复流程。
🔁 恢复前提
- 你有以下备份内容:
- 数据库 SQL 文件(如
db_20251129.sql) - 用户文件目录(如
/backup/nextcloud/data/) - 配置目录(如
/backup/nextcloud/config/)
- 数据库 SQL 文件(如
- Nextcloud 容器和 MySQL 容器已停止或处于维护状态
- 你知道数据库密码(用于恢复)
🚧 第一步:停止 Nextcloud 容器(避免写入冲突)
# 进入 Nextcloud 应用目录
cd /opt/1panel/apps/nextcloud/nextcloud
# 停止容器(使用 docker-compose)
docker-compose down
⚠️ 注意:不要删除容器,只停止即可。
docker-compose down会停掉容器但保留卷(volumes)。
🗃️ 第二步:恢复数据库
1. 确认 MySQL 容器是否运行
docker ps | grep mysql
如果没运行,先启动它(因为要导入数据):
# 如果 MySQL 是独立部署的(非 nextcloud compose 管理)
docker start your-mysql-container-name
# 如果 MySQL 也在 nextcloud 的 compose 中(不太可能),则:
# docker-compose up -d mysql
2. 导入备份的 SQL 文件
# 假设你的备份文件是 /backup/nextcloud/db_20251129.sql
# 假设 MySQL 容器名为 nextcloud-mysql-1(请根据实际调整)
docker exec -i nextcloud-mysql-1 mysql -u root -p"你的MySQL密码" nextcloud < /backup/nextcloud/db_20251129.sql
✅ 成功导入后,数据库就恢复到备份时的状态了。
📁 第三步:恢复用户文件和配置
1. 清空当前数据(可选,但推荐)
如果你要完全覆盖现有数据:
# 删除现有 data 和 config(谨慎!确保已备份当前数据)
rm -rf /opt/1panel/apps/nextcloud/nextcloud/data/data/*
rm -rf /opt/1panel/apps/nextcloud/nextcloud/data/config/*
💡 如果只是部分恢复或测试,可以跳过清空,直接覆盖。
2. 恢复用户文件(data)
rsync -a /backup/nextcloud/data/ /opt/1panel/apps/nextcloud/nextcloud/data/data/
3. 恢复配置(config)
rsync -a /backup/nextcloud/config/ /opt/1panel/apps/nextcloud/nextcloud/data/config/
4. 修复权限【很重要】
linuxserver/nextcloud 镜像使用 PUID/PGID 控制权限,默认是 1000:1000。
chown -R 1000:1000 /opt/1panel/apps/nextcloud/nextcloud/data/
否则 Nextcloud 可能因权限问题无法写入文件。
▶️ 第四步:启动 Nextcloud
cd /opt/1panel/apps/nextcloud/nextcloud
docker-compose up -d
等待容器启动完成(可通过 docker logs nextcloud 查看日志)。
🔧 第五步:执行修复和清理(强烈建议)
进入 Nextcloud 容器,运行修复命令:
# 进入容器(容器名通常为 nextcloud,由 docker-compose.yml 中定义)
docker exec -u abc -it nextcloud php /config/www/nextcloud/occ maintenance:repair
💡 注意:
linuxserver/nextcloud镜像中,Web 根目录是/config/www/nextcloud/,且默认用户是abc(不是 www-data)。
你也可以开启/关闭维护模式:
# 开启维护模式
docker exec -u abc -it nextcloud php /config/www/nextcloud/occ maintenance:mode --on
# 关闭
docker exec -u abc -it nextcloud php /config/www/nextcloud/occ maintenance:mode --off
实验结果


五、脚本定时备份和迁移
自动化备份脚本
你可以创建一个简单的备份脚本并设置定时任务来自动化整个过程:
nextclou备份脚本
backup-script.sh
#!/bin/bash
set -e
# 配置
NEXTCLOUD_DIR="/opt/1panel/apps/nextcloud/nextcloud"
MYSQL_CONTAINER="nextcloud-mysql-1"
MYSQL_PASS="your_password"
BACKUP_ROOT="$HOME/backup/full"
DATE=$(date +%Y-%m-%d)
mkdir -p "$BACKUP_ROOT"
# 1. 开启维护模式
echo "🔧 开启 Nextcloud 维护模式..."
docker exec -u abc nextcloud php /app/www/occ maintenance:mode --on
# 2. 备份数据库(使用 --single-transaction)
echo "🗃️ 备份数据库..."
docker exec -i "$MYSQL_CONTAINER" \ sh -c "exec mysqldump -u root -p'$MYSQL_PASS' --single-transaction --routines --triggers nextcloud" \ | gzip > "$BACKUP_ROOT/db_$DATE.sql.gz"
# 3. 备份文件
echo "📁 备份 Nextcloud data 和 config..." tar -czf "$BACKUP_ROOT/nextcloud_$DATE.tar.gz" -C "$NEXTCLOUD_DIR/data" data config
# 4. 关闭维护模式
echo "✅ 关闭维护模式..."
docker exec -u abc nextcloud php /app/www/occ maintenance:mode --off
# 5. 清理旧备份 ,清除前3天的备份
find "$BACKUP_ROOT" -name "*.gz" -mtime +3 -delete echo "🎉 备份完成!"
然后将其添加到 cron 定时任务中:
chmod +x /path/to/backup-script.sh
crontab -e
# 添加以下行(每天凌晨2点执行备份)
0 2 * * * /path/to/backup-script.sh
mysql备份脚本
#!/bin/bash
# Backup MySQL database only
set -e
# === 配置区 ===
MYSQL_CONTAINER="nextcloud-mysql-1" # 替换为你的 MySQL 容器名
MYSQL_ROOT_PASSWORD="your_mysql_password" # 替换为你的 MySQL 密码
DB_NAME="nextcloud"
BACKUP_ROOT="$HOME/backup/mysql"
DATE=$(date +%Y-%m-%d)
mkdir -p "$BACKUP_ROOT"
# 备份数据库并压缩
echo "Backing up MySQL database '$DB_NAME' from container '$MYSQL_CONTAINER'..." docker exec -i "$MYSQL_CONTAINER" \ sh -c "exec mysqldump -u root -p'$MYSQL_ROOT_PASSWORD' --single-transaction $DB_NAME" \ | gzip > "$BACKUP_ROOT/nextcloud_db_$DATE.sql.gz"
# 清理 3 天前的备份
find "$BACKUP_ROOT" -name "*.sql.gz" -mtime +3 -delete
echo "✅ MySQL backup completed: $BACKUP_ROOT/nextcloud_db_$DATE.sql.gz"
完整备份(Nextcloud + MySQL)
创建文件:~/backup_nextcloud_full.sh
#!/bin/bash
# Full backup: Nextcloud files + config + MySQL database
set -e
# === 配置区 ===
NEXTCLOUD_DIR="/opt/1panel/apps/nextcloud/nextcloud"
MYSQL_CONTAINER="nextcloud-mysql-1"
MYSQL_ROOT_PASSWORD="your_mysql_password"
DB_NAME="nextcloud"
BACKUP_ROOT="$HOME/backup/full"
DATE=$(date +%Y-%m-%d)
mkdir -p "$BACKUP_ROOT"
# 开启维护模式
echo "🔧 开启 Nextcloud 维护模式..."
docker exec -u abc nextcloud php /app/www/public/occ maintenance:mode --on
# ---- 1. 备份数据库 ----
echo "Backing up MySQL database..." docker exec -i "$MYSQL_CONTAINER" \ sh -c "exec mysqldump -u root -p'$MYSQL_ROOT_PASSWORD' --single-transaction $DB_NAME" \ | gzip > "$BACKUP_ROOT/nextcloud_db_$DATE.sql.gz"
# ---- 2. 备份 nextcloud文件和配置Nextcloud data 和 config ----
echo "Backing up Nextcloud data and config..."
tar -czf "$BACKUP_ROOT/nextcloud_full_$DATE.tar.gz" -C "$NEXTCLOUD_DIR/data" data config
# 关闭维护模式
echo "✅ 关闭 Nextcloud 维护模式..."
docker exec -u abc nextcloud php /app/www/public/occ maintenance:mode --off
# ---- 3. 清理旧备份 ----
find "$BACKUP_ROOT" -name "*.gz" -mtime +3 -delete
echo "✅ Full backup completed!"
echo "📁 Data & Config: $BACKUP_ROOT/nextcloud_full_$DATE.tar.gz"
echo "🗃️ Database: $BACKUP_ROOT/nextcloud_db_$DATE.sql.gz"
🔐 设置脚本权限
chmod +x ~/backup_nextcloud.sh
chmod +x ~/backup_mysql.sh
chmod +x ~/backup_nextcloud_full.sh
定时任务
crontab -e
添加
# 每天凌晨 2 点全量备份
0 2 * * * /root/backup_nextcloud_full.sh >> /var/log/nextcloud-backup.log 2>&1
初期建议保留日志(
>> /var/log/...),确认稳定后再改为>/dev/null 2>&1
更多推荐
所有评论(0)