mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-09-09 11:47:14 +02:00
Implement initial BookWyrm role
- Removed obsolete TODO.md - Added config/main.yml with service, feature, CSP, and registration settings - Added schema/main.yml defining vaulted SECRET_KEY (alphanumeric) - Added tasks/main.yml to load stateful stack - Added Dockerfile.j2 ensuring data/media dirs - Added docker-compose.yml.j2 with application, worker, redis, volumes - Added env.j2 with registration, secrets, DB, Redis, OIDC support - Extended vars/main.yml with BookWyrm variables and OIDC, Docker, Redis settings - Updated meta/main.yml with logo and run_after dependencies Ref: https://chatgpt.com/share/68b6c060-3a0c-800f-89f8-e114a16a4a80
This commit is contained in:
@@ -1,2 +0,0 @@
|
|||||||
# Todo
|
|
||||||
- Implement https://joinbookwyrm.com/de/
|
|
37
roles/web-app-bookwyrm/config/main.yml
Normal file
37
roles/web-app-bookwyrm/config/main.yml
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
credentials: {}
|
||||||
|
docker:
|
||||||
|
services:
|
||||||
|
database:
|
||||||
|
enabled: true
|
||||||
|
redis:
|
||||||
|
enabled: true
|
||||||
|
application:
|
||||||
|
image: bookwyrm/bookwyrm
|
||||||
|
version: latest
|
||||||
|
name: bookwyrm
|
||||||
|
worker:
|
||||||
|
enabled: true
|
||||||
|
volumes:
|
||||||
|
data: "bookwyrm_data"
|
||||||
|
media: "bookwyrm_media"
|
||||||
|
features:
|
||||||
|
matomo: true
|
||||||
|
css: true
|
||||||
|
desktop: true
|
||||||
|
central_database: true
|
||||||
|
logout: true
|
||||||
|
oidc: false
|
||||||
|
ldap: false
|
||||||
|
server:
|
||||||
|
csp:
|
||||||
|
whitelist: {}
|
||||||
|
flags: {}
|
||||||
|
domains:
|
||||||
|
canonical:
|
||||||
|
- "book.{{ PRIMARY_DOMAIN }}"
|
||||||
|
aliases:
|
||||||
|
- "bookwyrm.{{ PRIMARY_DOMAIN }}"
|
||||||
|
rbac:
|
||||||
|
roles: {}
|
||||||
|
registration_open: false
|
||||||
|
allow_invite_request: false
|
@@ -15,8 +15,10 @@ galaxy_info:
|
|||||||
repository: "https://s.infinito.nexus/code"
|
repository: "https://s.infinito.nexus/code"
|
||||||
issue_tracker_url: "https://s.infinito.nexus/issues"
|
issue_tracker_url: "https://s.infinito.nexus/issues"
|
||||||
documentation: "https://s.infinito.nexus/code/tree/main/roles/web-app-bookwyrm"
|
documentation: "https://s.infinito.nexus/code/tree/main/roles/web-app-bookwyrm"
|
||||||
min_ansible_version: "2.9"
|
logo:
|
||||||
platforms:
|
class: "fas fa-book"
|
||||||
- name: Any
|
run_after:
|
||||||
versions:
|
- web-app-matomo
|
||||||
- all
|
- web-app-keycloak
|
||||||
|
- web-app-mailu
|
||||||
|
dependencies: []
|
||||||
|
6
roles/web-app-bookwyrm/schema/main.yml
Normal file
6
roles/web-app-bookwyrm/schema/main.yml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
credentials:
|
||||||
|
secret_key:
|
||||||
|
description: "Django SECRET_KEY for BookWyrm"
|
||||||
|
algorithm: "alphanumeric" # uses generate_value('alphanumeric') → 64 random a-zA-Z0-9
|
||||||
|
validation:
|
||||||
|
min_length: 50 # Django recommends ≥50 characters
|
7
roles/web-app-bookwyrm/tasks/main.yml
Normal file
7
roles/web-app-bookwyrm/tasks/main.yml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
- block:
|
||||||
|
- name: "load docker, db/redis and proxy for {{ application_id }}"
|
||||||
|
include_role:
|
||||||
|
name: sys-stk-full-stateful
|
||||||
|
- include_tasks: utils/run_once.yml
|
||||||
|
when: run_once_web_app_bookwyrm is not defined
|
7
roles/web-app-bookwyrm/templates/Dockerfile.j2
Normal file
7
roles/web-app-bookwyrm/templates/Dockerfile.j2
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
FROM "{{ BOOKWYRM_IMAGE }}:{{ BOOKWYRM_VERSION }}"
|
||||||
|
|
||||||
|
# Place for optional plugins/patches
|
||||||
|
# COPY ./patches/ /app/patches/
|
||||||
|
|
||||||
|
# Ensure media/data exist (UID/GID depend on upstream; keep generic)
|
||||||
|
RUN mkdir -p /app/data /app/media && chown -R 1000:1000 /app/data /app/media
|
40
roles/web-app-bookwyrm/templates/docker-compose.yml.j2
Normal file
40
roles/web-app-bookwyrm/templates/docker-compose.yml.j2
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{% include 'roles/docker-compose/templates/base.yml.j2' %}
|
||||||
|
|
||||||
|
application:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: "{{ BOOKWYRM_CUSTOM_IMAGE }}"
|
||||||
|
container_name: "{{ BOOKWYRM_CONTAINER }}"
|
||||||
|
hostname: "{{ BOOKWYRM_HOSTNAME }}"
|
||||||
|
ports:
|
||||||
|
- "127.0.0.1:{{ ports.localhost.http[application_id] }}:{{ container_port }}"
|
||||||
|
environment:
|
||||||
|
{% include 'roles/web-app-bookwyrm/templates/env.j2' %}
|
||||||
|
volumes:
|
||||||
|
- 'data:/app/data'
|
||||||
|
- 'media:/app/media'
|
||||||
|
{% include 'roles/docker-container/templates/healthcheck/curl.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/networks.yml.j2' %}
|
||||||
|
|
||||||
|
worker:
|
||||||
|
image: "{{ BOOKWYRM_CUSTOM_IMAGE }}"
|
||||||
|
container_name: "{{ BOOKWYRM_CONTAINER }}-worker"
|
||||||
|
command: "bash -lc 'celery -A celerywyrm worker -l INFO'"
|
||||||
|
environment:
|
||||||
|
{% include 'roles/web-app-bookwyrm/templates/env.j2' %}
|
||||||
|
volumes:
|
||||||
|
- 'data:/app/data'
|
||||||
|
- 'media:/app/media'
|
||||||
|
{% include 'roles/docker-container/templates/depends_on/dmbs_excl.yml.j2' %}
|
||||||
|
{% include 'roles/docker-container/templates/networks.yml.j2' %}
|
||||||
|
|
||||||
|
{% include 'roles/docker-compose/templates/volumes.yml.j2' %}
|
||||||
|
data:
|
||||||
|
name: {{ BOOKWYRM_DATA_VOLUME }}
|
||||||
|
media:
|
||||||
|
name: {{ BOOKWYRM_MEDIA_VOLUME }}
|
||||||
|
|
||||||
|
{% include 'roles/docker-compose/templates/networks.yml.j2' %}
|
40
roles/web-app-bookwyrm/templates/env.j2
Normal file
40
roles/web-app-bookwyrm/templates/env.j2
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# Core
|
||||||
|
BOOKWYRM_URL="{{ BOOKWYRM_URL }}"
|
||||||
|
DOMAIN="{{ BOOKWYRM_HOSTNAME }}"
|
||||||
|
PORT="{{ WEB_PORT }}"
|
||||||
|
WEB_PROTOCOL="{{ WEB_PROTOCOL }}"
|
||||||
|
MEDIA_ROOT="/app/media"
|
||||||
|
DATA_ROOT="/app/data"
|
||||||
|
REGISTRATION_OPEN={{ BOOKWYRM_REGISTRATION_OPEN }}
|
||||||
|
ALLOW_INVITE_REQUESTS={{ BOOKWYRM_ALLOW_INVITE_REQUESTS }}
|
||||||
|
|
||||||
|
# Django/Secrets (provide via vault/env in production)
|
||||||
|
SECRET_KEY="{{ BOOKWYRM_SECRET_KEY }}"
|
||||||
|
EMAIL="{{ users['no-reply'].email }}"
|
||||||
|
|
||||||
|
# Database
|
||||||
|
DATABASE_URL="postgres://{{ database_username }}:{{ database_password }}@{{ database_host }}:{{ database_port }}/{{ database_name }}"
|
||||||
|
|
||||||
|
# Redis / Celery
|
||||||
|
REDIS_BROKER_URL="redis://{{ BOOKWYRM_REDIS_HOST }}:{{ BOOKWYRM_REDIS_PORT }}/0"
|
||||||
|
REDIS_CACHE_URL="redis://{{ BOOKWYRM_REDIS_HOST }}:{{ BOOKWYRM_REDIS_PORT }}/1"
|
||||||
|
|
||||||
|
# Proxy (if BookWyrm sits behind reverse proxy)
|
||||||
|
FORWARDED_ALLOW_IPS="*"
|
||||||
|
USE_X_FORWARDED_HOST="true"
|
||||||
|
SECURE_PROXY_SSL_HEADER="HTTP_X_FORWARDED_PROTO,{{ WEB_PROTOCOL }}"
|
||||||
|
|
||||||
|
# OIDC (optional – only if BOOKWYRM_OIDC_ENABLED)
|
||||||
|
{% if BOOKWYRM_OIDC_ENABLED %}
|
||||||
|
OIDC_TITLE="{{ BOOKWYRM_OIDC_LABEL | replace('\"','\\\"') }}"
|
||||||
|
OIDC_ISSUER="{{ BOOKWYRM_OIDC_ISSUER }}"
|
||||||
|
OIDC_AUTHORIZATION_ENDPOINT="{{ BOOKWYRM_OIDC_AUTH_URL }}"
|
||||||
|
OIDC_TOKEN_ENDPOINT="{{ BOOKWYRM_OIDC_TOKEN_URL }}"
|
||||||
|
OIDC_USERINFO_ENDPOINT="{{ BOOKWYRM_OIDC_USERINFO_URL }}"
|
||||||
|
OIDC_END_SESSION_ENDPOINT="{{ BOOKWYRM_OIDC_LOGOUT_URL }}"
|
||||||
|
OIDC_JWKS_URI="{{ BOOKWYRM_OIDC_JWKS_URL }}"
|
||||||
|
OIDC_CLIENT_ID="{{ BOOKWYRM_OIDC_CLIENT_ID }}"
|
||||||
|
OIDC_CLIENT_SECRET="{{ BOOKWYRM_OIDC_CLIENT_SECRET }}"
|
||||||
|
OIDC_SCOPES="{{ BOOKWYRM_OIDC_SCOPES }}"
|
||||||
|
OIDC_UNIQUE_ATTRIBUTE="{{ BOOKWYRM_OIDC_UNIQUE_ATTRIBUTE }}"
|
||||||
|
{% endif %}
|
@@ -1 +1,45 @@
|
|||||||
application_id: web-app-bookwyrm
|
# General
|
||||||
|
application_id: "web-app-bookwyrm"
|
||||||
|
database_type: "postgres"
|
||||||
|
|
||||||
|
# Container
|
||||||
|
container_port: 8000
|
||||||
|
container_hostname: "{{ domains | get_domain(application_id) }}"
|
||||||
|
|
||||||
|
# BookWyrm
|
||||||
|
|
||||||
|
BOOKWYRM_REGISTRATION_OPEN: "{{ applications | get_app_conf(application_id, 'registration_open') | string | lower }}"
|
||||||
|
BOOKWYRM_ALLOW_INVITE_REQUESTS: "{{ applications | get_app_conf(application_id, 'allow_invite_request') | string | lower }}"
|
||||||
|
|
||||||
|
## Credentrials
|
||||||
|
BOOKWYRM_SECRET_KEY: "{{ applications | get_app_conf(application_id, 'credentials.secret_key') }}"
|
||||||
|
|
||||||
|
## URLs
|
||||||
|
BOOKWYRM_URL: "{{ domains | get_url(application_id, WEB_PROTOCOL) }}"
|
||||||
|
BOOKWYRM_HOSTNAME: "{{ container_hostname }}"
|
||||||
|
|
||||||
|
## OIDC (optional; can be fronted by oauth2-proxy or native if you wire it)
|
||||||
|
BOOKWYRM_OIDC_ENABLED: "{{ applications | get_app_conf(application_id, 'features.oidc') }}"
|
||||||
|
BOOKWYRM_OIDC_LABEL: "{{ OIDC.BUTTON_TEXT }}"
|
||||||
|
BOOKWYRM_OIDC_CLIENT_ID: "{{ OIDC.CLIENT.ID }}"
|
||||||
|
BOOKWYRM_OIDC_CLIENT_SECRET: "{{ OIDC.CLIENT.SECRET }}"
|
||||||
|
BOOKWYRM_OIDC_ISSUER: "{{ OIDC.CLIENT.ISSUER_URL }}"
|
||||||
|
BOOKWYRM_OIDC_AUTH_URL: "{{ OIDC.CLIENT.AUTHORIZE_URL }}"
|
||||||
|
BOOKWYRM_OIDC_TOKEN_URL: "{{ OIDC.CLIENT.TOKEN_URL }}"
|
||||||
|
BOOKWYRM_OIDC_USERINFO_URL: "{{ OIDC.CLIENT.USER_INFO_URL }}"
|
||||||
|
BOOKWYRM_OIDC_LOGOUT_URL: "{{ OIDC.CLIENT.LOGOUT_URL }}"
|
||||||
|
BOOKWYRM_OIDC_JWKS_URL: "{{ OIDC.CLIENT.CERTS }}"
|
||||||
|
BOOKWYRM_OIDC_SCOPES: "openid,email,profile"
|
||||||
|
BOOKWYRM_OIDC_UNIQUE_ATTRIBUTE: "{{ OIDC.ATTRIBUTES.USERNAME }}"
|
||||||
|
|
||||||
|
## Docker
|
||||||
|
BOOKWYRM_VERSION: "{{ applications | get_app_conf(application_id, 'docker.services.application.version') }}"
|
||||||
|
BOOKWYRM_IMAGE: "{{ applications | get_app_conf(application_id, 'docker.services.application.image') | default('bookwyrm/bookwyrm') }}"
|
||||||
|
BOOKWYRM_CONTAINER: "{{ applications | get_app_conf(application_id, 'docker.services.application.name') | default('bookwyrm') }}"
|
||||||
|
BOOKWYRM_DATA_VOLUME: "{{ applications | get_app_conf(application_id, 'docker.volumes.data') | default('bookwyrm_data') }}"
|
||||||
|
BOOKWYRM_MEDIA_VOLUME: "{{ applications | get_app_conf(application_id, 'docker.volumes.media') | default('bookwyrm_media') }}"
|
||||||
|
BOOKWYRM_CUSTOM_IMAGE: "{{ BOOKWYRM_IMAGE }}_custom"
|
||||||
|
|
||||||
|
## Redis
|
||||||
|
BOOKWYRM_REDIS_HOST: "redis"
|
||||||
|
BOOKWYRM_REDIS_PORT: 6379
|
||||||
|
Reference in New Issue
Block a user