881fdd28f0
This allows people to augment the Synapse image with custom tools and addons without having to rebuild it from scratch. If customizations are enabled, the playbook will build a new `localhost/matrixdotorg/synapse:VERSION-customized` image on top of the default one (`FROM matrixdotorg/synapse:VERSION`) and with custom Dockerfile build steps. For servers that self-build the Synapse image, the Synapse image will be built first, before proceding to extend it the same way. In the future, we'll also have easy to enable Dockerfile build steps for modules that the playbook supports.
90 lines
3.1 KiB
YAML
90 lines
3.1 KiB
YAML
---
|
|
|
|
# Pre-checks
|
|
|
|
- name: Fail if Postgres not enabled
|
|
ansible.builtin.fail:
|
|
msg: "Postgres via the matrix-postgres role is not enabled (`matrix_postgres_enabled`). Cannot import."
|
|
when: "not matrix_postgres_enabled | bool"
|
|
|
|
- name: Fail if playbook called incorrectly
|
|
ansible.builtin.fail:
|
|
msg: "The `server_path_homeserver_db` variable needs to be provided to this playbook, via --extra-vars"
|
|
when: "server_path_homeserver_db is not defined or server_path_homeserver_db.startswith('<')"
|
|
|
|
- name: Check if the provided SQLite homeserver.db file exists
|
|
ansible.builtin.stat:
|
|
path: "{{ server_path_homeserver_db }}"
|
|
register: result_server_path_homeserver_db_stat
|
|
|
|
- name: Fail if provided SQLite homeserver.db file doesn't exist
|
|
ansible.builtin.fail:
|
|
msg: "File cannot be found on the server at {{ server_path_homeserver_db }}"
|
|
when: "not result_server_path_homeserver_db_stat.stat.exists"
|
|
|
|
|
|
# Defaults
|
|
|
|
- name: Set postgres_start_wait_time, if not provided
|
|
ansible.builtin.set_fact:
|
|
postgres_start_wait_time: 15
|
|
when: "postgres_start_wait_time | default('') == ''"
|
|
|
|
|
|
# Actual import work
|
|
|
|
- name: Ensure matrix-postgres is stopped
|
|
ansible.builtin.service:
|
|
name: matrix-postgres
|
|
state: stopped
|
|
daemon_reload: true
|
|
|
|
- name: Ensure postgres data is wiped out
|
|
ansible.builtin.file:
|
|
path: "{{ matrix_postgres_data_path }}"
|
|
state: absent
|
|
|
|
- name: Ensure postgres data path exists
|
|
ansible.builtin.file:
|
|
path: "{{ matrix_postgres_data_path }}"
|
|
state: directory
|
|
mode: 0700
|
|
owner: "{{ matrix_user_username }}"
|
|
group: "{{ matrix_user_groupname }}"
|
|
|
|
- name: Ensure matrix-postgres is started
|
|
ansible.builtin.service:
|
|
name: matrix-postgres
|
|
state: restarted
|
|
daemon_reload: true
|
|
|
|
- name: Wait a bit, so that Postgres can start
|
|
ansible.builtin.wait_for:
|
|
timeout: "{{ postgres_start_wait_time }}"
|
|
delegate_to: 127.0.0.1
|
|
become: false
|
|
|
|
# We don't use the `docker_container` module, because using it with `cap_drop` requires
|
|
# a very recent version, which is not available for a lot of people yet.
|
|
#
|
|
# Also, some old `docker_container` versions were buggy and would leave containers behind
|
|
# on failure, which we had to work around to allow retries (by re-running the playbook).
|
|
- name: Import SQLite database into Postgres
|
|
ansible.builtin.command:
|
|
cmd: |
|
|
docker run
|
|
--rm
|
|
--name=matrix-synapse-migrate
|
|
--log-driver=none
|
|
--user={{ matrix_user_uid }}:{{ matrix_user_gid }}
|
|
--cap-drop=ALL
|
|
--network={{ matrix_docker_network }}
|
|
--entrypoint=python
|
|
--mount type=bind,src={{ matrix_synapse_config_dir_path }},dst=/data
|
|
--mount type=bind,src={{ matrix_synapse_config_dir_path }},dst=/matrix-media-store-parent/media-store
|
|
--mount type=bind,src={{ server_path_homeserver_db }},dst=/{{ server_path_homeserver_db | basename }}
|
|
{{ matrix_synapse_docker_image_final }}
|
|
/usr/local/bin/synapse_port_db --sqlite-database /{{ server_path_homeserver_db | basename }} --postgres-config /data/homeserver.yaml
|
|
register: matrix_postgres_import_synapse_sqlite_db_result
|
|
changed_when: matrix_postgres_import_synapse_sqlite_db_result.rc == 0
|