--- # Synapse homeserver installation and configuration # Uses SQLite3 (matches c2itall chat-server pattern — no PostgreSQL needed) - name: Install dependencies apt: name: - python3 - python3-pip - python3-venv - nginx - certbot - python3-certbot-nginx - curl - wget - gnupg - lsb-release state: present - name: Add Matrix Synapse GPG key and repository shell: | wget -qO /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/matrix-org.list args: creates: /etc/apt/sources.list.d/matrix-org.list - name: Update apt cache after adding Matrix repo apt: update_cache: true - name: Install Synapse apt: name: matrix-synapse-py3 state: present environment: DEBIAN_FRONTEND: noninteractive - name: Set correct ownership for Matrix directories file: path: "{{ item }}" state: directory owner: matrix-synapse group: matrix-synapse mode: "0750" recurse: true loop: - /var/lib/matrix-synapse - /var/log/matrix-synapse - name: Deploy Synapse homeserver config template: src: ../templates/homeserver.yaml.j2 dest: /etc/matrix-synapse/homeserver.yaml owner: matrix-synapse group: matrix-synapse mode: "0640" notify: restart synapse - name: Clear conflicting conf.d configurations shell: | rm -f /etc/matrix-synapse/conf.d/*.yaml 2>/dev/null || true changed_when: false - name: Allow Matrix federation port through UFW ufw: rule: allow port: "8448" proto: tcp - name: Allow HTTP/HTTPS through UFW ufw: rule: allow port: "{{ item }}" proto: tcp loop: - "80" - "443" - name: Enable and start Synapse service: name: matrix-synapse state: restarted enabled: true - name: Wait for Synapse to be ready wait_for: port: 8008 host: 127.0.0.1 delay: 5 timeout: 60 - name: Create admin user shell: | /opt/venvs/matrix-synapse/bin/register_new_matrix_user \ -c /etc/matrix-synapse/homeserver.yaml \ -u {{ matrix_admin }} \ -p {{ matrix_admin_pass }} \ -a register: admin_create failed_when: - admin_create.rc != 0 - "'User ID already taken' not in admin_create.stderr" changed_when: "'User ID already taken' not in admin_create.stderr"