From d9600e2734d8b8ae8c6b88e50cae67b373fc498f Mon Sep 17 00:00:00 2001 From: Alexandre Pires Date: Sat, 26 Oct 2024 21:41:10 +0200 Subject: [PATCH] Added Terraform/Ansible configuration to include RustDesk deployment --- .../ansible-weekly-reconciliation.yml | 1 + ansible/host_vars/prod-01.alexpires.me.yml | 4 + ansible/playbook_rustdesk.yml | 27 +++ inventory/hosts | 3 + repository.vault | 2 +- terraform/iac/alexpires.me.tf | 8 + terraform/k8sapps/config.tf | 3 + terraform/k8sapps/gitea.tf | 18 -- terraform/k8sapps/rustdesk.tf | 183 ++++++++++++++++++ terraform/k8sapps/sectool.env | 2 + terraform/k8sapps/variables.tf | 10 + 11 files changed, 242 insertions(+), 19 deletions(-) create mode 100644 ansible/playbook_rustdesk.yml create mode 100644 terraform/k8sapps/rustdesk.tf diff --git a/.github/workflows/ansible-weekly-reconciliation.yml b/.github/workflows/ansible-weekly-reconciliation.yml index 327b7a0..3697ea2 100644 --- a/.github/workflows/ansible-weekly-reconciliation.yml +++ b/.github/workflows/ansible-weekly-reconciliation.yml @@ -38,3 +38,4 @@ jobs: sectool exec ansible-playbook -u $ANSIBLE_USER playbook_wordpress.yml sectool exec ansible-playbook -u $ANSIBLE_USER playbook_m3uproxy.yml sectool exec ansible-playbook -u $ANSIBLE_USER playbook_monitoring.yml + sectool exec ansible-playbook -u $ANSIBLE_USER playbook_rustdesk.yml diff --git a/ansible/host_vars/prod-01.alexpires.me.yml b/ansible/host_vars/prod-01.alexpires.me.yml index caff65d..95b2a0e 100644 --- a/ansible/host_vars/prod-01.alexpires.me.yml +++ b/ansible/host_vars/prod-01.alexpires.me.yml @@ -39,6 +39,10 @@ fw_allowed_ports: - { rule: "allow", port: "80", proto: "tcp" } - { rule: "allow", port: "443", proto: "tcp" } - { rule: "allow", port: "22", proto: "tcp" } + - { rule: "allow", port: "21115", proto: "tcp" } + - { rule: "allow", port: "21116", proto: "tcp" } + - { rule: "allow", port: "21116", proto: "udp" } + - { rule: "allow", port: "21117", proto: "tcp" } - { rule: "allow", port: "16443", proto: "tcp", from: "10.1.0.0/16" } - { rule: "allow", port: "10254", proto: "tcp", from: "10.1.0.0/16" } - { rule: "allow", port: "10254", proto: "tcp", from: "147.78.131.194" } diff --git a/ansible/playbook_rustdesk.yml b/ansible/playbook_rustdesk.yml new file mode 100644 index 0000000..36cda55 --- /dev/null +++ b/ansible/playbook_rustdesk.yml @@ -0,0 +1,27 @@ +--- +- name: RustDesk Playbook (K8s) + hosts: rustdesk + gather_facts: true + +# Specific tasks for this playbook + tasks: + - name: Set required facts + ansible.builtin.set_fact: + rustdesk_home: "{{ persistent_data | default('/var/lib') }}/rustdesk" + rustdesk_user_id: 1000 + rustdesk_group_id: 1000 + tags: always + + - name: Create required rustdesk data folder + become: true + ansible.builtin.file: + state: directory + path: "{{ item }}" + mode: "0750" + owner: "{{ rustdesk_user_id }}" + group: "{{ rustdesk_group_id }}" + with_items: + - "{{ rustdesk_home }}" + tags: + - tasks + - tasks::folders diff --git a/inventory/hosts b/inventory/hosts index e4f2c20..95fc604 100644 --- a/inventory/hosts +++ b/inventory/hosts @@ -27,3 +27,6 @@ prod-01.alexpires.me [monitoring] prod-01.alexpires.me + +[rustdesk] +prod-01.alexpires.me diff --git a/repository.vault b/repository.vault index 5db741e..8e01473 100644 --- a/repository.vault +++ b/repository.vault @@ -1 +1 @@ -iOK7hvCAo83O/Yf1nSCHSzoweqVAvpv2pO8Azrk1iCb1afHMMItTj6Pi+xEHBgLYXDWvt8qxnqT+5mYmvFkmhpKHuwk4VjUQogO1YmIjy7c2W/hmboOOmmeMa8gjAaGuSRhwRFZq1Ug+lU/cc6YMzCYqvX8iULeZsYBQMj15NL8qYYWMcO/vWgytVxOtpKZi3tQ44qOOW5Uovay//fyudR5k3cge3V5rQplhfX4D9sLN70nRGIK74yh3LviMCaAI/V+5JmAiZZSnfuWIpOYVP61JiankMkz7NLjmrPXkBUTEd7Dm3vbX6eHTDsZxUMIGxH81vQxCeffvGA4eOOV/EEbQjz5D/DeRBZyvDO24YhG2Ougsl8NEcM+u94kIT9uss94OBBNcRUTmmgAmv7P20fkVvUJspZ7JbvjL4T2FyzalMP5REndqbxzLNEpjt8V0TE5IkPo7w3kpLy5qzQTCHPHYcSSMo2a9PfIsQjFthx4EyqALI/QVQCImzUruk/hkyttJrxzsh6AZ4V2U4DvWygjIAvATlAQkgMmlGhyLqSMrNKd206/gYMbhQfjZx/XxByX4evY6B70ypUTADxDKvtTRflMlss2ykC2ib/s6Gry55YWgZXb4xvpXaw125R2UFhbmM5u0V96rAqZgqpX1JiNbpfPCwfDfcvXhWT2j2+TZZ6JToUQq0UNNGh8FPKIcfFCaSAfszP5zHqb7obs74p4erlNj98A/bhIsePa+OH6HkArEAIlZuEAjJBTWSW2E0KVWLe0Iy9tfhQKVAaavW6Pos9jjyJ0G+yyjB8hqPkvBMClqyJCX6HMndZ+MxSasqpPrCZqK8IBUd1Rd/3qeAs7fxDl7GHRDX9CfbYY7+yf40mbS2mgRUtP0/dkOKVoQpEArZPvfBPRW865lDV00HG+I1cGhT6kTRQcTIVzrQG43IoB9qQ6rGgDdg5gxMVymZX6e3cD8FOs6p2p3mVpuDvtCJ6FLqamtEYYH9Ev/XCjOHAji+yVL296ikpaU3ecfRIoQkpoHZWMJ5kxIk2l5P/n0Wf6+J9Wffo7Te0+VW33sTJzCKdUCKis/50QLLMIfCbOI+HqQeQGtKqekamhibjSAWioCiY797WX7amHcmd3HdHpWuprgkkP7l6QFaU7m5uJFVCRG8XNiHMv9NyoyetJwukjZZkrZpoZzJNU3Z7uxSKzbFEhkzbVgPRTzIB2mlr4kTOePsgff6lVrCOwxXDtW/+6mtxDhsJQFiDgWsfe8GtUV2LmXqD0RrYJ3NsZV8ofinio8UQppjUQMRXE3zGP+PgcErlCQA9T0jWb3ZdYuXnT5uCD/OQpb5zAFCEks3RwRIgQhgdva1iZ6l47YbZm22BEsmdmEneQ3uh5N8FRHfq2E/0ZQWQ/RxhlXIzLqOKKwLOUHZhqTzAZZRxnbwiz9yIng1Nk/OFfYzGVePnhMrnJqqRjknA8uhKWmf8MNOM0DsEF7Fb96q48UaGGv607jqJeE++59sC21BXkbewp+VNgyFW9PooMwxd0yCfTw+pLsDGTuM1uSXJ98OiqWgYqbZEbuE8xn2m8pcDMooHNM+OX822moh0TTKFufQehWRnLmdjeSaHtnvVqT42hKQ3SKeFmnnDRCsl55uwAnFBCz/QGhqEj6pJ+b0q02VWFhM5C/vA28AuSHZmnmZpqDC/tjjoX8H/vFuNL2984aNZ2pWECiAAMbvaSVN//NB8pOrppKnlE64++HJ2F1GtAPTYB1cQ8UjOp1o42oQ9BbgtIrS5WkLIHNv5Vg68nzhmPqLSDr2siOSeTMqJkJoCBZcv3nO+1RXeUJPJkoVO34lpi38nF4J0cUvjROzSsQW5eq6taNmrkk8yvd5bGhf52ITavgPW5CvgxtmosotG2PJUaUpO22E9pXsENX/hJ8x/Igb+8nR7R0OZ0FHKURkCR256c3rNEG+rIdSzOzXj9hp7d/FO5ObiybC22olamjI6OnUOast8hxAxmqIz/A05IowgI2s1pyvEOylru+KievCQZ/0P8FG6avzsg7hus3yHGcYWVxhKXwymhFLzzkhVFKkM1SPumaMFWLtZltF+eWeD2uoectRL8XuvMpUFnqLXCE2skWUKNYYmRvPzHahZleyXTvqPFvSG6jSTQ6nRGAPAjH1PVGQ4Z3xttX3+UPvhGM7feuxx95ohkSraLU57l0DzWejyPFjjGJBeEPYP2kBCEi4TqIm43Yiwg4l2hCVqiPpwfpRkGO2wzIehjiqzQNPUaeDcTOBxyKUzJdaFw/6aDvo4XjE0a1ndKi4pBFB7RrWA2P15/uuHifz9f6Hoo/AleqgEzS7cFzgnCtr+hhaYYASSOXEHm6y4O763vUOgHFvYZevalFBynzLGWNG97+c9xIm343hRq0LJG5K10UphJwbPIqd0ml3tGjQXU7vkRKxTNVLqUDSHD1IxLrNGdbcoFR02ryudNdzy+VwlkukqUR1pSkibVby2Ag4Y9vyIztL/NM7XLNDqgr4ODJXHaiAEwZQsTJpIELDQabha3VyO6NnwrkTlZw7+kz57pExr0xbpGs0pbIiVHIj2zW9jEY98LihLvHzJjbshygEYzJwUVsUutZkTZPz3QaN9ZjdvbKMMTvaErzlt1TXryXF6y0+lgJTo/YoribY4khLRvn3/FZ3MfBJRhGRs33Nnw4rkIrj67SVue016XMUkdkI2a6jLWWQIeV1fNGoWRUYwukzyOB18HP5aW+6k0oUntXrQ1X6PKXAdXhGWAFPqzHVxdRtFEs67QCWenHphdraTrAcKvB0XzX34/eGpefTa8tD8ttrCLgZswICkqYjC/EF9VHzF9k1kVpsG6oDPO5YLN/q50xUmBrC+bGBm69h4hgOe7zvO8SGJYvXXESpWnvr19XncKS1a76y6rr6z0IIquuHTiJ/AZsvTrNqh16gQ5mRMD86dPkwDuMqmvjzKBCF8o0OMgXcT8DxeSQ0VptxczvMTqnRQCe6bFe4xrmtXTre9Zyglb6rtNlacO/DQRexbm1Zp3rcin4s0zXPN7lhhgiFb8SfNOvo+G4uPGbVPskYEmXvvTVDq0Ks01E3Ke+kOew37g6CSkMJw1q4E5DfX87Z7VbuIJOHMKZYofRGYKLedCChaG9fqnvqHXdsgD1Hzt3BpUve0RQr0e2DE7HbeCXb0HaZwZOa90ifpdUqT8wMeOXmuzqvnm7PB+mQHWD0b33O7ZRBpUP3ovtPzZXB2k9ejZgelji8QEwkV3nsadVaR0B4HmCLncsO5MUu/kSZVsTdZSY5WWk+dhWogeixc2hBbK1xVGHX7hNaxqfy8rU+WKRGpn/1Y98DUGLc06Q5OS12O93N0G7beT1dGgzHgJd6Lu+XLU3x5LZCKjBuGguqS7r7ihfPx1nMhO8+QAp0JPgDQlGQnGT0fo4nGfVvMcxiFUS1yNhEYx+2snfNEOINFFeIKvEyspCEWeG3odVU1Sy96o9AfLZkzTg9qI9WjswUWQE2QM0Wz2i8HguHXid0fWrdyhDyc6ikxbHxDweT9M0SkXKG1S6xgeSReML0bMvwstKhNNXMY6GP3nePtzWZmSTTQcWc1qZl7qEY4Xexrftf0BMhdeWtODkb/NwzjuKVGW7A+xahsmvcOEQ1yURH28TP5o= \ No newline at end of file +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 \ No newline at end of file diff --git a/terraform/iac/alexpires.me.tf b/terraform/iac/alexpires.me.tf index f2c6c3a..5b67ed2 100644 --- a/terraform/iac/alexpires.me.tf +++ b/terraform/iac/alexpires.me.tf @@ -46,6 +46,14 @@ resource "cloudns_dns_record" "alexpires_me_www" { ttl = "3600" } +resource "cloudns_dns_record" "alexpires_me_rustdesk" { + name = "rustdesk" + zone = local.alexpires_me_zone + type = "CNAME" + value = "${cloudns_dns_record.alexpires_me_microk8s.name}.${local.alexpires_me_zone}" + ttl = "3600" +} + resource "cloudns_dns_record" "alexpires_me_prod_01" { name = "prod-01" zone = local.alexpires_me_zone diff --git a/terraform/k8sapps/config.tf b/terraform/k8sapps/config.tf index 7d17642..c226192 100644 --- a/terraform/k8sapps/config.tf +++ b/terraform/k8sapps/config.tf @@ -37,6 +37,9 @@ locals { "GeoLite2-ASN" ] + # rustdesk + rustdesk_version = "latest" + # backup local_backup_retention_days = 2 cloud_backup_retention_days = 3 diff --git a/terraform/k8sapps/gitea.tf b/terraform/k8sapps/gitea.tf index 0e7fdd0..69c763d 100644 --- a/terraform/k8sapps/gitea.tf +++ b/terraform/k8sapps/gitea.tf @@ -143,24 +143,6 @@ resource "kubernetes_service" "gitea_http" { } } -resource "kubernetes_service" "gitea_ssh" { - metadata { - name = "ssh" - namespace = kubernetes_namespace.gitea.metadata[0].name - } - spec { - port { - port = 22 - target_port = "ssh" - node_port = 30036 - } - selector = { - app = "gitea" - } - type = "NodePort" - } -} - resource "kubernetes_ingress_v1" "gitea_ingress" { metadata { name = "gitea-ingress" diff --git a/terraform/k8sapps/rustdesk.tf b/terraform/k8sapps/rustdesk.tf new file mode 100644 index 0000000..5613b77 --- /dev/null +++ b/terraform/k8sapps/rustdesk.tf @@ -0,0 +1,183 @@ +locals { + rustdesk_path = "${local.persistent_folder}/rustdesk" +} + +resource "kubernetes_namespace" "rustdesk" { + metadata { + name = "rustdesk" + } +} + +resource "kubernetes_config_map" "rustdesk_config" { + metadata { + name = "rustdesk-config" + namespace = kubernetes_namespace.rustdesk.metadata[0].name + } + + data = { + RELAY = "rustdesk.alexpires.me" + ENCRYPTED_ONLY = "1" + } +} + +resource "kubernetes_secret" "rustdesk_keys" { + metadata { + name = "rustdesk-keys" + namespace = kubernetes_namespace.rustdesk.metadata[0].name + } + + data = { + KEY_PRIV = var.rustdesk_private_key + KEY_PUB = var.rustdesk_public_key + } +} + +resource "kubernetes_deployment" "rustdesk_deploy" { + metadata { + name = "rustdesk-deploy" + namespace = kubernetes_namespace.rustdesk.metadata[0].name + labels = { + app = "rustdesk-app" + } + } + + spec { + replicas = 1 + + selector { + match_labels = { + app = "rustdesk-app" + } + } + + template { + metadata { + labels = { + app = "rustdesk-app" + } + } + + spec { + container { + name = "rustdesk-container" + image = "rustdesk/rustdesk-server-s6:${local.rustdesk_version}" + + env_from { + config_map_ref { + name = kubernetes_config_map.rustdesk_config.metadata[0].name + } + } + + env { + name = "KEY_PRIV" + value = kubernetes_secret.rustdesk_keys.data["KEY_PRIV"] + } + + env { + name = "KEY_PUB" + value = kubernetes_secret.rustdesk_keys.data["KEY_PUB"] + } + + security_context { + allow_privilege_escalation = false + } + + port { + name = "tcp-port-1" + container_port = 21115 + host_port = 21115 + protocol = "TCP" + } + + port { + name = "tcp-port-2" + container_port = 21116 + host_port = 21116 + protocol = "TCP" + } + + port { + name = "udp-port-1" + container_port = 21116 + host_port = 21116 + protocol = "UDP" + } + + port { + name = "tcp-port-3" + container_port = 21117 + host_port = 21117 + protocol = "TCP" + } + + volume_mount { + name = "rustdesk-data" + mount_path = "/data" + } + } + + volume { + name = "rustdesk-data" + host_path { + path = local.rustdesk_path + } + } + } + } + } +} + +resource "kubernetes_service" "rustdesk_tcp_ports" { + metadata { + name = "rustdesk-tcp-ports" + namespace = kubernetes_namespace.rustdesk.metadata[0].name + } + + spec { + selector = { + app = "rustdesk-app" + } + + port { + name = "tcp-port-1" + port = 21115 + target_port = 21115 + } + + port { + name = "tcp-port-2" + port = 21116 + target_port = 21116 + } + + port { + name = "tcp-port-3" + port = 21117 + target_port = 21117 + } + + type = "LoadBalancer" + } +} + +resource "kubernetes_service" "rustdesk_udp_ports" { + metadata { + name = "rustdesk-udp-ports" + namespace = kubernetes_namespace.rustdesk.metadata[0].name + } + + spec { + selector = { + app = "rustdesk-app" + } + + port { + name = "udp-port-1" + port = 21116 + target_port = 21116 + protocol = "UDP" + } + + type = "LoadBalancer" + } +} diff --git a/terraform/k8sapps/sectool.env b/terraform/k8sapps/sectool.env index f60a11c..0687b9f 100644 --- a/terraform/k8sapps/sectool.env +++ b/terraform/k8sapps/sectool.env @@ -17,3 +17,5 @@ TF_VAR_m3uproxy_admin_password=$M3UPROXY_ADMIN_PASSWORD TF_VAR_m3uproxy_secret=$M3UPROXY_SECRET TF_VAR_maxmind_account_id=$MAXMIND_ACCOUNT_ID TF_VAR_maxmind_license_key=$MAXMIND_LICENSE_KEY +TF_VAR_rustdesk_private_key=$RUSTDESK_PRIVATE_KEY +TF_VAR_rustdesk_public_key=$RUSTDESK_PUBLIC_KEY diff --git a/terraform/k8sapps/variables.tf b/terraform/k8sapps/variables.tf index 553caf0..85190d8 100644 --- a/terraform/k8sapps/variables.tf +++ b/terraform/k8sapps/variables.tf @@ -79,3 +79,13 @@ variable "maxmind_license_key" { description = "Maxmind license key" type = string } + +variable "rustdesk_private_key" { + description = "Rustdesk private key" + type = string +} + +variable "rustdesk_public_key" { + description = "Rustdesk public key" + type = string +}