一、虚拟机环境搭建


本次实践是通过Vmware虚拟机是实现的,

  • 基于CentOS 7 64位系统,
  • 1核1G 20G
  • 网络桥接
  • 使用1panel面版
  • docker部署的mysql和nextcloud

接下来开始

创建第一台虚拟机

打开VMware虚拟机–>新建虚拟机–>典型–>下一步–>选择自己准备好的映像文件(CentOS-7-x86_64-DVD-2009.iso)–>下一步–>自己取名字和位置–>下一步–>20G,将虚拟磁盘拆分为多个文件–>下一步–>
自定义硬件–>网络适配器–>桥接模式,复制物理网络连接状态–>完成

编辑–>虚拟网络编辑器–>更改设置–>桥接模式–>以桥接至WiFi–>应用,完成

自己初始化开机
用户:root
密码:123456

  1. 关闭防火墙

    1
    systemctl disable firewalld
  2. 编写网络配置

    1
    vi /etc/sysconfig/network-scripts/ifcfg-ens33 

    ifcfg-ens33文件内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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

  3. 保存重启系统

    1
    init 6
  4. 查看ip地址

    1
    ip a

    5545

  5. ping一下外网

    1
    ping www.baidu.com


    网络连接成功

  6. 更新源

    1
    sudo vi /etc/yum.repos.d/CentOS-Base.repo

    CentOS-Base.repo

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

清理缓存 + 重建缓存

1
2
sudo yum clean all 
sudo yum makecache
  1. 更新

    1
    2
    sudo yum install update -y
    sudo yum install upgrade -y
  2. 按装可能需要的指令

    1
    2
    3
    4
    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 源(如阿里云源)


第一步:卸载旧版本(如有)

1
2
3
4
5
6
7
8
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

第二步:安装必要依赖

1
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

第三步:添加 Docker 官方仓库(使用阿里云镜像代理)

⚠️ 官方 download.docker.com 在 CentOS 7 上可能无法解析或下载失败,建议使用 阿里云 Docker CE 镜像

1
2
3
sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

这个地址是阿里云对 Docker 官方仓库的镜像,速度更快且兼容 CentOS 7。


第四步:安装 Docker Engine

1
sudo yum install -y docker-ce docker-ce-cli containerd.io

如果提示找不到包,可先列出可用版本:

1
yum list docker-ce --showduplicates | sort -r

然后指定版本安装(例如):

1
sudo yum install -y docker-ce-20.10.21 docker-ce-cli-20.10.21 containerd.io

第五步:启动并设置开机自启

1
2
sudo systemctl start docker
sudo systemctl enable docker

验证是否运行:

1
sudo docker --version

输出示例:

1
Docker version 20.10.21, build baeda1f

ipanel面板

  1. 安装1panel面板
    1
    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地址

1
vi /etc/sysconfig/network-scripts/ifcfg-ens33 

改为一以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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地址

1
ip a

创建名字为NextcloudDB的数据库

下面的密码为123456

三、 数据备份


查看docker-compose.yml

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

数据与配置文件位置

基于上述信息,可以得出以下结论:

  1. Nextcloud 用户文件存储目录(即数据目录)是挂载在宿主机的 ./data/data 路径下。
    在1panel中,这应该是 /opt/1panel/apps/nextcloud/nextcloud/data/data 目录。这个目录对应容器内部的 /data 路径。

  2. Nextcloud 配置文件 是挂载在宿主机的 ./data/config 路径下。

    对应的完整路径为 /opt/1panel/apps/nextcloud/nextcloud/data/config,该目录对应容器内部的 /config 路径。

备份策略

1. 备份用户文件(数据目录)

1
2
3
4
5
6
7
8
# 假设备份目录为 /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(请替换为实际的容器名),执行如下命令进行数据库备份:

1
2
3
4
5
6
7
# 找到 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 配置文件

1
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/
  • Nextcloud 容器和 MySQL 容器已停止或处于维护状态
  • 你知道数据库密码(用于恢复)

🚧 第一步:停止 Nextcloud 容器(避免写入冲突)

1
2
3
4
5
# 进入 Nextcloud 应用目录 
cd /opt/1panel/apps/nextcloud/nextcloud

# 停止容器(使用 docker-compose)
docker-compose down

⚠️ 注意:不要删除容器,只停止即可。docker-compose down 会停掉容器但保留卷(volumes)。

🗃️ 第二步:恢复数据库

1. 确认 MySQL 容器是否运行

1
docker ps | grep mysql

如果没运行,先启动它(因为要导入数据):

1
2
3
4
5
# 如果 MySQL 是独立部署的(非 nextcloud compose 管理) 
docker start your-mysql-container-name

# 如果 MySQL 也在 nextcloud 的 compose 中(不太可能),则:
# docker-compose up -d mysql

2. 导入备份的 SQL 文件

1
2
3
4
# 假设你的备份文件是 /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. 清空当前数据(可选,但推荐)

如果你要完全覆盖现有数据:

1
2
3
# 删除现有 data 和 config(谨慎!确保已备份当前数据) 
rm -rf /opt/1panel/apps/nextcloud/nextcloud/data/data/*
rm -rf /opt/1panel/apps/nextcloud/nextcloud/data/config/*

💡 如果只是部分恢复或测试,可以跳过清空,直接覆盖。

2. 恢复用户文件(data)

1
rsync -a /backup/nextcloud/data/ /opt/1panel/apps/nextcloud/nextcloud/data/data/

3. 恢复配置(config)

1
rsync -a /backup/nextcloud/config/ /opt/1panel/apps/nextcloud/nextcloud/data/config/

4. 修复权限【很重要】

linuxserver/nextcloud 镜像使用 PUID/PGID 控制权限,默认是 1000:1000

1
chown -R 1000:1000 /opt/1panel/apps/nextcloud/nextcloud/data/

否则 Nextcloud 可能因权限问题无法写入文件。

▶️ 第四步:启动 Nextcloud

1
2
cd /opt/1panel/apps/nextcloud/nextcloud 
docker-compose up -d

等待容器启动完成(可通过 docker logs nextcloud 查看日志)。

🔧 第五步:执行修复和清理(强烈建议)

进入 Nextcloud 容器,运行修复命令:

1
2
# 进入容器(容器名通常为 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)。

你也可以开启/关闭维护模式:

1
2
3
4
# 开启维护模式 
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

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
#!/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 定时任务中:

1
2
3
4
chmod +x /path/to/backup-script.sh 
crontab -e
# 添加以下行(每天凌晨2点执行备份)
0 2 * * * /path/to/backup-script.sh

mysql备份脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/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

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
#!/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"

🔐 设置脚本权限

1
2
3
chmod +x ~/backup_nextcloud.sh 
chmod +x ~/backup_mysql.sh
chmod +x ~/backup_nextcloud_full.sh

定时任务

1
crontab -e

添加

1
2
# 每天凌晨 2 点全量备份 
0 2 * * * /root/backup_nextcloud_full.sh >> /var/log/nextcloud-backup.log 2>&1

初期建议保留日志(>> /var/log/...),确认稳定后再改为 >/dev/null 2>&1