re-implement previous functionalities with cloud deployment and usb drive creation
This commit is contained in:
88
terraform/cloud-init.yml
Normal file
88
terraform/cloud-init.yml
Normal 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
90
terraform/main.tf
Normal 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
29
terraform/variables.tf
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user