--- - name: Deploy Matrix + TURN + Traefik + NGINX + Teamspeak hosts: all become: true collections: - containers.podman vars_files: - ../vars/vars.yml # ← our variable file tasks: # ----------------------------------------------------------------- # Install podman, create network, create volumes … # ----------------------------------------------------------------- - name: Install podman package ansible.builtin.package: name: podman state: present - name: Create podman network "{{ podman_network }}" containers.podman.podman_network: name: "{{ podman_network }}" driver: bridge subnet: "10.88.0.0/16" state: present - name: Ensure required podman volumes exist containers.podman.podman_volume: name: "{{ item }}" driver: local state: present loop: - "{{ vol_traefik }}" - "{{ vol_synapse }}" - "{{ vol_media }}" - "{{ vol_turn }}" - "{{ vol_nginx }}" - "{{ vol_teamspeak }}" # ----------------------------------------------------------------- # Pull required images (including Teamspeak) # ----------------------------------------------------------------- - name: Pull Traefik image containers.podman.podman_image: name: "{{ traefik_image }}" state: present - name: Pull coturn image containers.podman.podman_image: name: "{{ turn_image }}" state: present - name: Pull Synapse image containers.podman.podman_image: name: "{{ synapse_image }}" state: present - name: Pull NGINX image containers.podman.podman_image: name: "{{ nginx_image }}" state: present - name: Pull Teamspeak image containers.podman.podman_image: name: "{{ teamspeak_image }}" state: present # ----------------------------------------------------------------- # Render all configuration files from the templates # ----------------------------------------------------------------- - name: Render static Traefik config ansible.builtin.template: src: ../templates/traefik_static.toml.j2 dest: "{{ static_traefik_path }}" mode: "0644" - name: Render dynamic Traefik config ansible.builtin.template: src: ../templates/traefik_dynamic.yml.j2 dest: "{{ dynamic_traefik_path }}" mode: "0644" - name: Render coturn config ansible.builtin.template: src: ../templates/turnserver.conf.j2 dest: "{{ turn_conf_path }}" mode: "0644" - name: Render Synapse homeserver.yaml ansible.builtin.template: src: ../templates/homeserver.yaml.j2 dest: "{{ synapse_cfg_path }}" mode: "0644" - name: Render landing page index.html ansible.builtin.template: src: ../templates/landing.html.j2 # path relative to this playbook file dest: "{{ nginx_html_path }}" # we already defined this variable in vars.yml mode: "0644" # ----------------------------------------------------------------- # Start the NGINX container (unchanged – just mounts the file we created) # ----------------------------------------------------------------- - name: Start NGINX landing‑page container containers.podman.podman_container: name: landing image: "{{ nginx_image }}" state: started ports: - "8080:80" volumes: - "{{ vol_nginx }}:/usr/share/nginx/html:ro" - "{{ nginx_html_path }}:/usr/share/nginx/html/index.html:ro" network: "{{ podman_network }}" restart_policy: always # ----------------------------------------------------------------- # Start containers (Traefik, TURN, Synapse, NGINX – unchanged) # ----------------------------------------------------------------- - name: Start Traefik container containers.podman.podman_container: name: traefik image: "{{ traefik_image }}" state: started ports: - "{{ traefik_http_port }}:{{ traefik_http_port }}" - "{{ traefik_https_port }}:{{ traefik_https_port }}" - "{{ teamspeak_tcp_port }}:{{ teamspeak_tcp_port }}" # expose TCP entrypoint on host volumes: - "{{ vol_traefik }}:/etc/traefik" - "{{ static_traefik_path }}:{{ static_traefik_path }}:ro" - "{{ dynamic_traefik_path }}:{{ dynamic_traefik_path }}:ro" network: "{{ podman_network }}" restart_policy: always - name: Start coturn container containers.podman.podman_container: name: turn image: "{{ turn_image }}" state: started ports: - "{{ turn_listen_port }}:{{ turn_listen_port }}/udp" - "{{ turn_listen_port }}:{{ turn_listen_port }}/tcp" - "{{ turn_tls_port }}:{{ turn_tls_port }}/udp" - "{{ turn_tls_port }}:{{ turn_tls_port }}/tcp" volumes: - "{{ vol_turn }}:/var/lib/turn" - "{{ turn_conf_path }}:/etc/turnserver.conf:ro" command: "-c /etc/turnserver.conf" network: "{{ podman_network }}" restart_policy: always - name: Start Synapse container containers.podman.podman_container: name: synapse image: "{{ synapse_image }}" state: started env: SYNAPSE_SERVER_NAME: "{{ matrix_domain }}" SYNAPSE_REPORT_STATS: "yes" ports: - "{{ synapse_http_port }}:{{ synapse_http_port }}" volumes: - "{{ vol_synapse }}:/data" - "{{ vol_media }}:/data/media_store" - "{{ synapse_cfg_path }}:/data/homeserver.yaml:ro" network: "{{ podman_network }}" restart_policy: always - name: Start NGINX landing‑page container containers.podman.podman_container: name: landing image: "{{ nginx_image }}" state: started ports: - "8080:80" volumes: - "{{ vol_nginx }}:/usr/share/nginx/html:ro" - "{{ nginx_html_path }}:/usr/share/nginx/html/index.html:ro" network: "{{ podman_network }}" restart_policy: always # ----------------------------------------------------------------- # Start Teamspeak container # ----------------------------------------------------------------- - name: Start Teamspeak container containers.podman.podman_container: name: "{{ teamspeak_container_name }}" image: "{{ teamspeak_image }}" state: started ports: # UDP voice port – exposed directly on the host (no Traefik) - "{{ teamspeak_udp_port }}:{{ teamspeak_udp_port }}/udp" # TCP query port – Traefik will forward it (see static config) - "{{ teamspeak_tcp_port }}:{{ teamspeak_tcp_port }}/tcp" # Optional file‑transfer port (exposed directly) - "{{ teamspeak_file_port }}:{{ teamspeak_file_port }}/tcp" volumes: - "{{ vol_teamspeak }}:/var/ts3server" network: "{{ podman_network }}" restart_policy: always # ----------------------------------------------------------------- # generate systemd units for containers # ----------------------------------------------------------------- - name: Generate systemd unit for Teamspeak containers.podman.podman_generate_systemd: name: "{{ teamspeak_container_name }}" state: present dest: "/etc/systemd/system/{{ teamspeak_container_name }}.service" when: generate_systemd | bool - name: Generate systemd unit for Traefik containers.podman.podman_generate_systemd: name: traefik state: present dest: "/etc/systemd/system/traefik.service" when: generate_systemd | bool - name: Generate systemd unit for TURN containers.podman.podman_generate_systemd: name: turn state: present dest: "/etc/systemd/system/turn.service" when: generate_systemd | bool - name: Generate systemd unit for Synapse containers.podman.podman_generate_systemd: name: synapse state: present dest: "/etc/systemd/system/synapse.service" when: generate_systemd | bool - name: Generate systemd unit for landing page containers.podman.podman_generate_systemd: name: landing state: present dest: "/etc/systemd/system/landing.service" when: generate_systemd | bool - name: Reload systemd daemon (if units were created) ansible.builtin.systemd: daemon_reload: yes when: generate_systemd | bool # ----------------------------------------------------------------- # Debug – list containers # ----------------------------------------------------------------- - name: List running podman containers containers.podman.podman_ps: all: true register: ps_out - name: Show container list ansible.builtin.debug: var: ps_out.containers