mirror of
				https://github.com/kevinveenbirkenbach/computer-playbook.git
				synced 2025-11-03 19:58:14 +00: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"
 | 
			
		||||
  issue_tracker_url: "https://s.infinito.nexus/issues"
 | 
			
		||||
  documentation: "https://s.infinito.nexus/code/tree/main/roles/web-app-bookwyrm"
 | 
			
		||||
  min_ansible_version: "2.9"
 | 
			
		||||
  platforms:
 | 
			
		||||
    - name: Any
 | 
			
		||||
      versions:
 | 
			
		||||
        - all
 | 
			
		||||
  logo:
 | 
			
		||||
    class: "fas fa-book"
 | 
			
		||||
  run_after:
 | 
			
		||||
    - web-app-matomo
 | 
			
		||||
    - 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