diff --git a/ansible/playbook_game_station.yml b/ansible/playbook_game_station.yml index 0ba6a1e..39a53b8 100644 --- a/ansible/playbook_game_station.yml +++ b/ansible/playbook_game_station.yml @@ -50,6 +50,7 @@ url: "https://github.com/eden-emulator/Releases/releases/download/v0.0.4-rc1/Eden-Linux-v0.0.4-rc1-amd64-clang-standard.AppImage" executable: "Eden.AppImage" link: "eden" + alvr_version: "20.14.1" tasks: # --- Base dependencies --- @@ -481,6 +482,7 @@ - "/home/{{ user_name }}/RetroArch/shaders" - "/home/{{ user_name }}/RetroArch/config" - "/opt/steamcmd" + - "/opt/alvr" - name: Install Systemd user files become: true @@ -503,7 +505,7 @@ become: true ansible.builtin.get_url: url: "{{ item.url }}" - dest: "/home/{{ user_name }}/.local/bin/{{ item.executable }}" + dest: "{{ user_bin_dir }}/{{ item.executable }}" mode: "0755" owner: "{{ user_name }}" group: "{{ user_name }}" @@ -512,8 +514,8 @@ - name: Create symlink for AppImages become: true ansible.builtin.file: - src: "/home/{{ user_name }}/.local/bin/{{ item.executable }}" - dest: "/home/{{ user_name }}/.local/bin/{{ item.link }}" + src: "{{ user_bin_dir }}/{{ item.executable }}" + dest: "{{ user_bin_dir }}/{{ item.link }}" state: link owner: "{{ user_name }}" group: "{{ user_name }}" @@ -587,6 +589,35 @@ mode: "0644" loop: "{{ query('fileglob', 'game_station/sunshine/*') }}" + # ALVR installation + + - name: Install ALVR + ansible.builtin.get_url: + url: "https://github.com/alvr-org/ALVR/releases/download/v{{ alvr_version }}/alvr_streamer_linux.tar.gz" + dest: "/tmp/alvr_streamer_linux.tar.gz" + mode: "0644" + + - name: Extract ALVR + become: true + ansible.builtin.unarchive: + src: "/tmp/alvr_streamer_linux.tar.gz" + dest: "/opt/alvr" + remote_src: true + owner: "{{ user_name }}" + group: "{{ user_name }}" + mode: "0755" + extra_opts: + - --strip-components=1 + + - name: Create symlink for ALVR + become: true + ansible.builtin.file: + src: "/opt/alvr/bin/alvr_dashboard" + dest: "{{ user_bin_dir }}/alvr_dashboard" + state: link + owner: "{{ user_name }}" + group: "{{ user_name }}" + - name: Enable User session service login become: true become_user: "{{ user_name }}" diff --git a/terraform/apps/dev-01/apps.tf b/terraform/apps/dev-01/apps.tf index 455fe9a..d77d90f 100644 --- a/terraform/apps/dev-01/apps.tf +++ b/terraform/apps/dev-01/apps.tf @@ -73,3 +73,10 @@ module "grafana" { fqdn = local.grafana_fqdn } +module "mstream" { + source = "../../modules/apps/mstream" + + persistent_folder = local.persistent_folder + music_folder = local.mstream_music_folder + fqdn = local.mstream_fqdn +} diff --git a/terraform/apps/dev-01/config.tf b/terraform/apps/dev-01/config.tf index 3cb98c8..701041f 100644 --- a/terraform/apps/dev-01/config.tf +++ b/terraform/apps/dev-01/config.tf @@ -9,11 +9,6 @@ locals { # samba samba_shares = [ - { - name = "USB" - path = "/mnt/usb" - comment = "USB Drive" - }, { name = "Storage" path = "/srv/storage" @@ -108,6 +103,11 @@ locals { type = "A" content = "10.19.4.121" }, + { + name = "music" + type = "CNAME" + content = "dev-01.${local.lab_domain}." + } ] } ] @@ -225,6 +225,10 @@ locals { # model = "326" # } } + + # mstream + mstream_music_folder = "/srv/storage/Music" + mstream_fqdn = "music.${local.lab_domain}" } data "terraform_remote_state" "scaleway" { diff --git a/terraform/modules/apps/mstream/config.tf b/terraform/modules/apps/mstream/config.tf new file mode 100644 index 0000000..ae970ef --- /dev/null +++ b/terraform/modules/apps/mstream/config.tf @@ -0,0 +1,7 @@ +locals { + app_folder = "${var.persistent_folder}/mstream" + music_folder = var.music_folder + + app_version = var.tag +} + diff --git a/terraform/modules/apps/mstream/ingress.tf b/terraform/modules/apps/mstream/ingress.tf new file mode 100644 index 0000000..36f8fb5 --- /dev/null +++ b/terraform/modules/apps/mstream/ingress.tf @@ -0,0 +1,34 @@ +resource "kubernetes_ingress_v1" "mstream" { + metadata { + name = "ingress" + namespace = kubernetes_namespace.mstream.metadata[0].name + + annotations = { + "kubernetes.io/ingress.class" = "public" + "cert-manager.io/cluster-issuer" = "letsencrypt-prod" + "kubernetes.io/tls-acme" = "true" + "nginx.ingress.kubernetes.io/ssl-redirect" = "true" + } + } + spec { + tls { + hosts = [var.fqdn] + secret_name = "mstream-tls" + } + rule { + host = var.fqdn + http { + path { + backend { + service { + name = "mstream-service" + port { + number = 3000 + } + } + } + } + } + } + } +} diff --git a/terraform/modules/apps/mstream/main.tf b/terraform/modules/apps/mstream/main.tf new file mode 100644 index 0000000..f1d1146 --- /dev/null +++ b/terraform/modules/apps/mstream/main.tf @@ -0,0 +1,147 @@ +resource "kubernetes_namespace" "mstream" { + metadata { + name = "mstream" + } +} + +resource "kubernetes_service_account" "mstream" { + + metadata { + name = "mstream-sa" + namespace = kubernetes_namespace.mstream.metadata[0].name + } + + automount_service_account_token = false +} + +resource "kubernetes_config_map" "app_config" { + metadata { + name = "mstream-config" + namespace = kubernetes_namespace.mstream.metadata[0].name + } + + data = {} +} + +resource "kubernetes_secret" "app_secrets" { + metadata { + name = "mstream-keys" + namespace = kubernetes_namespace.mstream.metadata[0].name + } + + data = {} +} + +resource "kubernetes_deployment" "mstream" { + metadata { + name = "mstream" + namespace = kubernetes_namespace.mstream.metadata[0].name + labels = { + app = "mstream" + } + } + + spec { + replicas = 1 + + selector { + match_labels = { + app = "mstream" + } + } + + strategy { + type = "Recreate" + } + + template { + metadata { + labels = { + app = "mstream" + } + } + + spec { + service_account_name = kubernetes_service_account.mstream.metadata[0].name + automount_service_account_token = false + + container { + name = "mstream" + image = "lscr.io/linuxserver/mstream:${local.app_version}" + + env_from { + config_map_ref { + name = kubernetes_config_map.app_config.metadata[0].name + } + } + + security_context { + allow_privilege_escalation = false + run_as_group = 0 + run_as_user = 0 + privileged = false + } + + port { + name = "http" + container_port = 3000 + protocol = "TCP" + } + + + volume_mount { + name = "mstream-data" + mount_path = "/config" + } + + volume_mount { + name = "mstream-music" + mount_path = "/music" + read_only = true + } + } + + volume { + name = "mstream-data" + host_path { + path = local.app_folder + } + } + + volume { + name = "mstream-music" + host_path { + path = local.music_folder + } + } + } + } + } +} + +resource "kubernetes_service" "mstream" { + metadata { + name = "mstream-service" + namespace = kubernetes_namespace.mstream.metadata[0].name + } + + spec { + selector = { + app = "mstream" + } + + port { + name = "http" + port = 3000 + target_port = 3000 + } + + type = "ClusterIP" + } + + lifecycle { + ignore_changes = [ + metadata[0].annotations + ] + } +} diff --git a/terraform/modules/apps/mstream/provider.tf b/terraform/modules/apps/mstream/provider.tf new file mode 100644 index 0000000..2eaa508 --- /dev/null +++ b/terraform/modules/apps/mstream/provider.tf @@ -0,0 +1,9 @@ +terraform { + required_version = "~>1.8" + required_providers { + kubernetes = { + source = "hashicorp/kubernetes" + version = "2.36.0" + } + } +} diff --git a/terraform/modules/apps/mstream/variables.tf b/terraform/modules/apps/mstream/variables.tf new file mode 100644 index 0000000..5092e01 --- /dev/null +++ b/terraform/modules/apps/mstream/variables.tf @@ -0,0 +1,19 @@ +variable "persistent_folder" { + description = "The path to the persistent folder" + type = string +} + +variable "music_folder" { + description = "The path to the persistent folder" + type = string +} + +variable "tag" { + description = "The version of app to install" + type = string + default = "latest" +} + +variable "fqdn" { + description = "FDQN name of the service" +} diff --git a/terraform/modules/apps/samba/main.tf b/terraform/modules/apps/samba/main.tf index f2a957d..564f39c 100644 --- a/terraform/modules/apps/samba/main.tf +++ b/terraform/modules/apps/samba/main.tf @@ -65,6 +65,9 @@ resource "kubernetes_deployment" "samba" { labels = { samba = "samba" } + annotations = { + "smb_conf_checksum" = local.samba_config_hash + } } spec {