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"
 | 
					  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