I have a VPS, on which a few of my side-projects are hosted. Recently, I had to set it up a few times, because I made it unusable (please don't ask me how, it was really stupid).
Every time this happened, it took me hours to set it up again. Granted, I don't know much about maintaining a server, and you can probably do it a lot faster than me, but you can never be faster than a script. So, after the second time, I finally decided it is time to automate that process.
I'm hosting ElasticSearch and a few .Net Core applications. They are all accessible via an nginx reverse proxy.
Additionally, there are a few cronjobs.
While writing the script, I decided to add Docker support to all my .Net Core applications, so there is one less thing needing to be installed.
This is extremely easy btw, just right-click -> Add Docker support -> Done. But I digress.
The script should
- install Docker, docker-compose and nginx
- pull all Docker images
- copy the nginx and ElasticSearch configuration files to the right locations
- add cronjobs
- start all applications
- configure the server so that after rebooting the applications start automatically
- install other applications that I like (e.g. htop)
Writing the script was simple, quite a lot simpler than I thought it would be. It was basically copy&pasting the commands from the vendor websites and using the Docker CLI, which is extremely well documented.
I did have some minor difficulties with specific software though, which are described in the following 2 sections.
ElasticSearch has a small fallacy. By default, the
vm.max_map_count environment variable is set to
This is too low for ES, which results in out of memory exceptions. This is very confusing, if there are a few GB of free memory.
The solution is setting
vm.max_map_count to at least
262144, as mentioned in the docs, which is quickly found after some googling.
crontab does not offer a way to simply add an entry. But as expected, others had the same problem, and Stackoverflow has an easy to use solution for it.
(crontab -l 2>/dev/null; echo "@reboot nginx -c /home/ubuntu/nginx/nginx.conf") | crontab -
This also demonstrates how applications start after a server reboot. Simply with an
@reboot crontab entry.
Automating the setup process has brought down the time until my server is ready from hours to minutes. And in those blissful minutes, I don't have to do anything, just watch the script work.
Additionally, I feel much more comfortable experimenting. If something breaks, I just have to start the script.
Automation is great!
PS: If you are interested in the whole script, you can find it here, minus my credentials of course ;)
Follow me on Twitter for more of my thoughts, articles, projects and work.