Files
fpov/deploy_matrix.yml
2026-03-21 18:03:35 -06:00

273 lines
8.9 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.36.0.0/16"
state: present
- name: Ensure required podman volumes exist
containers.podman.podman_volume:
name: "{{ item }}"
driver: local
state: present
loop:
- "{{ vol_synapse }}"
- "{{ vol_media }}"
- "{{ vol_turn }}"
- "{{ vol_nginx }}"
- "{{ vol_teamspeak }}"
- "{{ npm_data }}"
- "{{ npm_letsencrypt }}"
# -----------------------------------------------------------------
# Pull required images (including Teamspeak)
# -----------------------------------------------------------------
- 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
- name: Pull Nginx Proxy Manager image
containers.podman.podman_image:
name: "{{ npm_image }}"
state: present
- name: Pull Postgres DB image
containers.podman.podman_image:
name: "{{ db_image }}"
state: present
# -----------------------------------------------------------------
# Render all configuration files from the templates
# -----------------------------------------------------------------
- name: Render coturn config
ansible.builtin.template:
src: turnserver.conf.j2
dest: "{{ turn_conf_path }}"
mode: "0644"
- name: Render Synapse homeserver.yaml
ansible.builtin.template:
src: homeserver.yaml.j2
dest: "{{ synapse_cfg_path }}"
mode: "0644"
- name: Render landing page index.html
ansible.builtin.template:
src: landing.html.j2
dest: "{{ nginx_html_path }}"
mode: "0644"
- name: Render Synapse Secret key
ansible.builtin.template:
src: matrix.fpov.space.signing.key
dest: "{{ synapse_secret_key_path }}"
mode: "0644"
- name: Render Synapse log config file
ansible.builtin.template:
src: matrix.fpov.space.log.config.j2
dest: "{{ synapse_log_config }}"
mode: "0644"
# -----------------------------------------------------------------
# Start the NGINX Proxy Manager Container
# -----------------------------------------------------------------
- name: Start Nginx Proxy manager
containers.podman.podman_container:
name: npm
image: "{{ npm_image }}"
state: started
ports:
- "80:80"
- "443:443"
- "81:81"
volumes:
- "{{ npm_data }}:/data"
- "{{ npm_letsencrypt }}:/etc/letsencrypt"
network: "{{ podman_network }}"
# -----------------------------------------------------------------
# Start the NGINX container
# -----------------------------------------------------------------
# - 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 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 Database container
containers.podman.podman_container:
name: synapse-db
image: "{{ db_image }}"
state: started
env:
POSTGRES_USER: "{{ postgres_user }}"
POSTGRES_PASSWORD: "{{ postgres_pw }}"
POSTGRES_DB: "{{ postgres_db }}"
volumes:
- "{{ vol_db }}:/var/lib/postgresql/data"
network: "{{ podman_network }}"
restart_policy: always
- name: Start Synapse container
containers.podman.podman_container:
name: synapse "{{ matrix_container_name }}"
image: "{{ synapse_image }}"
state: started
ports:
- "{{ synapse_http_port }}:{{ synapse_http_port }}"
volumes:
- "{{ vol_synapse }}:/data"
- "{{ vol_media }}:/data/media_store"
- "{{ synapse_cfg_path }}:/data/homeserver.yaml:Z"
- "{{ synapse_secret_key_path }}:/data/matrix.fpov.space.signing.key:Z"
- "{{ synapse_log_config }}:/data/matrix.fpov.space.log.config:Z"
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 }}"
env:
TS3SERVER_LICENSE: accept
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"
# - name: Generate systemd unit for Traefik
# containers.podman.podman_generate_systemd:
# name: traefik
# state: present
# dest: "/etc/systemd/system/traefik.service"
# - name: Generate systemd unit for TURN
# containers.podman.podman_generate_systemd:
# name: turn
# state: present
# dest: "/etc/systemd/system/turn.service"
# - name: Generate systemd unit for Synapse
# containers.podman.podman_generate_systemd:
# name: synapse
# state: present
# dest: "/etc/systemd/system/synapse.service"
# - name: Generate systemd unit for landing page
# containers.podman.podman_generate_systemd:
# name: landing
# state: present
# dest: "/etc/systemd/system/landing.service"
# - name: Reload systemd daemon (if units were created)
# ansible.builtin.systemd:
# daemon_reload: yes