Skip to content

Add Terraform for Hetzner Cloud CX53 migration#1

Merged
cmyui merged 2 commits intomainfrom
terraform-cx53-migration
Mar 8, 2026
Merged

Add Terraform for Hetzner Cloud CX53 migration#1
cmyui merged 2 commits intomainfrom
terraform-cx53-migration

Conversation

@cmyui
Copy link
Copy Markdown
Member

@cmyui cmyui commented Mar 8, 2026

Summary

  • Add Terraform config to provision a Hetzner Cloud CX53 VPS (16 vCPU, 32GB RAM, 320GB NVMe) in Falkenstein
  • Add CI workflow: terraform plan on PR, terraform apply on merge to main
  • Tune MySQL config for 32GB RAM system (20GB buffer pool, reduced I/O threads)
  • Add swap file creation to setup script

Replaces the current AX42-U dedicated server (~€68/mo post-April) with a CX53 VPS (~€23/mo), saving ~€540/year. CPU is massively underutilized (<2%) so shared vCPU is fine.

Migration plan

  1. Merge this PR → provisions CX53 + updates DNS
  2. SSH in, run setup.sh to bootstrap
  3. Migrate MySQL (mysqldump from old server, internal Hetzner network)
  4. Migrate PostgreSQL (pg_dumpall, 419MB)
  5. docker compose pull && docker compose up -d
  6. Smoke test, monitor

Note: Cloudflare DNS records are included — merging will cut over DNS immediately. Consider commenting out cloudflare.tf resources for initial apply if you want to migrate data first.

Test plan

  • Verify terraform plan output in CI comment below
  • Review firewall rules (Cloudflare-only HTTP/S, Tailscale SSH)
  • Review MySQL tuning for 32GB RAM
  • Confirm Wasabi S3 state backend works

🤖 Generated with Claude Code

Provision a CX53 VPS (16 vCPU, 32GB RAM, 320GB NVMe) to replace the
current AX42-U dedicated server, reducing monthly cost from ~€68 to ~€23.

- Terraform: hcloud server + firewall + Cloudflare DNS records
- CI: plan on PR, apply on merge (S3/Wasabi state backend)
- MySQL config tuned for 32GB RAM (20GB buffer pool, lower I/O threads)
- Setup script adds 4GB swap file for VPS

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Mar 8, 2026

Terraform Plan Output

Click to expand
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # cloudflare_record.apex will be created
  + resource "cloudflare_record" "apex" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "akatsuki.gg"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "A"
      + value           = (known after apply)
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["a"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "a"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["air_conditioning"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "air_conditioning"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["assets"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "assets"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["b"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "b"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["beatmaps"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "beatmaps"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["c"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "c"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["difficulty"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "difficulty"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["old"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "old"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["osu"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "osu"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["payments"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "payments"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["performance"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "performance"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["relax"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "relax"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["rework"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "rework"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["reworks"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "reworks"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["s"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "s"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["vault"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "vault"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.cname["www"] will be created
  + resource "cloudflare_record" "cname" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "www"
      + proxiable       = (known after apply)
      + proxied         = true
      + ttl             = 1
      + type            = "CNAME"
      + value           = "akatsuki.gg"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.mx_alt1 will be created
  + resource "cloudflare_record" "mx_alt1" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "akatsuki.gg"
      + priority        = 5
      + proxiable       = (known after apply)
      + proxied         = false
      + ttl             = 1
      + type            = "MX"
      + value           = "alt1.aspmx.l.google.com"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.mx_alt2 will be created
  + resource "cloudflare_record" "mx_alt2" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "akatsuki.gg"
      + priority        = 5
      + proxiable       = (known after apply)
      + proxied         = false
      + ttl             = 1
      + type            = "MX"
      + value           = "alt2.aspmx.l.google.com"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.mx_alt3 will be created
  + resource "cloudflare_record" "mx_alt3" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "akatsuki.gg"
      + priority        = 10
      + proxiable       = (known after apply)
      + proxied         = false
      + ttl             = 1
      + type            = "MX"
      + value           = "alt3.aspmx.l.google.com"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.mx_alt4 will be created
  + resource "cloudflare_record" "mx_alt4" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "akatsuki.gg"
      + priority        = 10
      + proxiable       = (known after apply)
      + proxied         = false
      + ttl             = 1
      + type            = "MX"
      + value           = "alt4.aspmx.l.google.com"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.mx_primary will be created
  + resource "cloudflare_record" "mx_primary" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "akatsuki.gg"
      + priority        = 1
      + proxiable       = (known after apply)
      + proxied         = false
      + ttl             = 1
      + type            = "MX"
      + value           = "aspmx.l.google.com"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # cloudflare_record.mx_verification will be created
  + resource "cloudflare_record" "mx_verification" {
      + allow_overwrite = false
      + content         = (known after apply)
      + created_on      = (known after apply)
      + hostname        = (known after apply)
      + id              = (known after apply)
      + metadata        = (known after apply)
      + modified_on     = (known after apply)
      + name            = "akatsuki.gg"
      + priority        = 15
      + proxiable       = (known after apply)
      + proxied         = false
      + ttl             = 1
      + type            = "MX"
      + value           = "3h5azgn53tixa3a2yxyqkgyethll22hdjl7jj5jshsfw2wpalkhq.mx-verification.google.com"
      + zone_id         = "18875b98b47e13a11f76f5795912453f"
    }

  # hcloud_firewall.production will be created
  + resource "hcloud_firewall" "production" {
      + id     = (known after apply)
      + labels = (known after apply)
      + name   = "akatsuki-production"

      + rule {
          + description     = "Grafana via Tailscale"
          + destination_ips = []
          + direction       = "in"
          + port            = "3001"
          + protocol        = "tcp"
          + source_ips      = [
              + "100.64.0.0/10",
            ]
        }
      + rule {
          + description     = "HTTP from Cloudflare"
          + destination_ips = []
          + direction       = "in"
          + port            = "80"
          + protocol        = "tcp"
          + source_ips      = [
              + "103.21.244.0/22",
              + "103.22.200.0/22",
              + "103.31.4.0/22",
              + "104.16.0.0/13",
              + "104.24.0.0/14",
              + "108.162.192.0/18",
              + "131.0.72.0/22",
              + "141.101.64.0/18",
              + "162.158.0.0/15",
              + "172.64.0.0/13",
              + "173.245.48.0/20",
              + "188.114.96.0/20",
              + "190.93.240.0/20",
              + "197.234.240.0/22",
              + "198.41.128.0/17",
            ]
        }
      + rule {
          + description     = "HTTPS from Cloudflare"
          + destination_ips = []
          + direction       = "in"
          + port            = "443"
          + protocol        = "tcp"
          + source_ips      = [
              + "103.21.244.0/22",
              + "103.22.200.0/22",
              + "103.31.4.0/22",
              + "104.16.0.0/13",
              + "104.24.0.0/14",
              + "108.162.192.0/18",
              + "131.0.72.0/22",
              + "141.101.64.0/18",
              + "162.158.0.0/15",
              + "172.64.0.0/13",
              + "173.245.48.0/20",
              + "188.114.96.0/20",
              + "190.93.240.0/20",
              + "197.234.240.0/22",
              + "198.41.128.0/17",
            ]
        }
      + rule {
          + description     = "SSH via Tailscale"
          + destination_ips = []
          + direction       = "in"
          + port            = "22"
          + protocol        = "tcp"
          + source_ips      = [
              + "100.64.0.0/10",
            ]
        }
      + rule {
          + description     = "Vault via Tailscale"
          + destination_ips = []
          + direction       = "in"
          + port            = "8200"
          + protocol        = "tcp"
          + source_ips      = [
              + "100.64.0.0/10",
            ]
        }
    }

  # hcloud_server.production will be created
  + resource "hcloud_server" "production" {
      + allow_deprecated_images    = false
      + backup_window              = (known after apply)
      + backups                    = false
      + datacenter                 = (known after apply)
      + delete_protection          = false
      + firewall_ids               = (known after apply)
      + id                         = (known after apply)
      + ignore_remote_firewall_ids = false
      + image                      = "ubuntu-24.04"
      + ipv4_address               = (known after apply)
      + ipv6_address               = (known after apply)
      + ipv6_network               = (known after apply)
      + keep_disk                  = false
      + labels                     = {
          + "environment" = "production"
          + "project"     = "akatsuki"
        }
      + location                   = "fsn1"
      + name                       = "akatsuki-production"
      + primary_disk_size          = (known after apply)
      + rebuild_protection         = false
      + server_type                = "cx53"
      + shutdown_before_deletion   = false
      + ssh_keys                   = (known after apply)
      + status                     = (known after apply)
    }

  # hcloud_ssh_key.deploy will be created
  + resource "hcloud_ssh_key" "deploy" {
      + fingerprint = (known after apply)
      + id          = (known after apply)
      + labels      = {}
      + name        = "akatsuki-deploy"
      + public_key  = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE7rhmtf85uc73M3S+HEEqbCLWJeMzRSfUgqzdcQC4yz cmyui@Joshs-MacBook-Pro.local"
    }

Plan: 27 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + server_ip     = (known after apply)
  + server_status = (known after apply)

Phase 1 only provisions the Hetzner server + firewall.
Cloudflare DNS will be imported and updated in phase 2
after data migration is complete.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Mar 8, 2026

Terraform Plan Output

Click to expand
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # hcloud_firewall.production will be created
  + resource "hcloud_firewall" "production" {
      + id     = (known after apply)
      + labels = (known after apply)
      + name   = "akatsuki-production"

      + rule {
          + description     = "Grafana via Tailscale"
          + destination_ips = []
          + direction       = "in"
          + port            = "3001"
          + protocol        = "tcp"
          + source_ips      = [
              + "100.64.0.0/10",
            ]
        }
      + rule {
          + description     = "HTTP from Cloudflare"
          + destination_ips = []
          + direction       = "in"
          + port            = "80"
          + protocol        = "tcp"
          + source_ips      = [
              + "103.21.244.0/22",
              + "103.22.200.0/22",
              + "103.31.4.0/22",
              + "104.16.0.0/13",
              + "104.24.0.0/14",
              + "108.162.192.0/18",
              + "131.0.72.0/22",
              + "141.101.64.0/18",
              + "162.158.0.0/15",
              + "172.64.0.0/13",
              + "173.245.48.0/20",
              + "188.114.96.0/20",
              + "190.93.240.0/20",
              + "197.234.240.0/22",
              + "198.41.128.0/17",
            ]
        }
      + rule {
          + description     = "HTTPS from Cloudflare"
          + destination_ips = []
          + direction       = "in"
          + port            = "443"
          + protocol        = "tcp"
          + source_ips      = [
              + "103.21.244.0/22",
              + "103.22.200.0/22",
              + "103.31.4.0/22",
              + "104.16.0.0/13",
              + "104.24.0.0/14",
              + "108.162.192.0/18",
              + "131.0.72.0/22",
              + "141.101.64.0/18",
              + "162.158.0.0/15",
              + "172.64.0.0/13",
              + "173.245.48.0/20",
              + "188.114.96.0/20",
              + "190.93.240.0/20",
              + "197.234.240.0/22",
              + "198.41.128.0/17",
            ]
        }
      + rule {
          + description     = "SSH via Tailscale"
          + destination_ips = []
          + direction       = "in"
          + port            = "22"
          + protocol        = "tcp"
          + source_ips      = [
              + "100.64.0.0/10",
            ]
        }
      + rule {
          + description     = "Vault via Tailscale"
          + destination_ips = []
          + direction       = "in"
          + port            = "8200"
          + protocol        = "tcp"
          + source_ips      = [
              + "100.64.0.0/10",
            ]
        }
    }

  # hcloud_server.production will be created
  + resource "hcloud_server" "production" {
      + allow_deprecated_images    = false
      + backup_window              = (known after apply)
      + backups                    = false
      + datacenter                 = (known after apply)
      + delete_protection          = false
      + firewall_ids               = (known after apply)
      + id                         = (known after apply)
      + ignore_remote_firewall_ids = false
      + image                      = "ubuntu-24.04"
      + ipv4_address               = (known after apply)
      + ipv6_address               = (known after apply)
      + ipv6_network               = (known after apply)
      + keep_disk                  = false
      + labels                     = {
          + "environment" = "production"
          + "project"     = "akatsuki"
        }
      + location                   = "fsn1"
      + name                       = "akatsuki-production"
      + primary_disk_size          = (known after apply)
      + rebuild_protection         = false
      + server_type                = "cx53"
      + shutdown_before_deletion   = false
      + ssh_keys                   = (known after apply)
      + status                     = (known after apply)
    }

  # hcloud_ssh_key.deploy will be created
  + resource "hcloud_ssh_key" "deploy" {
      + fingerprint = (known after apply)
      + id          = (known after apply)
      + labels      = {}
      + name        = "akatsuki-deploy"
      + public_key  = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE7rhmtf85uc73M3S+HEEqbCLWJeMzRSfUgqzdcQC4yz cmyui@Joshs-MacBook-Pro.local"
    }

Plan: 3 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + server_ip     = (known after apply)
  + server_status = (known after apply)

@cmyui cmyui merged commit ccb0b0a into main Mar 8, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant