re-implement previous functionalities with cloud deployment and usb drive creation

This commit is contained in:
2025-08-12 23:55:46 +02:00
parent c3bd77ce7c
commit 09757eb061
11 changed files with 497 additions and 709 deletions

88
terraform/cloud-init.yml Normal file
View File

@@ -0,0 +1,88 @@
#cloud-config
users:
- name: workshop
groups: [adm, docker]
sudo: ['ALL=(ALL) NOPASSWD:ALL']
shell: /bin/bash
ssh_authorized_keys:
- ${ssh_public_key}
packages:
- docker.io
- curl
- git
- jq
runcmd:
- systemctl enable docker
- systemctl start docker
- usermod -aG docker workshop
- docker swarm init
- docker network create -d overlay proxy
- curl -fsSL https://install.abra.coopcloud.tech | sudo -u workshop bash
- ln -sf /home/workshop/.local/bin/abra /usr/local/bin/abra
- sudo -u workshop mkdir -p /home/workshop/.abra/servers
- sudo -u workshop abra server add ${participant_name}.${domain}
- sudo -u workshop abra app new traefik --domain=traefik.${participant_name}.${domain} --server=${participant_name}.${domain}
- sudo -u workshop abra app deploy traefik.${participant_name}.${domain}
- |
cat > /home/workshop/.bashrc << 'EOF'
export PATH="$HOME/.local/bin:$PATH"
recipes() {
echo "Available Co-op Cloud Recipes:"
echo ""
echo "Content Management:"
echo " wordpress ghost hedgedoc dokuwiki mediawiki"
echo ""
echo "File & Collaboration:"
echo " nextcloud seafile collabora onlyoffice"
echo ""
echo "Communication:"
echo " jitsi-meet matrix-synapse rocketchat mattermost"
echo ""
echo "E-commerce & Business:"
echo " prestashop invoiceninja kimai pretix"
echo ""
echo "Development & Tools:"
echo " gitea n8n jupyter-lab"
echo ""
echo "Analytics & Monitoring:"
echo " plausible uptime-kuma grafana"
echo ""
echo "Media & Social:"
echo " peertube mastodon jellyfin"
echo ""
echo "Deploy: abra app new <recipe> -S --domain=myapp.${participant_name}.${domain}"
echo "Browse all: https://recipes.coopcloud.tech"
}
help() {
echo "CODE CRISPIES Workshop Commands:"
echo ""
echo "recipes - Show available app recipes"
echo "abra app new <recipe> -S --domain=<name>.${participant_name}.${domain}"
echo "abra app deploy <domain>"
echo "abra app ls - List your apps"
echo ""
echo "Examples:"
echo " abra app new wordpress -S --domain=blog.${participant_name}.${domain}"
echo " abra app deploy blog.${participant_name}.${domain}"
echo ""
echo "Server: ${participant_name}.${domain}"
echo "Traefik: https://traefik.${participant_name}.${domain}"
}
export -f recipes help
echo "CODE CRISPIES Workshop!"
echo "Server: ${participant_name}.${domain}"
echo "Type 'help' for commands or 'recipes' for available apps"
EOF
final_message:
- echo "Workshop server ready! Traefik available at https://traefik.${participant_name}.${domain}"

90
terraform/main.tf Normal file
View File

@@ -0,0 +1,90 @@
terraform {
required_providers {
hcloud = {
source = "hetznercloud/hcloud"
version = "~> 1.48"
}
hetznerdns = {
source = "timohirt/hetznerdns"
version = "~> 2.2"
}
}
}
locals {
domain = var.domain
participants = [
"hopper", "curie", "lovelace", "noether", "hamilton",
"franklin", "johnson", "clarke", "goldberg", "liskov",
"wing", "rosen", "shaw", "karp", "rich"
]
}
provider "hcloud" {
token = var.hcloud_token
}
provider "hetznerdns" {
apitoken = var.hetzner_dns_token
}
resource "hcloud_ssh_key" "workshop" {
name = "code-crispies-workshop"
public_key = var.ssh_public_key
}
resource "hcloud_server" "participant" {
for_each = toset(local.participants)
name = each.key
image = "ubuntu-22.04"
server_type = "cx21"
location = "nbg1"
ssh_keys = [hcloud_ssh_key.workshop.id]
user_data = templatefile("${path.module}/cloud-init.yml", {
participant_name = each.key
domain = local.domain
ssh_public_key = var.ssh_public_key
})
labels = {
project = "code-crispies-workshop"
participant = each.key
}
}
resource "hetznerdns_record" "participant_main" {
for_each = toset(local.participants)
zone_id = var.dns_zone_id
name = each.key
type = "A"
value = hcloud_server.participant[each.key].ipv4_address
ttl = 60
}
resource "hetznerdns_record" "participant_wildcard" {
for_each = toset(local.participants)
zone_id = var.dns_zone_id
name = "*.${each.key}"
type = "A"
value = hcloud_server.participant[each.key].ipv4_address
ttl = 60
}
output "participant_ips" {
value = {
for name, server in hcloud_server.participant : name => server.ipv4_address
}
description = "IP addresses of participant servers"
}
output "participant_urls" {
value = {
for name, server in hcloud_server.participant : name => "https://traefik.${name}.${local.domain}"
}
description = "Traefik URLs for each participant"
}

29
terraform/variables.tf Normal file
View File

@@ -0,0 +1,29 @@
variable "hcloud_token" {
description = "Hetzner Cloud API token"
type = string
sensitive = true
}
variable "hetzner_dns_token" {
description = "Hetzner DNS API token"
type = string
sensitive = true
default = ""
}
variable "dns_zone_id" {
description = "Hetzner DNS Zone ID"
type = string
default = ""
}
variable "domain" {
description = "Workshop domain"
type = string
default = "codecrispi.es"
}
variable "ssh_public_key" {
description = "SSH public key for server access"
type = string
}