Goal: Build a modern, scalable cloud environment
This repository documents my journey from manual click-ops to a fully automated cloud environment managed via Infrastructure as Code (IaC) on Oracle Cloud Infrastructure (OCI).
- Cloud Provider: Oracle Cloud Infrastructure (OCI)
- Infrastructure as Code: Terraform
- Containerization: Docker & Docker Compose
- Traffic Routing & SSL: Traefik / Nginx Proxy Manager
- Monitoring & Management: Portainer, Uptime Kuma, Watchtower
Focus: Establish an indestructible baseline on the "Always Free" tier.
- Account Hardening: Enabled MFA for OCI login and set a budget alert (> €1.00).
- Base Instance: Provisioned an "Ampere A1" instance (ARM) with 4 Cores, 24 GB RAM, and Ubuntu.
- Cloud Network (VCN): Configured Ingress Rules (opened ports 80 & 443).
- Docker Setup: Installed Docker, Docker Compose, and Portainer for management.
Focus: Learn automation and resource management.
- Terraform Basics: Local setup and API keys configured via
.oci/config. - The Sandbox: Wrote scripts to automatically provision and destroy x86 test servers (
terraform apply&terraform destroy). - Version Control: Established a secure GitHub repository (including strict
.gitignoreto protect tfstate files and credentials).
Focus: Professional traffic routing and container updates.
- Reverse Proxy: Set up as a Docker container on the base instance.
- Domain Routing: Configured DNS records and Let's Encrypt for automatic SSL certificates.
- Watchtower: Implemented automated update management for running containers.
Focus: Deploy visible applications that utilize the server's resources.
- Monitoring: Deployed Uptime Kuma to monitor cloud services and the local homelab.
- Workspaces: Deployed Kasm in Docker to leverage the 24 GB RAM of the ARM instance for desktop streaming.
- Clean-Up: Ensured all manual and Terraform-generated x86 resources are completely destroyed.
remote-devops-lab/
├── .gitignore
├── README.md
│
├── terraform/
│ └── proxmox/
│ ├── main.tf
│ ├── providers.tf
│ ├── variables.tf
│ ├── outputs.tf
│ ├── terraform.tfvars
│ ├── templates/
│ │ └── inventory.tftpl
│ └── modules/
│ └── ubuntu-vm/
│ ├── main.tf
│ ├── variables.tf
│ └── outputs.tf
│
├── ansible/
│ ├── ansible.cfg <-- Basic ansible settings
│ ├── inventories/
│ │ └── production/
│ │ ├── hosts.ini <-- AUTO-GENERATED by Terraform! Do not edit manually.
│ │ ├── group_vars/
│ │ │ ├── all.yml
│ │ │ ├── docker_nodes.yml <-- Variables for all docker hosts
│ │ │ └── proxy_nodes.yml
│ │ └── host_vars/ <-- VM specific variables
│ │
│ ├── playbooks/
│ │ ├── site.yml <-- Master playbook
│ │ ├── docker.yml <-- Maps docker role to VMs
│ │ └── proxy.yml <-- Maps proxy role to VMs
│ │
│ └── roles/
│ ├── docker_setup/ <-- Installs docker engine
│ │ └── tasks/main.yml
│ ├── deploy_compose/ <-- Generic role to copy and run compose files
│ │ └── tasks/main.yml
│ └── nginx_proxy/
│ └── tasks/main.yml
│
└── docker/
├── portainer/
│ └── docker-compose.yml
├── reverse-proxy/
│ └── docker-compose.yml
├── watchtower/
│ └── docker-compose.yml
├── monitoring/
│ └── docker-compose.yml
└── workspaces/
└── docker-compose.yml