Some quick notes (mostly to myself) on how to migrate nextcloud to another server, while changing to a docker-based system, and also updating across multiple major versions. In my case, I had a server running version 19, and the current stable version at time of update was 21. Direct migration across multiple major steps is not supported, so I first ported to 19, and then upgraded first to 20, and then to 21. This took a while to figure out from multiple sources, so here a brief summary of the main steps.
Step 1: Pull database backup on old server:
mysqldump --single-transaction -h localhost -unextcloud -pYOUR_DB_PASSWORD nextcloud > db_backup.sql
Step 2: Set up docker instance on new server
I’m installing Nextcloud in folder /home/nextcloud.
Create docker-compose.yml in /home/nextcloud (adapted from https://github.com/nextcloud/docker/tree/master/.examples , example with-nginx-proxy)
- copy docker-compose.yml, db.env, and the proxy folder into /home/nextcloud
- create the following folders:
- edit your password in db.env
- Edited docker-compose.yml:
version: '3' services: db: image: mariadb command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW restart: always volumes: - ./database:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD="<YOUR_DB_PASSWORD>" env_file: - db.env redis: image: redis:alpine restart: always app: # here you can specify the version of Nextcloud to install. # Should match the version of old system image: nextcloud:19-apache restart: always volumes: - ./app:/var/www/html - ./data:/var/www/html/data environment: - VIRTUAL_HOST=the.domain.com # enter your domain name - LETSENCRYPT_HOST=the.domain.com # enter your domain name - LETSENCRYPT_EMAILfirstname.lastname@example.org # enter your admin email here - MYSQL_HOST=db - REDIS_HOST=redis env_file: - db.env depends_on: - db - redis networks: - proxy-tier - default cron: image: nextcloud:apache restart: always volumes: - ./app:/var/www/html entrypoint: /cron.sh depends_on: - db - redis proxy: build: ./proxy restart: always ports: - 80:80 - 443:443 labels: com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true" volumes: - ./certs:/etc/nginx/certs:ro - ./vhost.d:/etc/nginx/vhost.d - ./html:/usr/share/nginx/html - /var/run/docker.sock:/tmp/docker.sock:ro networks: - proxy-tier letsencrypt-companion: image: jrcs/letsencrypt-nginx-proxy-companion restart: always volumes: - ./certs:/etc/nginx/certs - ./vhost.d:/etc/nginx/vhost.d - ./html:/usr/share/nginx/html - /var/run/docker.sock:/var/run/docker.sock:ro networks: - proxy-tier depends_on: - proxy volumes: database: app: data: certs: vhost.d: html: networks: proxy-tier:
Step 3: pull files and database across to new server
cd /home/nextcloud/data rsync -aAXv -e ssh email@example.com_domain.com:/path/to/data/folder . scp firstname.lastname@example.org_domain.com:db_backup.sql /root/
Step 4: Bring up the docker instance:
cd /home/nextcloud docker-compose build --pull docker-compose up -d # alternatively, if this is a re-run, add --force-recreate --build
Step 5: Import database
docker cp /root/db_backup.sql nextcloud_db_1:/dmp docker-compose exec db sh -c "mysql -unextcloud -pYOUR_DB_PASSWORD nextcloud < /dmp"
Step 6: import old config
- copy config/config.php from old server to new server into
- check settings, in particular the host name, database name, database user
- change dbhost to
'dbhost' => 'db'
Step 7: Run Nextcloud in browser
Nextcloud should now come up (might take a minute or two). It should accept logins from existing user accounts. Log in as admin. If there is a “finish setup” screen, something went wrong (probably wrong config.php). Things to check:
- if there are server errors, it might be a permissions problem. All files in app and data should be www-data:root:
docker-compose exec app chown -R www-data:root /var/www/html/data docker-compose exec app chown -R www-data:root /var/www/html/ # (should not be needed)
if there are errors, try to run occ diagnostics:
docker exec -it -u 33 nextcloud_app_1 /bin/bash # run as www-data user php occ integrity:check-core
- log in as admin, go to settings/overview, check if there are any problems that need fixing
- if there is an error about running cron, try going to “basic settings”, change cron settings to something, and back to “cron”. This seems to fix it.
Step 8: roll versions forward
Assuming everything worked fine, now it is time to update to the newest version. In Docker installs, this can’t be done through the web interface updater. The process is to pull the newest version with docker-compose, and rebuild the instance. However, as we’ve specified version 19 above, it won’t pull the latest version. So we edit the docker-compose file: change
and rebuild/restart everything:
docker-compose pull docker-compose up -d
It may take a minute or two until Nextcloud comes back up in the browser, as it is running the update in the background. After it comes up again, log in as admin and check for problems. Then repeat the process to go from 20 to 21. The last update brought up errors regarding database keys and bigints, which can be fixed with some occ commands (instructions will be given by Nextcloud on the settings/overview page).