Refactoring of discourse role during debugging

This commit is contained in:
Kevin Veen-Birkenbach 2025-08-15 20:06:56 +02:00
parent 3adb08fc68
commit e3b09e7f1a
No known key found for this signature in database
GPG Key ID: 44D8F11FD62F878E
10 changed files with 111 additions and 105 deletions

View File

@ -13,7 +13,7 @@ pry(main)> SiteSetting.all.each { |setting| puts "#{setting.name}: #{setting.val
To reinitialize the container execute: To reinitialize the container execute:
```bash ```bash
docker network connect discourse_default central-postgres && /opt/docker/discourse/services/discourse_repository/launcher rebuild discourse_application docker network connect discourse_default central-postgres && /opt/docker/discourse/services/repository/launcher rebuild discourse_application
``` ```
### 🔍 Logging with `journalctl` ### 🔍 Logging with `journalctl`

View File

@ -1,4 +1,4 @@
repository: "discourse_repository" # Name of the repository folder repository: "repository" # Name of the repository folder
features: features:
matomo: true matomo: true
css: true css: true
@ -31,6 +31,7 @@ docker:
image: "local_discourse/<< defaults_applications[web-app-discourse].docker.services.discourse.name >>" # Necessary to define this for the docker 2 loc backup image: "local_discourse/<< defaults_applications[web-app-discourse].docker.services.discourse.name >>" # Necessary to define this for the docker 2 loc backup
backup: backup:
no_stop_required: true no_stop_required: true
repository: "https://github.com/discourse/discourse_docker.git"
volumes: volumes:
data: discourse_data data: discourse_data
network: discourse network: discourse

View File

@ -1,14 +1,14 @@
--- ---
- name: "stop and remove discourse container if it exist" - name: "stop and remove discourse container if it exist"
community.docker.docker_container: community.docker.docker_container:
name: "{{ discourse_container }}" name: "{{ DISCOURSE_CONTAINER }}"
state: absent state: absent
register: container_action register: container_action
failed_when: container_action.failed and 'No such container' not in container_action.msg failed_when: container_action.failed and 'No such container' not in container_action.msg
listen: recreate discourse listen: recreate discourse
- name: "add central database temporary to discourse network" - name: "add central database temporary to discourse network"
command: "docker network connect {{ discourse_network }} {{ database_host }}" command: "docker network connect {{ DISCOURSE_NETWORK }} {{ database_host }}"
failed_when: > failed_when: >
result.rc != 0 and result.rc != 0 and
'already exists in network' not in result.stderr 'already exists in network' not in result.stderr
@ -17,10 +17,8 @@
listen: recreate discourse listen: recreate discourse
- name: rebuild discourse - name: rebuild discourse
shell: ./launcher rebuild {{ discourse_container }} shell: ./launcher rebuild {{ DISCOURSE_CONTAINER }}
args: args:
executable: /bin/bash executable: /bin/bash
chdir: "{{docker_repository_directory }}" chdir: "{{ DISCOURSE_REPOSITORY_DIR }}"
async: "{{ ASYNC_TIME if ASYNC_ENABLED | bool else omit }}"
poll: "{{ ASYNC_POLL if ASYNC_ENABLED | bool else omit }}"
listen: recreate discourse listen: recreate discourse

View File

@ -2,74 +2,8 @@
include_tasks: 02_reset.yml include_tasks: 02_reset.yml
when: MODE_RESET | bool when: MODE_RESET | bool
# Necessary for building: https://chat.openai.com/share/99d258cc-294b-4924-8eef-02fe419bb838 - name: "Setup '{{ application_id }}' docker"
- name: install which include_tasks: 03_docker.yml
community.general.pacman:
name: which
state: present
- name: "load docker, db and proxy for {{ application_id }}" - name: "Setup '{{ application_id }}' network"
include_role: include_tasks: 04_network.yml
name: cmp-db-docker-proxy
- name: pull docker repository
git:
repo: "https://github.com/discourse/discourse_docker.git"
dest: "{{docker_repository_directory }}"
update: yes
notify: recreate discourse
become: true
ignore_errors: true
- name: set chmod 700 for {{docker_repository_directory }}containers
ansible.builtin.file:
path: "{{docker_repository_directory }}/containers"
mode: '700'
state: directory
- name: "copy configuration to {{discourse_application_yml_destination}}"
template:
src: config.yml.j2
dest: "{{ discourse_application_yml_destination }}"
mode: '0640'
notify: recreate discourse
- name: "Verify that '{{ discourse_container }}' is running"
command: docker compose ps --filter status=running --format '{{"{{"}}.Name{{"}}"}}' | grep -x {{ discourse_container }}
register: docker_ps
changed_when: docker_ps.rc == 1
failed_when: docker_ps.rc not in [0, 1]
notify: recreate discourse
- name: flush, to recreate discourse app
meta: flush_handlers
- name: Set error string for network already exists
set_fact:
docker_discourse_already_in_net: "Error response from daemon: endpoint with name {{ discourse_container }} already exists in network {{ discourse_pg_network }}"
- name: "Connect {{ discourse_container }} to network {{ discourse_pg_network }}"
command: >
docker network connect {{ discourse_pg_network }} {{ discourse_container }}
register: network_connect
failed_when: >
network_connect.rc != 0 and
docker_discourse_already_in_net not in network_connect.stderr
changed_when: network_connect.rc == 0
when:
- applications | get_app_conf(application_id, 'features.central_database', False)
- name: Set error string for network not connected
set_fact:
docker_discourse_not_connected: 'is not connected to network {{ discourse_network }}'
- name: "Remove {{ discourse_network }} from {{ database_host }}"
command: >
docker network disconnect {{ discourse_network }} {{ database_host }}
register: network_disconnect
failed_when: >
network_disconnect.rc != 0 and
docker_discourse_not_connected not in network_disconnect.stderr
changed_when: network_disconnect.rc == 0
when:
- applications | get_app_conf(application_id, 'features.central_database', False)

View File

@ -6,9 +6,9 @@
cmd: "docker network disconnect {{applications | get_app_conf(application_id, 'network', True)}} {{ database_host }}" cmd: "docker network disconnect {{applications | get_app_conf(application_id, 'network', True)}} {{ database_host }}"
ignore_errors: true ignore_errors: true
- name: "destroy container {{ discourse_container }}" - name: "destroy container {{ DISCOURSE_CONTAINER }}"
command: command:
cmd: "./launcher destroy {{ discourse_container }}" cmd: "./launcher destroy {{ DISCOURSE_CONTAINER }}"
chdir: "{{ docker_repository_directory }}" chdir: "{{ DISCOURSE_REPOSITORY_DIR }}"
ignore_errors: true ignore_errors: true
notify: recreate discourse notify: recreate discourse

View File

@ -0,0 +1,43 @@
# Necessary for building: https://chat.openai.com/share/99d258cc-294b-4924-8eef-02fe419bb838
- name: install which
community.general.pacman:
name: which
state: present
- name: "load docker, db and proxy for {{ application_id }}"
include_role:
name: cmp-db-docker-proxy
vars:
docker_compose_flush_handlers: true
- name: pull docker repository
git:
repo: "{{ DISCOURSE_REPOSITORY_URL }}"
dest: "{{ DISCOURSE_REPOSITORY_DIR }}"
update: yes
notify: recreate discourse
become: true
ignore_errors: true
- name: set chmod 700 for '{{ DISCOURSE_CONTAINERS_DIR}}'
ansible.builtin.file:
path: "{{ DISCOURSE_CONTAINERS_DIR }}"
mode: '700'
state: directory
- name: "copy configuration to '{{ DISCOURSE_APPLICATION_YML_DEST }}'"
template:
src: config.yml.j2
dest: "{{ DISCOURSE_APPLICATION_YML_DEST }}"
mode: '0640'
notify: recreate discourse
- name: "Verify that '{{ DISCOURSE_CONTAINER }}' is running"
command: docker compose ps --filter status=running --format '{{"{{"}}.Name{{"}}"}}' | grep -x {{ DISCOURSE_CONTAINER }}
register: docker_ps
changed_when: docker_ps.rc == 1
failed_when: docker_ps.rc not in [0, 1]
notify: recreate discourse
- name: flush, to recreate discourse app
meta: flush_handlers

View File

@ -0,0 +1,21 @@
- name: "Connect '{{ DISCOURSE_CONTAINER }}' to network '{{ DISCOURSE_PG_NETWORK }}'"
command: >
docker network connect {{ DISCOURSE_PG_NETWORK }} {{ DISCOURSE_CONTAINER }}
register: network_connect
failed_when: >
network_connect.rc != 0 and
DISCOURSE_ERROR_ALREADY_IN_NET not in network_connect.stderr
changed_when: network_connect.rc == 0
when:
- applications | get_app_conf(application_id, 'features.central_database', False)
- name: "Remove {{ DISCOURSE_NETWORK }} from {{ database_host }}"
command: >
docker network disconnect {{ DISCOURSE_NETWORK }} {{ database_host }}
register: network_disconnect
failed_when: >
network_disconnect.rc != 0 and
DISCOURSE_ERROR_NOT_CONNECTED not in network_disconnect.stderr
changed_when: network_disconnect.rc == 0
when:
- applications | get_app_conf(application_id, 'features.central_database', False)

View File

@ -74,7 +74,7 @@ env:
DISCOURSE_DB_NAME: {{ database_name }} DISCOURSE_DB_NAME: {{ database_name }}
# Redis Configuration # Redis Configuration
DISCOURSE_REDIS_HOST: {{ discourse_redis_host }} DISCOURSE_REDIS_HOST: {{ DISCOURSE_REDIS_HOST }}
## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
#LETSENCRYPT_ACCOUNT_EMAIL: administrator@veen.world #LETSENCRYPT_ACCOUNT_EMAIL: administrator@veen.world
@ -90,7 +90,7 @@ env:
## The Docker container is stateless; all data is stored in /shared ## The Docker container is stateless; all data is stored in /shared
volumes: volumes:
- volume: - volume:
host: {{ discourse_volume }} host: {{ DISCOURSE_VOLUME }}
guest: /shared guest: /shared
- volume: - volume:
host: /var/discourse/shared/standalone/log/var-log host: /var/discourse/shared/standalone/log/var-log
@ -103,7 +103,7 @@ hooks:
- exec: - exec:
cd: $home/plugins cd: $home/plugins
cmd: cmd:
{% for plugin_name, plugin_config in discourse_plugins.items() %} {% for plugin_name, plugin_config in DISCOURSE_PLUGINS.items() %}
{% if plugin_config.enabled %} {% if plugin_config.enabled %}
- git clone --depth=1 https://github.com/discourse/{{ plugin_name }}.git - git clone --depth=1 https://github.com/discourse/{{ plugin_name }}.git
{% endif %} {% endif %}
@ -132,7 +132,7 @@ run:
#- exec: rails r "User.find_by_email('{{ users.administrator.email }}').update(username: '{{users.administrator.username}}')" #- exec: rails r "User.find_by_email('{{ users.administrator.email }}').update(username: '{{users.administrator.username}}')"
# The following code is just an inspiration, how to connect with the oidc account. as long as this is not set the admini account needs to be manually connected with oidc # The following code is just an inspiration, how to connect with the oidc account. as long as this is not set the admini account needs to be manually connected with oidc
# docker exec -it {{ discourse_container }} rails runner "user = User.find_by_email('test@infinito.nexus'); UserAuth.create(user_id: user.id, provider: 'oidc', uid: 'eindeutige_oidc_id', info: { name: user.username, email: user.email })" # docker exec -it {{ DISCOURSE_CONTAINER }} rails runner "user = User.find_by_email('test@infinito.nexus'); UserAuth.create(user_id: user.id, provider: 'oidc', uid: 'eindeutige_oidc_id', info: { name: user.username, email: user.email })"
# OIDC Activation # OIDC Activation
- exec: rails r "SiteSetting.openid_connect_enabled = true" - exec: rails r "SiteSetting.openid_connect_enabled = true"
@ -170,5 +170,5 @@ run:
- exec: echo "End of custom commands" - exec: echo "End of custom commands"
docker_args: docker_args:
- --network={{ discourse_network }} - --network={{ DISCOURSE_NETWORK }}
- --name={{ discourse_container }} - --name={{ DISCOURSE_CONTAINER }}

View File

@ -3,5 +3,5 @@
{% include 'roles/docker-compose/templates/volumes.yml.j2' %} {% include 'roles/docker-compose/templates/volumes.yml.j2' %}
{% include 'roles/docker-compose/templates/networks.yml.j2' %} {% include 'roles/docker-compose/templates/networks.yml.j2' %}
{{ discourse_network }}: {{ DISCOURSE_NETWORK }}:
external: true external: true

View File

@ -5,14 +5,23 @@ database_password: "{{ applications | get_app_conf(applicat
database_type: "postgres" database_type: "postgres"
# Discourse # Discourse
discourse_container: "{{ applications | get_app_conf(application_id, 'docker.services.discourse.name') }}"
discourse_network: "{{ applications | get_app_conf(application_id, 'docker.network') }}"
discourse_volume: "{{ applications | get_app_conf(application_id, 'docker.volumes.data') }}"
discourse_plugins: "{{ applications | get_app_conf(application_id, 'plugins') }}"
discourse_pg_network: "{{ applications | get_app_conf('svc-db-postgres', 'docker.network' ) }}"
discourse_application_yml_destination: "{{ docker_repository_directory }}containers/{{ discourse_container }}.yml"
discourse_redis_host: "{{ application_id |get_entity_name }}-redis"
# General Docker Configuration ## General
docker_repository_directory : "{{ docker_compose.directories.services}}{{applications | get_app_conf( application_id, 'repository') }}/" DISCOURSE_CONTAINER: "{{ applications | get_app_conf(application_id, 'docker.services.discourse.name') }}"
docker_compose_flush_handlers: true DISCOURSE_NETWORK: "{{ applications | get_app_conf(application_id, 'docker.network') }}"
DISCOURSE_VOLUME: "{{ applications | get_app_conf(application_id, 'docker.volumes.data') }}"
DISCOURSE_PLUGINS: "{{ applications | get_app_conf(application_id, 'plugins') }}"
DISCOURSE_PG_NETWORK: "{{ applications | get_app_conf('svc-db-postgres', 'docker.network' ) }}"
DISCOURSE_REDIS_HOST: "{{ application_id | get_entity_name }}-redis"
DISCOURSE_REPOSITORY_URL: "{{ applications | get_app_conf(application_id, 'docker.services.discourse.repository') }}"
## Directories
DISCOURSE_REPOSITORY_DIR: "{{ docker_compose.directories.services }}{{ applications | get_app_conf( application_id, 'repository') }}/"
DISCOURSE_CONTAINERS_DIR: "{{ DISCOURSE_REPOSITORY_DIR }}/containers/"
## Files
DISCOURSE_APPLICATION_YML_DEST: "{{ DISCOURSE_CONTAINERS_DIR }}{{ DISCOURSE_CONTAINER }}.yml"
## Error Strings
DISCOURSE_ERROR_ALREADY_IN_NET: "Error response from daemon: endpoint with name {{ DISCOURSE_CONTAINER }} already exists in network {{ DISCOURSE_PG_NETWORK }}"
DISCOURSE_ERROR_NOT_CONNECTED: 'is not connected to network {{ DISCOURSE_NETWORK }}'