I miss the days where app installation was just "unzip, edit the config file, upload to your web server and hit up the install page". Now it's all Docker and gulp and build and urgh soooo complicated.
I host tens of self-hosted apps for various purposes, including ones similar to this one, all via docker-compose. Setting up new ones is a breeze (thanks to Traefik), backing up the configuration and data is trivial, upgrading to the latest version takes a few minutes at most. I’m confident my workflow is simpler and more convenient than yours. Granted, the initial investment to learn and understand the tools is pretty large.
Any chance you could outline your process? E.g. if you had to start from a new VM, what all would you need to do?
I've always just set everything up via the command line, and it's tedious/not repeatable (and there's also no isolation). I'm sure there's a better way, but usually the solutions I see involve gluing together a bunch of different tools--possibly even more work than I'm already doing (although there are benefits!).
Sure! My requirements are very simple, so my setup isn’t very complicated. The process isn’t precisely repeatable because each self-hosted app has different requirements, some require multiple containers, and so on.
I start with a template docker-compose yaml that contains the barebones: network settings, labels for Traefik (eg. Let’s Encrypt config), placeholders for the image/container name, volumes, env variables, etc. I fill this in based on the container I want to setup. Many self-hosted apps provide example docker-compose configurations - I often just merge them with my template by hand. It’s usually just a couple of lines.
I edit the files in vscode (but directly over ssh). Not a huge fan of editing YAML in the terminal.
Then, I execute an aliased command that goes something like this:
docker-compose down ; docker-compose pull && docker-compose up -d && docker-compose logs -f
to see if the container stands up, and tweak if necessary.
Can't speak for the parent but since I also use a docker-compose & traefik based setup I can describe my migration process (executed by ansible in my case, could easily be done manually though):
1. Copy docker-compose.yml (for my private stuff there is a single one containing all services + traefik) and config files (host-mounted into services from a config dir) to new host.
2. Start services (docker-compose up).
3. Restore runtime data (in my case I mostly pull some db dumps from my restic repos and load them into the db containers).
In this specific case it is not very complicated and actually pretty close to unzip, edit config and run. I have deployed it on a Raspberry running FreeBSD, so Docker is not an option.
The backend server is written in Go and after building it only a single binary has to be deployed. A second repository contains the frontend (HTML, JS) which you copy to a path that you make available via your webserver. That's basically it.
I miss the days when you could install most things via apt-get and thus have security updates automated, documentation in a standard location, and so on.
Running an arbitrary thing in Docker is far easier than without it. If I want to run the PHP/MySQL-based Matomo, I can just grab the ready-made docker-compose.yml [0] and tell my main nginx to proxy_pass onto it. I don’t need to figure out how to configure MySQL/MariaDB/PHP-FPM and what hacks did my distro introduce to it (at least I’m not using Debian/Ubuntu, so there shouldn’t be that many). Similarly, I can get Zulip in Docker [1] (even if it’s apparently in alpha state) and not mess with the Python packaging trainwreck, and also setting up all of Redis, PostgreSQL, RabbitMQ and memcached.
If you run NixOS you get a similar experience because it’s often just services.foo.enable = true; edit a couple options to your needs and you‘re good to go. :-)
Nowadays, if databases are involved, I actually prefer docker. At least there is a standard way to manage them. I have portainer installed, now everything is just managed through a web interface. It is okay.