メインコンテンツまでスキップ

Nextcloudのサーバーを移行する

いつかはNextcloudのサーバーを移行しないといけない時期が来ることがあります。

たとえばレンタルサーバーからVPS、VPSから他社のVPSなど
その時に必要になるメモです

Nextcloudのデータ移行する

rysyncを使います。

sudoをつけてますがレンタルサーバーの場合は使えないので消してください。

前提

新しいサーバーは既にセットアップが完了しているものとします。

古いサーバーから新しいサーバーへ移行する

ポート番号は私の場合は変えてるの-pコマンドを付けていますがつけない場合は自動で22です。

初回,400GBでちゃんとは確認はしてないですが1時間ちょっとかかりました。

認証鍵の場合

コマンドは古いサーバーから実行する必要があります。
鍵ファイルは一時的に古いサーバーに転送してください。
ユーザー名@新サーバーIPは確実に変更してください。例(momijiina@192.168.1.150)

sudo rsync -avz --delete -e "ssh -i /path/to/your/private_key -p 22" /var/www/nextcloud/ ユーザー名@新サーバーIP:/var/www/nextcloud/

Are you sure you want to continue connecting (yes/no/[fingerprint])? と聞かれますyesにすると次回から聞かれません パスフレーズを設定している場合はパスフレーズ入力を求められます。(パスワード認証の場合も)

パスワードの場合

コマンドは古いサーバーから実行する必要があります。
ユーザー名@新サーバーIPは確実に変更してください。例(momijiina@192.168.1.150)

sudo rsync -avz --delete -e "ssh -p 22" /var/www/nextcloud/ ユーザー名@新サーバーIP:/var/www/nextcloud/

Are you sure you want to continue connecting (yes/no/[fingerprint])? と聞かれますyesにすると次回から聞かれません パスフレーズを設定している場合はパスフレーズ入力を求められます。(パスワード認証の場合も)

書き込みエラーがでる場合

新しいサーバーでroot権限ユーザー以外の場合はフォルダに一時的に権限を割りあてる必要があります。
古いサーバーからアクセスする際の新しいサーバーのユーザー名です(ユーザー名@新サーバーIPのやつ)

sudo mkdir -p /var/www/nextcloud
sudo chown ユーザー名:ユーザー名 /var/www/nextcloud

自動で定期的に同期する場合(不要かな)

夜間などに自動実行したい場合はcronでスケジュールできます。
(パスフレーズを使っているとcronでは実施できないので注意(別途認証を作成してください))
実際、個人や中小企業レベルなら毎日、数十GBアップロードするとかない場合は3-7日前に1度、同期しておけば当日は30分以内に終わるはずなので不要です。
サーバーの回線速度があまりにも遅い場合などは事前に必要かな
例: 毎日午前2時に同期

0 2 * * * rsync -avz --delete -e "ssh -i /path/to/your/private_key" /var/www/html/nextcloud/ ユーザー名@新サーバーIP:/var/www/nextcloud/

移行当日に必ず行うこと

データの整合性を確実にとる為、Nextcloudをメンテナンスモードへ移行

sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --on

移行後に最後の同期をとる

sudo rsync -avz --delete -e "ssh -i /path/to/your/private_key -p 22" /var/www/html/nextcloud/ ユーザー名@新サーバーIP:/var/www/nextcloud/

SQLのコピー(バックアップ)

DBパスワードを聞かれます(わからない場合は事前準備を行っておいてください)
MariaDBのユーザー名がnextcloud、データベース名がnextcloudの場合:

sudo mysqldump --skip-lock-tables --single-transaction --default-character-set=utf8mb4 -u nextcloud -p nextcloud > nextcloud-sqlbkp_$(date +"%Y%m%d").bak

[説明]
-u:MariaDBのユーザー名
-p:パスワード入力プロンプトが出る(そのまま-pだけでOK)
[データベース名]:Nextcloudで使っているデータベース名
nextcloud-sqlbkp_$(date +"%Y%m%d").bak:バックアップファイル名(これは年月日で出力されるようにしてます)

新しいVPS側でSQLをアップロード

事前にデータベース(空)を作成しておく必要があります。
mysql -u root -p

新しいサーバーでDBの新規作成

CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost' IDENTIFIED BY 'パスワード';
FLUSH PRIVILEGES;
EXIT;

作成したデータベースへ旧サーバーのものを上書きする

mysql -u [ユーザー名] -p [データベース名] < [バックアップファイル名]

[例] ユーザー名:nextcloud
データベース名:nextcloud
バックアップファイル名:nextcloud-sqlbkp_20250717.bak の場合

mysql -u nextcloud -p nextcloud < nextcloud-sqlbkp_20250717.bak

最後に権限を戻す

nginxなどで使用する権限にしてください

sudo chown -R www-data:www-data /var/www/nextcloud

中の権限もls -laなどで念のため確認してください。
以上です

あとはDNSのIP変更とnginxやapache2で問題なくアクセスできるかファイルが開けるか等を確認してください。
Nextcloudもメンテナンスを解除

sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --off

もし何も表示されないとかあれば一度,occコマンドを実行してみてください。
新しいサーバーでモジュールなどが足りない場合などもあります。