Compare commits

...

3 Commits

Author SHA1 Message Date
71ceb339fc Fix Confluence & BookWyrm setup:
- Add docker compose build trigger in docker-compose tasks
- Cleanup svc-prx-openresty vars
- Enable unsafe-inline CSP flags for BookWyrm, Confluence, Jira to allow Atlassian inline scripts
- Generalize CONFLUENCE_HOME usage in vars, env and docker-compose
- Ensure confluence-init.properties written with correct home
- Add JVM_SUPPORT_RECOMMENDED_ARGS to pass atlassian.home
- Update README to reference {{ CONFLUENCE_HOME }}

See: https://chatgpt.com/share/68b7582a-aeb8-800f-a14f-e98c5b4e6c70
2025-09-02 22:49:02 +02:00
61bba3d2ef feat(bookwyrm): production-ready runtime + Redis wiring
- Dockerfile: build & install gunicorn wheels
- compose: run initdb before start; use `python -m gunicorn`
- env: add POSTGRES_* and BookWyrm Redis aliases (BROKER/ACTIVITY/CACHE) + CACHE_URL
- vars: add cache URL, DB indices, and URL aliases for Redis

Ref: https://chatgpt.com/share/68b7492b-3200-800f-80c4-295bc3233d68
2025-09-02 21:45:11 +02:00
0bde4295c7 Implemented correct confluence version 2025-09-02 17:01:58 +02:00
14 changed files with 65 additions and 16 deletions

View File

@@ -5,7 +5,9 @@
loop: loop:
- "{{ application_id | abs_role_path_by_application_id }}/templates/Dockerfile.j2" - "{{ application_id | abs_role_path_by_application_id }}/templates/Dockerfile.j2"
- "{{ application_id | abs_role_path_by_application_id }}/files/Dockerfile" - "{{ application_id | abs_role_path_by_application_id }}/files/Dockerfile"
notify: docker compose up notify:
- docker compose up
- docker compose build
register: create_dockerfile_result register: create_dockerfile_result
failed_when: failed_when:
- create_dockerfile_result is failed - create_dockerfile_result is failed

View File

@@ -8,4 +8,3 @@ database_type: ""
OPENRESTY_IMAGE: "openresty/openresty" OPENRESTY_IMAGE: "openresty/openresty"
OPENRESTY_VERSION: "alpine" OPENRESTY_VERSION: "alpine"
OPENRESTY_CONTAINER: "{{ applications | get_app_conf(application_id, 'docker.services.openresty.name', True) }}" OPENRESTY_CONTAINER: "{{ applications | get_app_conf(application_id, 'docker.services.openresty.name', True) }}"

View File

@@ -24,7 +24,11 @@ features:
server: server:
csp: csp:
whitelist: {} whitelist: {}
flags: {} flags:
script-src-elem:
unsafe-inline: true
script-src:
unsafe-inline: true
domains: domains:
canonical: canonical:
- "book.{{ PRIMARY_DOMAIN }}" - "book.{{ PRIMARY_DOMAIN }}"

View File

@@ -12,7 +12,8 @@ RUN git clone --depth=1 --branch "{{ BOOKWYRM_VERSION }}" https://github.com/boo
# Pre-install Python deps to a wheelhouse for faster final image # Pre-install Python deps to a wheelhouse for faster final image
RUN pip install --upgrade pip \ RUN pip install --upgrade pip \
&& pip wheel --wheel-dir /wheels -r requirements.txt && pip wheel --wheel-dir /wheels -r requirements.txt \
&& pip wheel --wheel-dir /wheels gunicorn
FROM python:3.11-bookworm FROM python:3.11-bookworm
ENV PYTHONUNBUFFERED=1 ENV PYTHONUNBUFFERED=1
@@ -28,6 +29,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
libjpeg62-turbo zlib1g libxml2 libxslt1.1 libffi8 libmagic1 \ libjpeg62-turbo zlib1g libxml2 libxslt1.1 libffi8 libmagic1 \
&& rm -rf /var/lib/apt/lists/* \ && rm -rf /var/lib/apt/lists/* \
&& pip install --no-cache-dir --no-index --find-links=/wheels -r /app/requirements.txt \ && pip install --no-cache-dir --no-index --find-links=/wheels -r /app/requirements.txt \
&& pip install --no-cache-dir --no-index --find-links=/wheels gunicorn \
&& adduser --disabled-password --gecos '' bookwyrm \ && adduser --disabled-password --gecos '' bookwyrm \
&& mkdir -p /app/data /app/media \ && mkdir -p /app/data /app/media \
&& chown -R bookwyrm:bookwyrm /app && chown -R bookwyrm:bookwyrm /app

View File

@@ -6,7 +6,8 @@
bash -lc ' bash -lc '
python manage.py migrate --noinput && python manage.py migrate --noinput &&
python manage.py collectstatic --noinput && python manage.py collectstatic --noinput &&
gunicorn bookwyrm.wsgi:application --bind 0.0.0.0:{{ container_port }} (python manage.py initdb || true) &&
python -m gunicorn bookwyrm.wsgi:application --bind 0.0.0.0:{{ container_port }}
' '
build: build:
context: . context: .

View File

@@ -22,17 +22,39 @@ EMAIL_HOST_PASSWORD="{{ EMAIL_HOST_PASSWORD }}"
DEFAULT_FROM_EMAIL="{{ EMAIL_DEFAULT_FROM }}" DEFAULT_FROM_EMAIL="{{ EMAIL_DEFAULT_FROM }}"
# Database # Database
POSTGRES_DB="{{ database_name }}"
POSTGRES_USER="{{ database_username }}"
POSTGRES_PASSWORD="{{ database_password }}"
POSTGRES_HOST="{{ database_host }}"
POSTGRES_PORT="{{ database_port }}"
DATABASE_URL="postgres://{{ database_username }}:{{ database_password }}@{{ database_host }}:{{ database_port }}/{{ database_name }}" DATABASE_URL="postgres://{{ database_username }}:{{ database_password }}@{{ database_host }}:{{ database_port }}/{{ database_name }}"
# Redis / Celery # Redis / Celery
REDIS_HOST="{{ BOOKWYRM_REDIS_HOST }}"
REDIS_PORT="{{ BOOKWYRM_REDIS_PORT }}"
REDIS_URL="{{ BOOKWYRM_REDIS_CACHE_URL }}"
REDIS_CACHE_URL="{{ BOOKWYRM_REDIS_CACHE_URL }}"
CACHE_URL="{{ BOOKWYRM_REDIS_CACHE_URL }}"
DJANGO_REDIS_URL="{{ BOOKWYRM_REDIS_CACHE_URL }}"
## Broker
BROKER_URL="{{ BOOKWYRM_BROKER_URL }}"
REDIS_BROKER_URL="{{ BOOKWYRM_REDIS_BROKER_URL }}" REDIS_BROKER_URL="{{ BOOKWYRM_REDIS_BROKER_URL }}"
REDIS_CACHE_URL="{{ BOOKWYRM_REDIS_BASE_URL }}/1" REDIS_BROKER_HOST="{{ BOOKWYRM_REDIS_HOST }}"
REDIS_BROKER_PORT="{{ BOOKWYRM_REDIS_PORT }}"
REDIS_BROKER_DB_INDEX="{{ BOOKWYRM_REDIS_BROKER_DB }}"
CELERY_BROKER_URL="{{ BOOKWYRM_REDIS_BROKER_URL }}" CELERY_BROKER_URL="{{ BOOKWYRM_REDIS_BROKER_URL }}"
## Activity
REDIS_ACTIVITY_HOST="{{ BOOKWYRM_REDIS_HOST }}"
REDIS_ACTIVITY_PORT="{{ BOOKWYRM_REDIS_PORT }}"
REDIS_ACTIVITY_DB_INDEX="{{ BOOKWYRM_REDIS_ACTIVITY_DB }}"
REDIS_ACTIVITY_URL="{{ BOOKWYRM_REDIS_ACTIVITY_URL }}"
# Proxy (if BookWyrm sits behind reverse proxy) # Proxy (if BookWyrm sits behind reverse proxy)
FORWARDED_ALLOW_IPS="*" FORWARDED_ALLOW_IPS="*"
USE_X_FORWARDED_HOST="true" USE_X_FORWARDED_HOST="true"
SECURE_PROXY_SSL_HEADER="HTTP_X_FORWARDED_PROTO,{{ WEB_PROTOCOL }}" SECURE_PROXY_SSL_HEADER="{{ (WEB_PORT == 443) | string | lower }}"
# OIDC (optional only if BOOKWYRM_OIDC_ENABLED) # OIDC (optional only if BOOKWYRM_OIDC_ENABLED)
{% if BOOKWYRM_OIDC_ENABLED %} {% if BOOKWYRM_OIDC_ENABLED %}

View File

@@ -45,6 +45,12 @@ BOOKWYRM_REDIS_HOST: "redis"
BOOKWYRM_REDIS_PORT: 6379 BOOKWYRM_REDIS_PORT: 6379
BOOKWYRM_REDIS_BASE_URL: "redis://{{ BOOKWYRM_REDIS_HOST }}:{{ BOOKWYRM_REDIS_PORT }}" BOOKWYRM_REDIS_BASE_URL: "redis://{{ BOOKWYRM_REDIS_HOST }}:{{ BOOKWYRM_REDIS_PORT }}"
BOOKWYRM_REDIS_BROKER_URL: "{{ BOOKWYRM_REDIS_BASE_URL }}/0" BOOKWYRM_REDIS_BROKER_URL: "{{ BOOKWYRM_REDIS_BASE_URL }}/0"
BOOKWYRM_REDIS_CACHE_URL: "{{ BOOKWYRM_REDIS_BASE_URL }}/1"
BOOKWYRM_REDIS_BROKER_DB: 0
BOOKWYRM_REDIS_ACTIVITY_DB: 1
BOOKWYRM_BROKER_URL: "{{ BOOKWYRM_REDIS_BROKER_URL }}"
BOOKWYRM_REDIS_ACTIVITY_URL: "{{ BOOKWYRM_REDIS_CACHE_URL }}"
#BOOKWYRM_CACHE_URL: "{{ BOOKWYRM_REDIS_CACHE_URL }}"
# Email # Email
EMAIL_HOST: "{{ SYSTEM_EMAIL.HOST }}" EMAIL_HOST: "{{ SYSTEM_EMAIL.HOST }}"

View File

@@ -17,7 +17,7 @@ The role builds a minimal custom image on top of the official Confluence image,
* **JVM Auto-Tuning:** `JVM_MINIMUM_MEMORY` / `JVM_MAXIMUM_MEMORY` computed from host memory with upper bounds. * **JVM Auto-Tuning:** `JVM_MINIMUM_MEMORY` / `JVM_MAXIMUM_MEMORY` computed from host memory with upper bounds.
* **Health Checks:** Curl-based container healthcheck for early failure detection. * **Health Checks:** Curl-based container healthcheck for early failure detection.
* **CSP & Canonical Domains:** Hooks into platform CSP/SSL/domain management to keep policies strict and URLs stable. * **CSP & Canonical Domains:** Hooks into platform CSP/SSL/domain management to keep policies strict and URLs stable.
* **Backup Friendly:** Data isolated under `/var/atlassian/application-data/confluence`. * **Backup Friendly:** Data isolated under `{{ CONFLUENCE_HOME }}`.
## Further Resources ## Further Resources

View File

@@ -20,7 +20,11 @@ features:
server: server:
csp: csp:
whitelist: {} whitelist: {}
flags: {} flags:
script-src-elem:
unsafe-inline: true
script-src:
unsafe-inline: true
domains: domains:
canonical: canonical:
- "confluence.{{ PRIMARY_DOMAIN }}" - "confluence.{{ PRIMARY_DOMAIN }}"

View File

@@ -4,5 +4,7 @@ FROM "{{ CONFLUENCE_IMAGE }}:{{ CONFLUENCE_VERSION }}"
# COPY ./plugins/atlassian-sso-dc-latest.obr /opt/atlassian/confluence/confluence/WEB-INF/atlassian-bundled-plugins/ # COPY ./plugins/atlassian-sso-dc-latest.obr /opt/atlassian/confluence/confluence/WEB-INF/atlassian-bundled-plugins/
# Ensure proper permissions for app data # Ensure proper permissions for app data
RUN mkdir -p /var/atlassian/application-data/confluence && \ RUN mkdir -p {{ CONFLUENCE_HOME }} && \
chown -R 2001:2001 /var/atlassian/application-data/confluence chown -R 2001:2001 {{ CONFLUENCE_HOME }}
RUN printf "confluence.home={{ CONFLUENCE_HOME }}\n" \
> /opt/atlassian/confluence/confluence/WEB-INF/classes/confluence-init.properties

View File

@@ -9,7 +9,7 @@
ports: ports:
- "127.0.0.1:{{ ports.localhost.http[application_id] }}:8090" - "127.0.0.1:{{ ports.localhost.http[application_id] }}:8090"
volumes: volumes:
- 'data:/var/atlassian/application-data/confluence' - 'data:{{ CONFLUENCE_HOME }}'
{% include 'roles/docker-container/templates/healthcheck/curl.yml.j2' %} {% include 'roles/docker-container/templates/healthcheck/curl.yml.j2' %}
{% include 'roles/docker-container/templates/base.yml.j2' %} {% include 'roles/docker-container/templates/base.yml.j2' %}
{% include 'roles/docker-container/templates/depends_on/dmbs_excl.yml.j2' %} {% include 'roles/docker-container/templates/depends_on/dmbs_excl.yml.j2' %}

View File

@@ -1,6 +1,6 @@
## Confluence core ## Confluence core
CONFLUENCE_URL="{{ CONFLUENCE_URL }}" CONFLUENCE_URL="{{ CONFLUENCE_URL }}"
CONFLUENCE_HOME="{{ CONFLUENCE_HOME }}"
ATL_PROXY_NAME={{ CONFLUENCE_HOSTNAME }} ATL_PROXY_NAME={{ CONFLUENCE_HOSTNAME }}
ATL_PROXY_PORT={{ WEB_PORT }} ATL_PROXY_PORT={{ WEB_PORT }}
@@ -9,15 +9,17 @@ ATL_TOMCAT_SECURE={{ (WEB_PORT == 443) | lower }}
JVM_MINIMUM_MEMORY={{ CONFLUENCE_JVM_MIN }} JVM_MINIMUM_MEMORY={{ CONFLUENCE_JVM_MIN }}
JVM_MAXIMUM_MEMORY={{ CONFLUENCE_JVM_MAX }} JVM_MAXIMUM_MEMORY={{ CONFLUENCE_JVM_MAX }}
JVM_SUPPORT_RECOMMENDED_ARGS=-Datlassian.home={{ CONFLUENCE_HOME }}
## Database ## Database
ATL_DB_TYPE=postgres72 ATL_DB_TYPE=postgresql
ATL_DB_DRIVER=org.postgresql.Driver ATL_DB_DRIVER=org.postgresql.Driver
ATL_JDBC_URL=jdbc:postgresql://{{ database_host }}:{{ database_port }}/{{ database_name }} ATL_JDBC_URL=jdbc:postgresql://{{ database_host }}:{{ database_port }}/{{ database_name }}
ATL_JDBC_USER={{ database_username }} ATL_JDBC_USER={{ database_username }}
ATL_JDBC_PASSWORD={{ database_password }} ATL_JDBC_PASSWORD={{ database_password }}
## OIDC
{% if CONFLUENCE_OIDC_ENABLED %} {% if CONFLUENCE_OIDC_ENABLED %}
## OIDC
CONFLUENCE_OIDC_TITLE="{{ CONFLUENCE_OIDC_LABEL | replace('\"','\\\"') }}" CONFLUENCE_OIDC_TITLE="{{ CONFLUENCE_OIDC_LABEL | replace('\"','\\\"') }}"
CONFLUENCE_OIDC_ISSUER="{{ CONFLUENCE_OIDC_ISSUER }}" CONFLUENCE_OIDC_ISSUER="{{ CONFLUENCE_OIDC_ISSUER }}"
CONFLUENCE_OIDC_AUTHORIZATION_ENDPOINT="{{ CONFLUENCE_OIDC_AUTH_URL }}" CONFLUENCE_OIDC_AUTHORIZATION_ENDPOINT="{{ CONFLUENCE_OIDC_AUTH_URL }}"

View File

@@ -11,6 +11,7 @@ container_hostname: "{{ domains | get_domain(application_id) }}"
## URLs ## URLs
CONFLUENCE_URL: "{{ domains | get_url(application_id, WEB_PROTOCOL) }}" CONFLUENCE_URL: "{{ domains | get_url(application_id, WEB_PROTOCOL) }}"
CONFLUENCE_HOSTNAME: "{{ container_hostname }}" CONFLUENCE_HOSTNAME: "{{ container_hostname }}"
CONFLUENCE_HOME: "/var/atlassian/application-data/confluence"
## OIDC ## OIDC
CONFLUENCE_OIDC_ENABLED: "{{ applications | get_app_conf(application_id, 'features.oidc') }}" CONFLUENCE_OIDC_ENABLED: "{{ applications | get_app_conf(application_id, 'features.oidc') }}"

View File

@@ -21,7 +21,11 @@ features:
server: server:
csp: csp:
whitelist: {} whitelist: {}
flags: {} flags:
script-src-elem:
unsafe-inline: true
script-src:
unsafe-inline: true
domains: domains:
canonical: canonical:
- "jira.{{ PRIMARY_DOMAIN }}" - "jira.{{ PRIMARY_DOMAIN }}"