All posts

Self-hosting / Migrating docker-compose application to M1 Mac

Posted On 06.06.2022

Previously, I hosted Plausible on my Linux server. It’s a Google Analytics alternative, that runs as a set of 4 Docker containers, managed with docker-compose. Which is cool.

The uncool part is, that I’m spending 20 bucks a month for a VPS, just to run a single application. So, I decided that this waste stop today. With this money, I would get an extra 4 cups of coffee.

I also have an M1 Mac mini sitting around at home and does absolutely nothing. So, this gonna be my home server, I’m gonna migrate the Plausible containers into this machine.

Backing up the data from the old host

When running as containers, Plausible stores its data in 3 Docker volumes:

DRIVER              VOLUME NAME
local               plausible_db-data
local               plausible_event-data
local               plausible_geoip

To migrate these data volumes, we first need to export them. Since there is no way to export all of them at once, we need to do it individually, I’m gonna write a small script called backup to make the job easier.

(Well, actually this script was taken from this Gist)

File: backup.sh

VOLUME_NAME=$1
docker run --rm --volume $VOLUME_NAME:/data \
    -v $(pwd):/backup alpine \
    tar -zcvf /backup/$VOLUME_NAME.tar /data

This script will create a temporary container, mount the $VOLUME_NAME volume as its data folder, and create a tarball of that data. Now we can create the backup data:

$ ./backup.sh plausible_db-data
$ ./backup.sh plausible_event-data
$ ./backup.sh plausible_geoip

The output will be 3 files in the current working directory: plausible_db-data.tar, plausible_event-data.tar, and plausible_geoip.tar.

Now I can move these files into my Mac machine.

Restoring data in the new host

In my home machine, I created a script called restore.sh. Which also creates a temporary container, extracts and mounts the tarball as its data volume with the name of $VOLUME_NAME.

File: restore.sh

VOLUME_NAME=$1
docker run --rm  \
    --volume $VOLUME_NAME:/dbdata \
    --volume $(pwd):/backup alpine  \
    tar xvf /backup/$VOLUME_NAME.tar -C /dbdata --strip 1

And restore the data:

$ ./restore.sh plausible_db-data
$ ./restore.sh plausible_event-data
$ ./restore.sh plausible_geoip

Migrating docker-compose config

With all the data migrated, now I can just copy the same docker-compose.yml file from my Linux host into my home machine and run it. But there’s a catch.

When running on ARM64 devices like M1 Mac mini, Docker only supports ARM64 images.

For a self-hosted Plausible application, there are 3 containers:

  • bytemark/smtp
  • plausible/anayltics
  • yandex/clickhouse-server

At the time of writing, only clickhouse-server has an ARM64 image in the new version, so, we need to modify the docker-compose.yml to use the alternative multi-arch images (until Plausible supports ARM64 officially).

  • Replace bytemark/smtp with navanchauhan/smtp
  • Replace plausible/anayltics with justsky/analytics
  • Update yandex/clickhouse-server to the new version yandex/clickhouse-server:22.4.2.1

Now things should be good.


The last thing is to deal with the dynamic IP of my home internet, there is a lot of dynamic DNS solution, but the most easy way to handle this is to use Cloudflare Tunnel.