Changing Digital Ocean droplets with doctl (resize, floating ip, rename, etc)

Docs: doctl compute floating-ip


Droplet and Floating IP list

doctl -t =do_api_key= compute droplet list
doctl -t =do_api_key= compute floating-ip list

Create Floating IP (assign to old)

doctl -t =do_api_key= compute floating-ip create --droplet-id =old_droplet=

establish connection to new server and from new to old

ssh -o StrictHostKeyChecking=accept-new =new_ip=
ssh -o StrictHostKeyChecking=accept-new =old_ip=
exit

get data from old server

cd /var/discourse
rsync -rav --numeric-ids =old_ip=:/var/discourse/containers/ /var/discourse/containers/
rsync -rav --numeric-ids =old_ip=:/var/discourse/shared/ /var/discourse/shared/ --exclude log --exclude postgres_* --exclude redis_data --exclude log --exclude tmp --exclude state

build containers

[ -f containers/data.yml ] && ./launcher rebuild data
[ -f containers/web_only.yml ] && ./launcher rebuild web_only
[ -f containers/app.yml ] && ./launcher rebuild app
[ -f containers/mail-receiver.yml ] && ./launcher rebuild mail-receiver

make old server read-only and make backup

Connect to old server

ssh =old_ip=

Get into rails

docker exec -it $(docker ps --filter "publish=443" --format "{{.Names}}") bash -c 'rails c'

make readonly, backup, announce server move

Discourse.enable_readonly_mode(Discourse::STAFF_WRITES_ONLY_MODE_KEY);
BackupRestore::Backuper.new(Discourse.system_user.id, with_uploads: false).run;
SiteSetting.global_notice='Move to new server is happening now. Thanks for your patience.'
exit # from rails
exit # from ssh

Enable restore on new computer

docker exec -it $(docker ps --filter "publish=443" --format "{{.Names}}") bash -c  "discourse enable_restore"

Get data (again)

rsync -rav --numeric-ids =old_ip=:/var/discourse/shared/ /var/discourse/shared/ --exclude log --exclude postgres_* --exclude redis_data --exclude letsencrypt --exclude ssl --exclude log --exclude tmp --exclude state

Restore latest backup

docker exec -it $(docker ps --filter "publish=443" --format "{{.Names}}") bash
$(discourse restore|grep gz|head -1)

Assign existing Floating IP to existing (new) Droplet

doctl -t =do_api_key= compute floating-ip-action assign =floating_ip= =new_droplet= # update

Stop old droplet

doctl -t =do_api_key= compute droplet-action shutdown =old_droplet= # Test

Delete old droplet

doctl -t =do_api_key= compute droplet delete =old_droplet=

Rename droplets

doctl -t =do_api_key= compute droplet-action rename --droplet-name =old_droplet_name= =old_droplet=
doctl -t =do_api_key= compute droplet-action rename --droplet-name =new_droplet_name= =new_droplet=

Change hostname

hostnamectl set-hostname =short_hostname=

Resize

doctl -t =do_api_key= compute droplet-action resize =old_droplet= --size =droplet_size= --resize-disk=true # resize

Size list

doctl -t =do_api_key= compute size list|less

Staff Writes only

Discourse.enable_readonly_mode(Discourse::STAFF_WRITES_ONLY_MODE_KEY)
Discourse.disable_readonly_mode(Discourse::STAFF_WRITES_ONLY_MODE_KEY)