From 9e3cae9feb3898327c1581dc6bee210cc0340863 Mon Sep 17 00:00:00 2001 From: Kuba Date: Fri, 30 Dec 2022 16:57:31 +0100 Subject: [PATCH] Gitea in the cloud --- .gitignore | 1 + gitea/a.py | 192 ++++++++++++++++++++++++++++++++++++++++++++++++ gitea/b.py | 45 ++++++++++++ gitea/clean.sh | 3 + gitea/deploy.sh | 3 + 5 files changed, 244 insertions(+) create mode 100644 .gitignore create mode 100644 gitea/a.py create mode 100644 gitea/b.py create mode 100755 gitea/clean.sh create mode 100755 gitea/deploy.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a859d8d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +token* \ No newline at end of file diff --git a/gitea/a.py b/gitea/a.py new file mode 100644 index 0000000..6f02faf --- /dev/null +++ b/gitea/a.py @@ -0,0 +1,192 @@ +from hcloud import Client +from hcloud.locations.domain import Location +from hcloud.images.domain import Image +from hcloud.server_types.domain import ServerType + +import sys + +if(len(sys.argv) > 1): + hetz_token = sys.argv[1] +else: + print("Hetzner token missing!") + +if(len(sys.argv) > 2): + ssh_public_key = " ".join([str(e) for e in sys.argv[2:5]]) +else: + print("SSH public key missing!") + +if(len(sys.argv) > 5): + index = sys.argv[5] +else: + index = "478874" + +client = Client( + token=hetz_token +) + +ssh_key_name = index+"-ssh-key" +network_name = index+"-subnet" +volume_name = index+"-vol" +db_name = index+"-db" +server_name = index+"-server" + +try: + ssh_key = client.ssh_keys.create(name=ssh_key_name, public_key=ssh_public_key) +except: + ssh_key = client.ssh_keys.get_by_name(name=ssh_key_name) +print(f"SSH key {ssh_key.data_model.name} added: {ssh_key.data_model.public_key}") + + +from hcloud.networks.domain import NetworkSubnet + +try: + vnet = client.networks.create( + name=network_name, + ip_range="10.10.10.0/24", + subnets=[ + NetworkSubnet(ip_range="10.10.10.0/24", network_zone="eu-central", type="cloud") + ] + ) + print(f"Created network: {vnet.data_model.name} ({vnet.data_model.ip_range})") +except: + vnet = client.networks.get_by_name( + network_name, + ) + print(f"Network in use: {vnet.data_model.name} ({vnet.data_model.ip_range})") + + + + +cloud_init_postgres=r'''#cloud-config +packages: + - apt-transport-https + - ca-certificates + - curl + - gnupg-agent + - software-properties-common + +write_files: + - path: /root/docker-compose.yml + content: | + version: '3.9' + + services: + db: + image: postgres:14 + restart: always + environment: + POSTGRES_DATABASE: gitea + POSTGRES_USER: gitea + POSTGRES_PASSWORD: gitea + POSTGRES_ROOT_PASSWORD: gitea + ports: + - "10.10.10.2:5432:5432" + volumes: + - my-db:/var/lib/postgres + volumes: + my-db: {} + +runcmd: + - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - + - add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" + - apt-get update -y + - apt-get install -y docker-ce docker-ce-cli containerd.io + - curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + - chmod +x /usr/local/bin/docker-compose + - systemctl start docker + - systemctl enable docker + - cd /root/ && docker-compose up -d + ''' + +postgres_server = client.servers.create( + name=db_name, + server_type=ServerType("cx11"), + image=Image(name="ubuntu-20.04"), + ssh_keys=[ssh_key], + networks=[vnet], + location=Location("hel1"), + user_data=cloud_init_postgres +) + +postgres_server.action.wait_until_finished() +if(postgres_server.action.complete): + print(f"Created db server: {postgres_server.server.name}") + + + +cloud_init_gitea=r'''#cloud-config +packages: + - apt-transport-https + - ca-certificates + - curl + - gnupg-agent + - software-properties-common + +write_files: + - path: /root/docker-compose.yml + content: | + version: "3" + + networks: + gitea: + external: false + + services: + server: + image: gitea/gitea:1.17.4 + container_name: gitea + environment: + - USER_UID=1000 + - USER_GID=1000 + - GITEA__server__DOMAIN=${DOMAIN} + - GITEA__database__DB_TYPE=postgres + - GITEA__database__HOST=10.10.10.2:5432 + - GITEA__database__NAME=gitea + - GITEA__database__USER=gitea + - GITEA__database__PASSWD=gitea + restart: always + networks: + - gitea + volumes: + - ./data:/root/gitea + - ./config:/root/gitea/config + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + - /mnt/volume:/data + ports: + - "3000:3000" + - "222:22" +''' +runcmd = f''' +runcmd: + - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - + - add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" + - apt-get update -y + - apt-get install -y docker-ce docker-ce-cli containerd.io + - curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + - chmod +x /usr/local/bin/docker-compose + - systemctl start docker + - systemctl enable docker + - cd /root/ + - IP=$(hostname -I | cut -d ' ' -f 1) + - echo "DOMAIN=$IP" >> .env + - docker-compose up -d +''' + +cloud_init_gitea += runcmd + +gitea_server = client.servers.create( + name=server_name, + server_type=ServerType("cx11"), + image=Image(name="ubuntu-20.04"), + ssh_keys=[ssh_key], + networks=[vnet], + location=Location("hel1"), + user_data=cloud_init_gitea +) + +gitea_server.action.wait_until_finished() +if(gitea_server.action.complete): + print(f"Created gitea server: {gitea_server.server.name}") + +print(f"Gitea up -> http://{gitea_server.server.data_model.public_net.ipv4.ip}:3000") \ No newline at end of file diff --git a/gitea/b.py b/gitea/b.py new file mode 100644 index 0000000..f75eff0 --- /dev/null +++ b/gitea/b.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +from hcloud import Client +from hcloud.images.domain import Image +from hcloud.networks.domain import NetworkSubnet +from hcloud.locations.domain import Location +from hcloud.server_types.domain import ServerType +import sys + +if(len(sys.argv) > 1): + index = sys.argv[1] +else: + index = "478874" + +client = Client( + token="KccUEiddxtzGoLWSNC3V8tylq7MYHCjdnShtgasQ8jSbHqCjGoaa6Rq7yoz4uS23" +) + +servers = client.servers.get_all() +print(f"Deleting servers") +for s in servers: + if s.data_model.name.startswith(index): + action = client.servers.delete(s) + action.wait_until_finished() + print(f"\tDeleting servers {s.data_model.name} ({s.data_model.public_net.ipv4.ip}): {action.data_model.status}") + +ssh_keys = client.ssh_keys.get_all() +print(f"Deleting SSH keys") +for s in ssh_keys: + if s.data_model.name.startswith(index): + action = client.ssh_keys.delete(s) + print(f"\tDeleting keys {s.name}: {action}") + +vnets = client.networks.get_all() +print(f"Deleting sub-networks") +for s in vnets: + if s.data_model.name.startswith(index): + action = client.networks.delete(s) + print(f"\tDeleting networks {s.name}: {action}") + +volumes = client.volumes.get_all() +print(f"Deleting volumes") +for v in volumes: + if v.data_model.name.startswith(index): + action = client.volumes.delete(v) + print(f"\tDeleting volumes {v.name}: {action}") diff --git a/gitea/clean.sh b/gitea/clean.sh new file mode 100755 index 0000000..fc6d275 --- /dev/null +++ b/gitea/clean.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "Clearing leftovers..." +python3 b.py \ No newline at end of file diff --git a/gitea/deploy.sh b/gitea/deploy.sh new file mode 100755 index 0000000..f025778 --- /dev/null +++ b/gitea/deploy.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "Initiating gitea cloud deploy ..." +python3 a.py $(cat token_file.txt) $(find ~ -name *.pub | tail -n 1 | xargs cat) "478874" \ No newline at end of file