Files
fpov/deploy_matrix.yml

259 lines
9.0 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
- 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