A fully automated, multi‑service DevOps environment featuring Python, Node.js, and Go backends, three static sites, Nginx virtual hosts, and systemd‑managed microservices — all provisioned inside a reproducible Vagrant VM.
This project demonstrates a complete DevOps workflow:
- Multi‑language backend services (Python, Node.js, Go)
- Multiple instances of each backend (horizontal scaling)
- Static websites served via Nginx
- Nginx reverse proxy routing to backend services
- systemd service management for backend processes
- Automated provisioning using Bash
- Reproducible environment using Vagrant + Ubuntu
multisite-nginx-github/
├── Vagrantfile
├── provisioning/
│ └── provision.sh
│
├── nginx/
│ ├── site1.conf
│ ├── site2.conf
│ └── site3.conf
│
├── systemd/
│ ├── python-backend.service
│ ├── python-backend-2.service
│ ├── node-backend.service
│ ├── node-backend-2.service
│ ├── go-backend.service
│ └── go-backend-2.service
│
├── python-backend/
│ ├── app.py
│ └── wsgi.py
│
├── node-backend/
│ ├── app.js
│ ├── package.json
│ └── package-lock.json
│
├── go-backend/
│ ├── main.go
│ └── go.mod
│
└── static-sites/
├── site1/public/index.html
├── site2/public/index.html
└── site3/public/index.html
┌──────────────────────────────┐
│ Vagrant VM │
│ Ubuntu (Jammy) │
└──────────────────────────────┘
│
▼
┌──────────────────────┐
│ NGINX │
│ Reverse Proxy + │
│ Static Site Hosting │
└──────────────────────┘
/ | \
/ | \
▼ ▼ ▼
┌────────────────┐ ┌────────────────┐ ┌────────────────┐
│ site1.conf │ │ site2.conf │ │ site3.conf │
│ static site │ │ Python API │ │ Node API │
└────────────────┘ └────────────────┘ └────────────────┘
\
\
▼
┌──────────────────┐
│ Go API │
└──────────────────┘
Each backend runs two systemd services, simulating horizontal scaling:
Python:
python-backend.service → port 5001
python-backend-2.service → port 5002
Node:
node-backend.service → port 3001
node-backend-2.service → port 3002
Go:
go-backend.service → port 8001
go-backend-2.service → port 8002
Nginx routes traffic to these services using upstream blocks (round‑robin load balancing).
The provisioning script (provision.sh) automates:
- Install Nginx, Python, Node.js, Go
- Install backend dependencies
- Build Go backend
- Copy systemd service files
- Enable + start all backend services
- Copy Nginx configs
- Enable sites + restart Nginx
site1.local → static-sites/site1/public/index.html
site2.local → static-sites/site2/public/index.html
site3.local → static-sites/site3/public/index.html
/python → python-backend.service + python-backend-2.service
/node → node-backend.service + node-backend-2.service
/go → go-backend.service + go-backend-2.service
Each backend has an upstream block:
upstream python_backend {
server 127.0.0.1:5001;
server 127.0.0.1:5002;
}
Example: python-backend.service
[Unit]
Description=Python Backend Service
After=network.target
[Service]
ExecStart=/usr/bin/python3 /home/vagrant/python-backend/app.py
Restart=always
User=vagrant
[Install]
WantedBy=multi-user.target
Manage services:
sudo systemctl status python-backend
sudo systemctl restart node-backend-2
sudo systemctl enable go-backend
vagrant up
vagrant ssh
http://site1.local
http://site2.local
http://site3.local
curl http://localhost/python
curl http://localhost/node
curl http://localhost/go
curl http://localhost/python
curl http://localhost/python
curl http://localhost/python
You should see alternating responses from instance 1 and instance 2.
- Vagrant
- Ubuntu Linux
- Nginx
- systemd
- Python / Flask
- Node.js / Express
- Go / net/http
- Bash
- Add Docker support
- Add CI/CD pipeline
- Add monitoring (Prometheus + Grafana)
- Add log aggregation (ELK stack)
Abiola — DevOps Engineer
St. Paul, Minnesota
Building scalable, automated infrastructure.