1 前言
笔者的ownCloud生产环境由于功能的关系需要迁移至nextCloud,于是笔者搭建好新的nextCloud环境后进行用户数据的迁移。
2 最佳实践
2.1 环境信息
2.1.1 ownCloud环境
ownCloud按照以下章节部署,
2.1.2 nextCloud环境
nextCloud按照以下章节部署,
2.1.3 环境信息汇总
ownCloud Server,
Host Name = owncloud.cmdschool.org
IP Address = 10.168.0.156
Application = owncloud 10.0.10
www Root= /var/www/owncloud
data directory = /data/owncloudData
nextCloud Server,
Host Name = nextcloud.cmdschool.org
IP Address = 10.168.0.80
Application = nextcloud 20.0.1
www Root = /var/www/nextcloud
data directory = /data/netxcloud-data
2.2 分析数据目录结构
In ownCloud Server,
2.2.1 ownCloud的目录结构
In ownCloud Server,
ls -l /data/owncloudData
可见如下输出,
total 693709
drwxrwx--- 9 apache apache 4096 Nov 4 2019 00323401-c56f11e5-a663eb63-06a7ea03
drwxrwx--- 4 apache apache 4096 Mar 13 2018 00f2b701-4b2111e7-b718eb63-06a7ea03
drwxrwx--- 5 apache apache 4096 Jun 14 2019 01963c01-5c2011e5-a663eb63-06a7ea03
#...
2.2.2 nextCloud的目录结构
In nextCloud Server,
ls -l /data/netxcloud-data/
total 3308
drwxr-xr-x. 6 apache apache 72 Nov 30 03:18 admin
drwxr-xr-x. 12 apache apache 159 Nov 20 00:32 appdata_oc19alpcvdbu
-rw-r-----. 1 apache apache 27098 Dec 3 21:42 audit.log
drwxr-xr-x. 2 apache apache 6 Nov 20 01:31 will
drwxr-xr-x. 2 apache apache 6 Nov 19 22:46 cindy
drwxr-xr-x. 2 apache apache 6 Nov 20 01:31 alan
注:以上可见由于设置的关系,数据目录存在差异,需要修正数据目录名称。
2.3 手动测试用户数据同步
In ownCloud Server,
2.3.1 取得用户ID
sudo -u apache php /var/www/owncloud/occ user:list | grep -i will
可见如下信息,
- 00323401-c56f11e5-a663eb63-06a7ea03: will (Tan Zhen Chao)
“00323401-c56f11e5-a663eb63-06a7ea03”为用户ID号,另外,如果通过数据库匹配,可参阅如下语句,
select directory_uuid from owncloud.oc_ldap_user_mapping where ldap_dn like '%will%'
2.3.2 查看用户设置
sudo -u apache php /var/www/owncloud/occ user:setting 00323401-c56f11e5-a663eb63-06a7ea03
可见如下显示,
- core:
- lang: zh_CN
- timezone: Asia/Shanghai
- files:
- file_sorting: name
- file_sorting_direction: desc
- quota: 5 GB
- files_external:
- config_version: 0.5.0
- firstrunwizard:
- show: 0
- login:
- lastLogin: 1545019099
- settings:
- email: will@cmdschool.org
- user_ldap:
- displayName: will (Tan Zhen Chao)
- firstLoginAccomplished: 1
- homePath:
- lastFeatureRefresh: 1545019692
- uid: will
注:请注意“quota”和“uid”,后面需要使用
另外,特殊情况下,也可以通过查询如下表获取Quota的大小,
select quota from owncloud.oc_accounts where user_id = "00323401-c56f11e5-a663eb63-06a7ea03"
2.3.3 同步用户数据目录
rsync -avP /var/www/owncloud/00323401-c56f11e5-a663eb63-06a7ea03/files/ nextcloud.cmdschool.org:/var/www/nextcloud/will/files/
2.3.3 配置相同的用户存储容量
ssh nextcloud.cmdschool.org sudo -u apache php /var/www/nextcloud/occ user:setting will files quota 5GB
2.3.4 扫描文件并更正数据库信息
ssh nextcloud.cmdschool.org sudo -u apache php /var/www/nextcloud/occ files:scan will
注:只扫描用户“will”的目录
2.4 批量同步用户数据
2.4.1 设置MySQL免密码登录
In ownCloud Server,
vim /etc/my.cnf
加入如下配置,
[client]
user=root
password=mysqlpwd
In ownCloud Server,
2.4.2 配置公钥认证
In ownCloud Server,
ssh-keygen
向导如下,
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
[…]
然后,使用如下命令部署公钥,
ssh-copy-id -i ~/.ssh/id_rsa.pub nextcloud.cmdschool.org
部署完毕后,使用如下命令测试,
ssh nextcloud.cmdschool.org
2.4.3 创建迁移脚本
mkdir -p ~/scripts
vim ~/scripts/rsync-data-ownCloud2netxCloud.sh
加入如下脚本,
#!/bin/bash
ownCloudRoot="/var/www/owncloud"
ownCloudData="/data/owncloudData"
nextCloudRoot="/var/www/nextcloud"
nextCloudData="/data/netxcloud-data"
nextCloudHost="nextcloud.cmdschool.org"
rsyncDataLog="/var/log/rsyncData.log"
for i in $(sudo -u apache php $ownCloudRoot"/occ" user:list | sed 's/ -//g' | cut -d":" -f1); do
userID=$i
loginID=`mysql -e "select ldap_dn from owncloud.oc_ldap_user_mapping where directory_uuid = '"$userID"'\G;" | grep 'ldap_dn:' | sed -e 's/ldap_dn: //g' -e 's/uid=//g' -e 's/cn=//g' | cut -d "," -f1 | tr 'a-z' 'A-Z'`
quota=`mysql -e "select quota from owncloud.oc_accounts where user_id = '"$userID"' \G;" | grep "quota:" | sed -e 's/ //g' | cut -d":" -f2`
if [ -z "$loginID" ]; then
echo `date "+%Y-%m-%d %H:%M:%S"`" "$userID" cannot match username!" | tee -a $rsyncDataLog
continue
fi
ssh $nextCloudHost ls -ld $nextCloudData"/"$loginID"/files/" 2> /dev/null
if [ $? != "0" ]; then
ssh $nextCloudHost mkdir -p $nextCloudData"/"$loginID"/files/"
ssh $nextCloudHost chown apache:apache -R $nextCloudData"/"$loginID"/"
fi
rsync -avP $ownCloudData"/"$userID"/files/" $nextCloudHost:$nextCloudData"/"$loginID"/files/"
ssh $nextCloudHost sudo -u apache php $nextCloudRoot"/occ files:scan "$loginID
if [ ! `echo $quota | egrep -i "gb|none" | wc -l` = 0 ]; then
ssh $nextCloudHost sudo -u apache php $nextCloudRoot"/occ user:setting "$loginID" files quota "$quota
if [ $? = "0" ]; then
echo `date "+%Y-%m-%d %H:%M:%S"`" ""$loginID quota has been changed to $quota" | tee -a $rsyncDataLog
fi
fi
#exit
done
需要特别说明的是,
– 以上脚本只适用于笔者的生产环境,如果你需要使用请慎重(可能需测试和修改)
– 与手动操作不同的是,使用用户ID查询出登录ID脚本使用的是数据库查询的方式
另外,对于不活跃用户,根据用户目录同步资料可能更加靠谱,
#!/bin/bash
ownCloudRoot="/var/www/owncloud"
ownCloudData="/data/owncloudData"
nextCloudRoot="/var/www/nextcloud"
nextCloudData="/data/netxcloud-data"
nextCloudHost="nextcloud.cmdschool.org"
rsyncDataLog="/var/log/rsyncData.log"
cd $ownCloudData
for i in $(ls -d *-*-*-*); do
userID=$i
loginID=`mysql -e "select ldap_dn from owncloud.oc_ldap_user_mapping where directory_uuid = '"$userID"'\G;" | grep 'ldap_dn:' | sed -e 's/ldap_dn: //g' -e 's/uid=//g' -e 's/cn=//g' | cut -d "," -f1 | tr 'a-z' 'A-Z'`
quota=`mysql -e "select quota from owncloud.oc_accounts where user_id = '"$userID"' \G;" | grep "quota:" | sed -e 's/ //g' | cut -d":" -f2`
if [ -z "$loginID" ]; then
echo `date "+%Y-%m-%d %H:%M:%S"`" "$userID" cannot match username!" | tee -a $rsyncDataLog
continue
fi
ssh $nextCloudHost ls -ld $nextCloudData"/"$loginID"/files/" 2> /dev/null
if [ $? != "0" ]; then
ssh $nextCloudHost mkdir -p $nextCloudData"/"$loginID"/files/"
ssh $nextCloudHost chown apache:apache -R $nextCloudData"/"$loginID"/"
fi
rsync -avP $ownCloudData"/"$userID"/files/" $nextCloudHost:$nextCloudData"/"$loginID"/files/"
ssh $nextCloudHost sudo -u apache php $nextCloudRoot"/occ files:scan "$loginID
if [ ! `echo $quota | egrep -i "gb|none" | wc -l` = 0 ]; then
ssh $nextCloudHost sudo -u apache php $nextCloudRoot"/occ user:setting "$loginID" files quota "$quota
if [ $? = "0" ]; then
echo `date "+%Y-%m-%d %H:%M:%S"`" ""$loginID quota has been changed to $quota" | tee -a $rsyncDataLog
fi
fi
#exit
done
2.4.4 执行数据同步
sh ~/scripts/rsync-data-ownCloud2netxCloud.sh