mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-08-18 09:45:03 +02:00
Refactoring of discourse role during debugging
This commit is contained in:
parent
3adb08fc68
commit
e3b09e7f1a
@ -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`
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
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
|
||||||
desktop: true
|
desktop: true
|
||||||
oidc: true
|
oidc: true
|
||||||
central_database: true
|
central_database: true
|
||||||
ldap: false # @todo implement and activate
|
ldap: false # @todo implement and activate
|
||||||
logout: true
|
logout: true
|
||||||
server:
|
server:
|
||||||
csp:
|
csp:
|
||||||
flags:
|
flags:
|
||||||
@ -27,10 +27,11 @@ docker:
|
|||||||
redis:
|
redis:
|
||||||
enabled: true
|
enabled: true
|
||||||
discourse:
|
discourse:
|
||||||
name: "discourse"
|
name: "discourse"
|
||||||
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
|
||||||
|
@ -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
|
@ -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)
|
|
@ -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
|
43
roles/web-app-discourse/tasks/03_docker.yml
Normal file
43
roles/web-app-discourse/tasks/03_docker.yml
Normal 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
|
21
roles/web-app-discourse/tasks/04_network.yml
Normal file
21
roles/web-app-discourse/tasks/04_network.yml
Normal 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)
|
@ -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 }}
|
||||||
|
@ -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
|
@ -1,18 +1,27 @@
|
|||||||
application_id: "web-app-discourse"
|
application_id: "web-app-discourse"
|
||||||
|
|
||||||
# Database
|
# Database
|
||||||
database_password: "{{ applications | get_app_conf(application_id, 'credentials.database_password') }}"
|
database_password: "{{ applications | get_app_conf(application_id, 'credentials.database_password') }}"
|
||||||
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 }}'
|
Loading…
x
Reference in New Issue
Block a user