A complete infrastructure-as-code setup managing multiple servers and services from a single repository. This project orchestrates over 17 containerized services including authentication, IoT automation, monitoring, remote access, and more across both a production VPS and edge devices.
I got tired of manually configuring services every time something broke or when I wanted to try something new. You know the drill - SSH into a server, run some commands, edit some config files, hope you remember what you did when it inevitably breaks next month. It gets old fast.
I wanted a way to manage everything declaratively. If a server dies, I should be able to spin up a new one and get everything running again with a single command. If I mess something up, I should be able to roll back easily. And most importantly, I wanted to learn how real infrastructure is managed in production environments.
Cloud providers make this easy but expensive. Running all these services on AWS or GCP would cost hundreds of dollars a month. Instead, I invested in a VPS and some local hardware, and built my own automation around it. Now I have full control, it costs me about less than 2 coffees this days, and I’ve learned a ton about infrastructure management in the process.
The infrastructure currently manages:
All services are protected by OAuth2 where appropriate and accessible via proper domain names with automatic SSL certificates through Cloudflare.
You can see the full dashboard at homer.vultur.josnelihurt.me.
The setup uses a layered approach:
Each service follows consistent patterns: isolated Docker networks, centralized logging with size limits (learned that lesson the hard way when logs filled up the disk), OAuth2 protection for sensitive services, and health checks for deployment verification.
Everything is organized by target server. The services/ directory contains subdirectories for each server, and deployment scripts are similarly organized. When you want to deploy something, you run a script like ./scripts/vultur/deploy_iot.sh and it handles:
.secrets directoryThis means I can deploy to production from my laptop, from a CI/CD pipeline, or even from my phone in a pinch. The entire state of my infrastructure lives in git, except for secrets which are managed separately (yeah plain files for now, maybe one day I can use something more secure than that lol).
This project taught me more about real-world infrastructure than any tutorial could. Some highlights:
The infrastructure continues to evolve as I add new services or improve existing patterns. Having everything in code means I can experiment freely - if something breaks, I just roll back to the previous commit.