From bf9d8460b4e7b8a8519fbba5d942b8c99b4c5f1d Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 20 Nov 2025 07:53:28 +0000 Subject: [PATCH] refactor: Remove Uptime Kuma infrastructure Remove all Uptime Kuma monitoring service infrastructure following its destruction in Terraform: - Remove Uptime Kuma Terraform module and service configuration - Remove Uptime Kuma Docker Compose setup and documentation - Remove Uptime Kuma Ansible playbook and inventory - Remove Uptime Kuma domain variable and references - Remove Uptime Kuma deployment targets from Makefile - Remove Uptime Kuma validation step from CI/CD workflow - Update documentation to reflect Peekaping as primary monitoring service --- .github/workflows/pr.yaml | 6 - Makefile | 15 --- README.md | 18 +-- ansible/README.md | 14 +- ansible/inventory-uptime-kuma.ini | 8 -- ansible/playbooks/uptime-kuma.yaml | 140 -------------------- docker/uptime-kuma/.env.example | 12 -- docker/uptime-kuma/.gitignore | 8 -- docker/uptime-kuma/README.md | 42 ------ docker/uptime-kuma/docker-compose.yml | 23 ---- terraform.tfvars.example | 3 - terraform/base/main.tf | 9 -- terraform/base/variables.tf | 6 - terraform/services/uptime-kuma/main.tf | 70 ---------- terraform/services/uptime-kuma/outputs.tf | 0 terraform/services/uptime-kuma/variables.tf | 53 -------- 16 files changed, 11 insertions(+), 416 deletions(-) delete mode 100644 ansible/inventory-uptime-kuma.ini delete mode 100644 ansible/playbooks/uptime-kuma.yaml delete mode 100644 docker/uptime-kuma/.env.example delete mode 100644 docker/uptime-kuma/.gitignore delete mode 100644 docker/uptime-kuma/README.md delete mode 100644 docker/uptime-kuma/docker-compose.yml delete mode 100644 terraform/services/uptime-kuma/main.tf delete mode 100644 terraform/services/uptime-kuma/outputs.tf delete mode 100644 terraform/services/uptime-kuma/variables.tf diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 25dc12c..e083810 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -48,12 +48,6 @@ jobs: # Cleanup rm -f backend_override.tf - - name: Terraform Validate (Uptime Kuma Service) - working-directory: terraform/services/uptime-kuma - run: | - terraform init -backend=false - terraform validate - terraform-lint: name: Terraform Lint runs-on: ubuntu-latest diff --git a/Makefile b/Makefile index e50f6e3..fc70eae 100644 --- a/Makefile +++ b/Makefile @@ -71,27 +71,12 @@ output: # Show Terraform outputs terraform -chdir=$(TF_DIR) output .PHONY: output -ssh-key: # Save SSH private key to file - terraform -chdir=$(TF_DIR) output -raw ssh_private_key > uptime-kuma-key.pem - chmod 600 uptime-kuma-key.pem - @echo "SSH key saved to uptime-kuma-key.pem" -.PHONY: ssh-key - ssh-key-peekaping: # Save Peekaping SSH private key to file terraform -chdir=$(TF_DIR) output -raw module.peekaping.ssh_private_key > peekaping-key.pem chmod 600 peekaping-key.pem @echo "SSH key saved to peekaping-key.pem" .PHONY: ssh-key-peekaping -deploy-uptime: init-vendor # Deploy or update Uptime Kuma using Ansible - @echo "Deploying Uptime Kuma..." - @if [ ! -f ansible/inventory-uptime-kuma.ini ]; then \ - echo "Error: Ansible inventory file not found. Run 'make apply' first to generate it."; \ - exit 1; \ - fi - cd ansible && ansible-playbook -i inventory-uptime-kuma.ini playbooks/uptime-kuma.yaml -.PHONY: deploy-uptime - deploy-peekaping: init-vendor # Deploy or update Peekaping using Ansible @echo "Deploying Peekaping..." @if [ ! -f ansible/inventory-peekaping.ini ]; then \ diff --git a/README.md b/README.md index 9b07692..2f734c6 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Ansible. This repository manages infrastructure for: -- **Uptime Kuma**: Monitoring and status page service at `uptime.ainsley.dev` +- **Peekaping**: Monitoring service - **Backups**: Terraform backups from Backblaze to Google Drive. ## Architecture @@ -29,21 +29,15 @@ platform/ │ │ ├── outputs.tf # Global outputs │ │ └── main.tf # Module imports │ └── services/ -│ └── uptime-kuma/ # Uptime Kuma service -│ ├── main.tf # VM + firewall -│ ├── volume.tf # 10GB persistent volume -│ ├── cloud-init.yaml # VM provisioning -│ ├── variables.tf -│ └── outputs.tf +│ └── peekaping/ # Peekaping monitoring service ├── ansible/ │ ├── playbooks/ -│ │ └── uptime-kuma.yaml # Uptime Kuma deployment +│ │ └── peekaping.yaml # Peekaping deployment │ └── ansible.cfg # References WebKit roles ├── docker/ -│ └── uptime-kuma/ -│ ├── docker-compose.yml # Works for local + VM -│ ├── .env.example -│ └── README.md +│ └── peekaping/ +│ ├── docker-compose.yml +│ └── .env.example ``` ## Setup diff --git a/ansible/README.md b/ansible/README.md index 3b594e1..74c0aa7 100644 --- a/ansible/README.md +++ b/ansible/README.md @@ -21,11 +21,11 @@ The cloud-init script automatically clones the WebKit repository to `/opt/webkit ## Running Playbooks -### Uptime Kuma Deployment +### Peekaping Deployment ```bash -ansible-playbook -i inventory.ini playbooks/uptime-kuma.yaml \ - -e "domain=uptime.ainsley.dev" \ +ansible-playbook -i inventory.ini playbooks/peekaping.yaml \ + -e "domain=peekaping.ainsley.dev" \ -e "admin_email=hello@ainsley.dev" ``` @@ -33,10 +33,6 @@ ansible-playbook -i inventory.ini playbooks/uptime-kuma.yaml \ Create an `inventory.ini` file: ```ini -[uptime_kuma] -uptime.ainsley.dev ansible_host=YOUR_SERVER_IP ansible_user=root +[peekaping] +peekaping.ainsley.dev ansible_host=YOUR_SERVER_IP ansible_user=root ``` - -## Cloud-Init Integration - -The Uptime Kuma service uses `ansible-pull` in cloud-init to automatically provision the VM. See `terraform/services/uptime-kuma/cloud-init.yaml` for details. diff --git a/ansible/inventory-uptime-kuma.ini b/ansible/inventory-uptime-kuma.ini deleted file mode 100644 index 93b97d8..0000000 --- a/ansible/inventory-uptime-kuma.ini +++ /dev/null @@ -1,8 +0,0 @@ -# Auto-generated by Terraform - DO NOT EDIT MANUALLY - -[uptime_kuma] -uptime.ainsley.dev ansible_host=46.224.59.113 ansible_user=root - -[uptime_kuma:vars] -domain=uptime.ainsley.dev -admin_email=hello@ainsley.dev diff --git a/ansible/playbooks/uptime-kuma.yaml b/ansible/playbooks/uptime-kuma.yaml deleted file mode 100644 index 6112544..0000000 --- a/ansible/playbooks/uptime-kuma.yaml +++ /dev/null @@ -1,140 +0,0 @@ ---- -- name: Deploy Uptime Kuma with Docker and Nginx - hosts: all - become: true - vars: - # Variables to be passed via Terraform/cloud-init - # domain: uptime.ainsley.dev - # admin_email: hello@ainsley.dev - docker_port: 3001 - service_name: uptime-kuma - data_mount_point: /mnt/uptime-kuma - enable_https: true - - pre_tasks: - - name: Update apt package cache - apt: - update_cache: yes - cache_valid_time: 3600 - - - name: Upgrade all packages - apt: - upgrade: dist - register: upgrade_result - - - name: Ensure python3-pip is installed - apt: - name: python3-pip - state: present - - - name: Reboot if kernel updated - reboot: - msg: 'Reboot initiated by Ansible due to package upgrade' - reboot_timeout: 600 - when: - - upgrade_result.changed - - skip_reboot is not defined or not skip_reboot - - roles: - - fail2ban - - docker - - nginx - - ufw - - tasks: - - name: Check if Hetzner volume is attached - stat: - path: "{{ data_mount_point }}" - register: volume_mount - - - name: Create data mount point directory - file: - path: "{{ data_mount_point }}" - state: directory - mode: '0755' - when: not volume_mount.stat.exists - - - name: Find Hetzner volume device - shell: | - lsblk -o NAME,SERIAL,MOUNTPOINT | grep -E "HC_Volume" | head -1 | awk '{print "/dev/" $1}' - register: volume_device - changed_when: false - failed_when: false - - - name: Format Hetzner volume if not already formatted - filesystem: - fstype: ext4 - dev: "{{ volume_device.stdout }}" - when: - - volume_device.stdout != "" - - not volume_mount.stat.exists - ignore_errors: yes - - - name: Mount Hetzner volume - mount: - path: "{{ data_mount_point }}" - src: "{{ volume_device.stdout }}" - fstype: ext4 - state: mounted - opts: defaults,nofail - when: volume_device.stdout != "" - ignore_errors: yes - - - name: Ensure mount point has correct permissions - file: - path: "{{ data_mount_point }}" - state: directory - mode: '0755' - owner: root - group: root - - - name: Start Uptime Kuma container - community.docker.docker_container: - name: uptime-kuma - image: louislam/uptime-kuma:2 - state: started - restart_policy: unless-stopped - ports: - - "{{ docker_port }}:3001" - volumes: - - "{{ data_mount_point }}:/app/data" - env: - TZ: "Europe/London" - - - name: Wait for Uptime Kuma to start - uri: - url: "http://localhost:{{ docker_port }}" - method: GET - status_code: 200 - register: uptime_kuma_health - retries: 30 - delay: 5 - until: uptime_kuma_health.status == 200 - - - name: Run Certbot to get HTTPS certificate - include_role: - name: certbot - when: enable_https | default(true) | bool - - - name: Deploy SSL Nginx configuration after certificates are obtained - include_role: - name: nginx - vars: - skip_install: true - when: enable_https | default(true) | bool - - - name: Display success message - debug: - msg: | - Uptime Kuma has been successfully deployed! - - Service Details: - ---------------- - Domain: {{ domain }} - Internal Port: {{ docker_port }} - Data Location: {{ data_mount_point }} - - Access your Uptime Kuma instance at: - https://{{ domain }} - - Note: Ensure DNS A record for {{ domain }} points to this server's IP. diff --git a/docker/uptime-kuma/.env.example b/docker/uptime-kuma/.env.example deleted file mode 100644 index 1e3f5d3..0000000 --- a/docker/uptime-kuma/.env.example +++ /dev/null @@ -1,12 +0,0 @@ -# Uptime Kuma Environment Configuration -# Copy this file to .env and adjust values as needed - -# Data directory path -# Local development: Use relative path -DATA_PATH=./data - -# Production VM: Use mounted volume path -# DATA_PATH=/mnt/uptime-kuma - -# Timezone (optional) -TZ=Europe/London diff --git a/docker/uptime-kuma/.gitignore b/docker/uptime-kuma/.gitignore deleted file mode 100644 index 0edb66b..0000000 --- a/docker/uptime-kuma/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Environment file -.env - -# Local data directory -data/ - -# Docker volumes -volumes/ diff --git a/docker/uptime-kuma/README.md b/docker/uptime-kuma/README.md deleted file mode 100644 index 977f38d..0000000 --- a/docker/uptime-kuma/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Uptime Kuma Docker Compose - -This Docker Compose configuration works for both local development and production deployment. - -## Local Development - -1. Copy the example environment file: - ```bash - cp .env.example .env - ``` - -2. Start Uptime Kuma: - ```bash - docker-compose up -d - ``` - -3. Access Uptime Kuma at: http://localhost:3001 - -4. Stop Uptime Kuma: - ```bash - docker-compose down - ``` - -## Production Deployment - -On the production VM, the docker-compose.yml is deployed via Ansible with these settings: -- `DATA_PATH=/mnt/uptime-kuma` (Hetzner volume mount point) -- Nginx reverse proxy configured for HTTPS -- Let's Encrypt SSL certificate -- Accessible at: https://uptime.ainsley.dev - -## Data Persistence - -- **Local**: Data is stored in `./data` directory -- **Production**: Data is stored on a 10GB Hetzner volume mounted at `/mnt/uptime-kuma` - -## Updating Uptime Kuma - -```bash -docker-compose pull -docker-compose up -d -``` diff --git a/docker/uptime-kuma/docker-compose.yml b/docker/uptime-kuma/docker-compose.yml deleted file mode 100644 index ef84391..0000000 --- a/docker/uptime-kuma/docker-compose.yml +++ /dev/null @@ -1,23 +0,0 @@ -version: '3.8' - -services: - uptime-kuma: - image: louislam/uptime-kuma:1 - container_name: uptime-kuma - volumes: - # Use environment variable for data path - # Local dev: ./data (default) - # Production VM: /mnt/uptime-kuma (set via .env or cloud-init) - - ${DATA_PATH:-./data}:/app/data - ports: - - "3001:3001" - restart: unless-stopped - environment: - # Optional: Set timezone - - TZ=${TZ:-UTC} - networks: - - uptime-kuma - -networks: - uptime-kuma: - driver: bridge diff --git a/terraform.tfvars.example b/terraform.tfvars.example index 3474c87..3d68ff7 100644 --- a/terraform.tfvars.example +++ b/terraform.tfvars.example @@ -26,8 +26,5 @@ project_name = "ainsley-dev-platform" # Configure domains for each monitoring service # Make sure DNS A records point to the server IPs after deployment -# Uptime Kuma monitoring service -uptime_kuma_domain = "old.ainsley.dev" - # Peekaping monitoring service peekaping_domain = "uptime.ainsley.dev" diff --git a/terraform/base/main.tf b/terraform/base/main.tf index a962eca..49febbe 100644 --- a/terraform/base/main.tf +++ b/terraform/base/main.tf @@ -1,15 +1,6 @@ # Main Terraform configuration for ainsley.dev Platform # This file imports and configures service modules -module "uptime_kuma" { - source = "../services/uptime-kuma" - - hetzner_token = var.hetzner_token - domain = var.uptime_kuma_domain - admin_email = var.admin_email - environment = var.environment -} - module "peekaping" { source = "../services/peekaping" diff --git a/terraform/base/variables.tf b/terraform/base/variables.tf index 201749c..845ddae 100644 --- a/terraform/base/variables.tf +++ b/terraform/base/variables.tf @@ -28,12 +28,6 @@ variable "admin_email" { } # Service-specific domains -variable "uptime_kuma_domain" { - type = string - description = "Domain for Uptime Kuma monitoring service" - default = "uptime.ainsley.dev" -} - variable "peekaping_domain" { type = string description = "Domain for Peekaping monitoring service" diff --git a/terraform/services/uptime-kuma/main.tf b/terraform/services/uptime-kuma/main.tf deleted file mode 100644 index 8659f57..0000000 --- a/terraform/services/uptime-kuma/main.tf +++ /dev/null @@ -1,70 +0,0 @@ -# Uptime Kuma Service Module -# -# This module creates a Hetzner VM for Uptime Kuma monitoring -# service using WebKit's server/volume modules. - -terraform { - required_providers { - hcloud = { - source = "hetznercloud/hcloud" - version = "~> 1.0" - } - local = { - source = "hashicorp/local" - version = "~> 2.0" - } - } -} - -provider "hcloud" { - token = var.hetzner_token -} - -# Hetzner Server (WebKit) -# -# This creates the VM, SSH keys, firewall, and installs Ansible via cloud-init. -module "server" { - source = "github.com/ainsleydev/webkit//platform/terraform/providers/hetzner/server?ref=main" - - name = var.service_name - server_type = var.server_type - location = var.location - tags = var.tags - ssh_key_ids = ["hello@ainsley.dev", "ainsley.clark@GGYN90GJW7"] -} - -# Hetzner Volume (Webkit) -# -# Uses persistent data to save the Uptime Kuma Data. -# Note: lifecycle blocks cannot be used on modules, only resources. -# Data protection is provided by state backups and approval gates in CI/CD. -module "volume" { - source = "github.com/ainsleydev/webkit//platform/terraform/providers/hetzner/volume?ref=main" - - name = "${var.service_name}-data" - size = var.volume_size - location = var.location - server_id = module.server.id - format = "ext4" - automount = true - tags = concat(var.tags, [var.environment]) -} - -# Ansible Config -# -# Generate Ansible inventory file automatically -resource "local_file" "ansible_inventory" { - filename = "${path.root}/../../ansible/inventory-uptime-kuma.ini" - content = <<-EOT - # Auto-generated by Terraform - DO NOT EDIT MANUALLY - - [uptime_kuma] - ${var.domain} ansible_host=${module.server.ip_address} ansible_user=${module.server.server_user} - - [uptime_kuma:vars] - domain=${var.domain} - admin_email=${var.admin_email} - EOT - - file_permission = "0644" -} diff --git a/terraform/services/uptime-kuma/outputs.tf b/terraform/services/uptime-kuma/outputs.tf deleted file mode 100644 index e69de29..0000000 diff --git a/terraform/services/uptime-kuma/variables.tf b/terraform/services/uptime-kuma/variables.tf deleted file mode 100644 index 5c73c89..0000000 --- a/terraform/services/uptime-kuma/variables.tf +++ /dev/null @@ -1,53 +0,0 @@ -variable "hetzner_token" { - type = string - description = "Hetzner Cloud API token" - sensitive = true -} - -variable "service_name" { - type = string - description = "Name of the service" - default = "uptime-kuma" -} - -variable "server_type" { - type = string - description = "Hetzner server type (CX23 = 2 vCPU, 4GB RAM, ~€5.83/month)" - default = "cx23" -} - -variable "location" { - type = string - description = "Hetzner datacenter location" - default = "nbg1" # Nuremberg, Germany -} - -variable "volume_size" { - type = number - description = "Size of the data volume in GB" - default = 10 -} - -variable "domain" { - type = string - description = "Domain for the Uptime Kuma instance" - default = "uptime.ainsley.dev" -} - -variable "admin_email" { - type = string - description = "Admin email for Let's Encrypt certificates" - default = "hello@ainsley.dev" -} - -variable "environment" { - type = string - description = "Environment name" - default = "production" -} - -variable "tags" { - type = list(string) - description = "Tags to apply to resources" - default = ["uptime-kuma", "monitoring"] -}