I’m sharing my recent experience of migrating a self-hosted Discourse installation from one VPS to another, as a way of saying ‘thanks!’ to the creators of Discourse and its community of administrators. This migration preserves LetsEncrypt SSL & email configurations.
The original installation was on a Google Cloud Platform (GCP) g1-small instance type (1 vCPU, 1.7 GB RAM), using the official guide (INSTALL-cloud.md) & tracking the tests-passed branch.
The new installation is on an Evolution Host ‘Developer’ type KVM VPS (2 CPU cores, 2 GB RAM, 40 GB SSD, 7m23s rebuild time, €10/mo). Ubuntu Server 18.04.4 minimal was installed with a 1GB swap partition (likely based on a template).
If your host was installed with extra software, be sure to remove unnecessary software, e.g. web servers, and be sure to secure your host (default usernames, passwords, sshd configs, etc.).
What follows are the terminal commands issued as root, and scrubbed of installation-specific data (replace parts in ALL CAPS with your own). Please comment with any corrections or questions!
New host preparation
apt update && apt -y dist-upgrade
apt install -y byobu mosh htop iotop hugepages curl git && byobu-enable
hugeadm --thp-never
fallocate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
echo '/swapfile swap swap auto 0 0' | tee -a /etc/fstab
echo 'vm.swappiness = 10' > /etc/sysctl.d/30-discourse-swap.conf
git clone https://github.com/discourse/discourse_docker.git /var/discourse
reboot
Old host preparation & backup of Discourse files
cd /var/discourse
./launcher rebuild app
./launcher enter app
discourse backup
exit
(note the filename of your Discourse backup)
cp -v containers/app.yml ~
cd shared/standalone
cp -v settings.yml ~
tar cvf ~/ssl.tar ssl
tar cvf ~/letsencrypt.tar letsencrypt
cd ~
scp -C ssl.tar letsencrypt.tar app.yml settings.yml USERNAME@NEW-HOST-IP:~
scp /var/discourse/shared/standalone/backups/default/YOUR-DISCOURSE-BACKUP.tar.gz USERNAME@NEW-HOST-IP:~
exit
New host restore Discourse
(move the files copied with scp
above to the root user’s home directory)
echo 'NEW-HOST-IP YOUR-DISCOURSE-FQHN' | tee -a /etc/hosts
cd /var/discourse
cp -v ~/app.yml containers
mkdir -v shared/standalone
cd shared/standalone
cp -v ~/settings.yml .
tar xvf ~/ssl.tar
tar xvf ~/letsencrypt.tar
cd /var/discourse
./discourse-setup
(discourse-setup
should complete error-free, allowing you to check all relevant configuration info)
mkdir -v shared/standalone/backups/default
cp -v ~/YOUR-DISCOURSE-BACKUP.tar.gz shared/standalone/backups/default
./launcher enter app
discourse enable_restore
discourse restore YOUR-DISCOURSE-BACKUP.tar.gz
discourse disable_restore
Testing from your local machine
echo 'NEW-HOST-IP YOUR-DISCOURSE-FQHN' | tee -a /etc/hosts
Browse to https://YOUR-DISCOURSE-FQHN/admin/email
At the bottom of the page, enter your email address to test email sending, and browse around your Discourse site to confirm working status.
When you are satisfied that all is is working order, change the DNS A record for YOUR-DISCOURSE-FQHN to point to your new host’s IP address.