From b627e976871a93ed490c70695a54d4d7d5e99fdb Mon Sep 17 00:00:00 2001 From: Trammell Hudson Date: Sat, 3 Dec 2022 16:07:03 +0000 Subject: [PATCH] bookwyrm: support federated book review with OIDC hacks --- Makefile | 1 + bookwyrm.yaml | 144 +++++++++++++++++++++++++++++++++++++++++++ bookwyrm/env | 102 ++++++++++++++++++++++++++++++ bookwyrm/keycloak.sh | 7 +++ bookwyrm/nginx.conf | 79 ++++++++++++++++++++++++ bookwyrm/redis.conf | 9 +++ env.production | 2 + 7 files changed, 344 insertions(+) create mode 100644 bookwyrm.yaml create mode 100644 bookwyrm/env create mode 100755 bookwyrm/keycloak.sh create mode 100644 bookwyrm/nginx.conf create mode 100644 bookwyrm/redis.conf diff --git a/Makefile b/Makefile index 90edc1f..f63ea4d 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ MODULES += mobilizon MODULES += gitea MODULES += nitter MODULES += pixelfed +MODULES += bookwyrm include env.production domain_name := $(DOMAIN_NAME) diff --git a/bookwyrm.yaml b/bookwyrm.yaml new file mode 100644 index 0000000..a2dbb94 --- /dev/null +++ b/bookwyrm.yaml @@ -0,0 +1,144 @@ +version: '3' + +services: + bookwyrm-db: + container_name: bookwyrm-db + image: postgres + env_file: bookwyrm/env + volumes: + - ./data/bookwyrm/pgdata:/var/lib/postgresql/data + + bookwyrm-redis_activity: + container_name: bookwyrm-redis_activity + image: redis + env_file: bookwyrm/env + command: redis-server --requirepass redispassword123 --appendonly yes + volumes: + - ./bookwyrm/redis.conf:/etc/redis/redis.conf:ro + - ./data/bookwyrm/redis_activity_data:/data + restart: on-failure + + bookwyrm-redis_broker: + container_name: bookwyrm-redis_broker + image: redis + command: redis-server --requirepass redispassword123 --appendonly yes + env_file: bookwyrm/env + volumes: + - ./bookwyrm/redis.conf:/etc/redis/redis.conf:ro + - ./data/bookwyrm/redis_broker_data:/data + restart: on-failure + + bookwyrm-web: + container_name: bookwyrm-web + image: osresearch/bookwyrm:oidc + command: python manage.py runserver 0.0.0.0:8000 + env_file: bookwyrm/env + volumes: + - ./data/bookwyrm/static_volume:/app/static + - ./data/bookwyrm/media_volume:/app/images + environment: + - DB_INIT=True + - DOMAIN=${BOOKWYRM_HOSTNAME}.${DOMAIN_NAME} + - EMAIL=books@${DOMAIN_NAME} + - EMAIL_HOST=${SMTP_SERVER} + - EMAIL_PORT=${SMTP_PORT} + - EMAIL_HOST_USER=${SMTP_USER} + - EMAIL_HOST_PASSWORD=${SMTP_PASSWORD} + - EMAIL_USE_TLS=true + - EMAIL_USE_SSL=false + - EMAIL_SENDER_NAME=books + - EMAIL_SENDER_DOMAIN=${DOMAIN_NAME} + - OIDC_ENABLED=true + - OIDC_CLIENT_ID=bookwyrm + - OIDC_CLIENT_SECRET=${BOOKWYRM_CLIENT_SECRET} + - OIDC_OP_BASE_URL=${KEYCLOAK_BASE_URL} + depends_on: + - bookwyrm-db + - bookwyrm-celery_worker + - bookwyrm-redis_activity + + bookwyrm-celery_worker: + container_name: bookwyrm-worker + image: osresearch/bookwyrm:oidc + command: celery -A celerywyrm worker -l info -Q high_priority,medium_priority,low_priority + env_file: bookwyrm/env + volumes: + - ./data/bookwyrm/static_volume:/app/static + - ./data/bookwyrm/media_volume:/app/images + environment: + - DOMAIN=${BOOKWYRM_HOSTNAME}.${DOMAIN_NAME} + - EMAIL=books@${DOMAIN_NAME} + - EMAIL_HOST=${SMTP_SERVER} + - EMAIL_PORT=${SMTP_PORT} + - EMAIL_HOST_USER=${SMTP_USER} + - EMAIL_HOST_PASSWORD=${SMTP_PASSWORD} + - EMAIL_USE_TLS=true + - EMAIL_USE_SSL=false + - EMAIL_SENDER_NAME=books + - EMAIL_SENDER_DOMAIN=${DOMAIN_NAME} + depends_on: + - bookwyrm-db + - bookwyrm-redis_broker + restart: on-failure + + bookwyrm-celery_beat: + container_name: bookwyrm-beat + image: osresearch/bookwyrm:oidc + command: celery -A celerywyrm beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler + env_file: bookwyrm/env + volumes: + - ./data/bookwyrm/static_volume:/app/static + - ./data/bookwyrm/media_volume:/app/images + environment: + - DOMAIN=${BOOKWYRM_HOSTNAME}.${DOMAIN_NAME} + - EMAIL=books@${DOMAIN_NAME} + - EMAIL_HOST=${SMTP_SERVER} + - EMAIL_PORT=${SMTP_PORT} + - EMAIL_HOST_USER=${SMTP_USER} + - EMAIL_HOST_PASSWORD=${SMTP_PASSWORD} + - EMAIL_USE_TLS=true + - EMAIL_USE_SSL=false + - EMAIL_SENDER_NAME=books + - EMAIL_SENDER_DOMAIN=${DOMAIN_NAME} + depends_on: + - bookwyrm-celery_worker + restart: on-failure + + bookwyrm-flower: + container_name: bookwyrm-flower + image: osresearch/bookwyrm:oidc + command: celery -A celerywyrm flower --basic_auth=admin:${BOOKWYRM_ADMIN_PASSWORD} + env_file: bookwyrm/env +# ports: +# - ${FLOWER_PORT}:${FLOWER_PORT} + volumes: + - ./data/bookwyrm/static_volume:/app/static + - ./data/bookwyrm/media_volume:/app/images + environment: + - DOMAIN=${BOOKWYRM_HOSTNAME}.${DOMAIN_NAME} + - EMAIL=books@${DOMAIN_NAME} + - EMAIL_HOST=${SMTP_SERVER} + - EMAIL_PORT=${SMTP_PORT} + - EMAIL_HOST_USER=${SMTP_USER} + - EMAIL_HOST_PASSWORD=${SMTP_PASSWORD} + - EMAIL_USE_TLS=true + - EMAIL_USE_SSL=false + - EMAIL_SENDER_NAME=books + - EMAIL_SENDER_DOMAIN=${DOMAIN_NAME} + depends_on: + - bookwyrm-db + - bookwyrm-redis_broker + restart: on-failure + + nginx: + volumes: + - ./bookwyrm/nginx.conf:/etc/nginx/templates/bookwyrm.conf.template:ro + - ./data/bookwyrm/static_volume:/bookwyrm/app/static:ro + - ./data/bookwyrm/media_volume:/bookwyrm/app/images:ro + + # add the subdomain client secrets to the keycloak-setup volume + keycloak: + volumes: + - ./bookwyrm/keycloak.sh:/keycloak-setup/bookwyrm.sh:ro + - ./data/bookwyrm/secrets:/run/secrets/bookwyrm:ro + diff --git a/bookwyrm/env b/bookwyrm/env new file mode 100644 index 0000000..a58eab6 --- /dev/null +++ b/bookwyrm/env @@ -0,0 +1,102 @@ +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY="7(2w1sedok=aznpq)ta1mc4i%4h=xx@hxwx*o57ctsuml0x%fr" + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG=false +USE_HTTPS=true + +# Instance defualt language (see options at bookwyrm/settings.py "LANGUAGES" +LANGUAGE_CODE="en-us" +# Used for deciding which editions to prefer +DEFAULT_LANGUAGE="English" + +## Leave unset to allow all hosts +# ALLOWED_HOSTS="localhost,127.0.0.1,[::1]" + +MEDIA_ROOT=images/ + +# Database configuration +PGPORT=5432 +POSTGRES_PASSWORD=securedbypassword123 +POSTGRES_USER=bookwyrm +POSTGRES_DB=bookwyrm +POSTGRES_HOST=bookwyrm-db + +# Redis activity stream manager +MAX_STREAM_LENGTH=200 +REDIS_ACTIVITY_HOST=bookwyrm-redis_activity +REDIS_ACTIVITY_PASSWORD=redispassword123 +# Optional, use a different redis database (defaults to 0) +# REDIS_ACTIVITY_DB_INDEX=0 + +# Redis as celery broker +REDIS_BROKER_HOST=bookwyrm-redis_broker +REDIS_BROKER_PASSWORD=redispassword123 +# Optional, use a different redis database (defaults to 0) +# REDIS_BROKER_DB_INDEX=0 + +# Monitoring for celery +FLOWER_PORT=8888 +FLOWER_USER=admin + + +# Query timeouts +SEARCH_TIMEOUT=5 +QUERY_TIMEOUT=5 + +# Thumbnails Generation +ENABLE_THUMBNAIL_GENERATION=false + +# S3 configuration +USE_S3=false +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= + +# Commented are example values if you use a non-AWS, S3-compatible service +# AWS S3 should work with only AWS_STORAGE_BUCKET_NAME and AWS_S3_REGION_NAME +# non-AWS S3-compatible services will need AWS_STORAGE_BUCKET_NAME, +# along with both AWS_S3_CUSTOM_DOMAIN and AWS_S3_ENDPOINT_URL + +# AWS_STORAGE_BUCKET_NAME= # "example-bucket-name" +# AWS_S3_CUSTOM_DOMAIN=None # "example-bucket-name.s3.fr-par.scw.cloud" +# AWS_S3_REGION_NAME=None # "fr-par" +# AWS_S3_ENDPOINT_URL=None # "https://s3.fr-par.scw.cloud" + + +# Preview image generation can be computing and storage intensive +ENABLE_PREVIEW_IMAGES=false + +# Specify RGB tuple or RGB hex strings, +# or use_dominant_color_light / use_dominant_color_dark +PREVIEW_BG_COLOR=use_dominant_color_light +# Change to #FFF if you use use_dominant_color_dark +PREVIEW_TEXT_COLOR=#363636 +PREVIEW_IMG_WIDTH=1200 +PREVIEW_IMG_HEIGHT=630 +PREVIEW_DEFAULT_COVER_COLOR=#002549 + +# Below are example keys if you want to enable automatically +# sending telemetry to an OTLP-compatible service. Many of +# the main monitoring apps have OLTP collectors, including +# NewRelic, DataDog, and Honeycomb.io - consult their +# documentation for setup instructions, and what exactly to +# put below! +# +# Service name is an arbitrary tag that is attached to any +# data sent, used to distinguish different sources. Useful +# for sending prod and dev metrics to the same place and +# keeping them separate, for instance! + +# API endpoint for your provider +OTEL_EXPORTER_OTLP_ENDPOINT= +# Any headers required, usually authentication info +OTEL_EXPORTER_OTLP_HEADERS= +# Service name to identify your app +OTEL_SERVICE_NAME= + +# Set HTTP_X_FORWARDED_PROTO ONLY to true if you know what you are doing. +# Only use it if your proxy is "swallowing" if the original request was made +# via https. Please refer to the Django-Documentation and assess the risks +# for your instance: +# https://docs.djangoproject.com/en/3.2/ref/settings/#secure-proxy-ssl-header +HTTP_X_FORWARDED_PROTO=false diff --git a/bookwyrm/keycloak.sh b/bookwyrm/keycloak.sh new file mode 100755 index 0000000..91a2647 --- /dev/null +++ b/bookwyrm/keycloak.sh @@ -0,0 +1,7 @@ +#!/bin/bash -x + +client_id=$(client-create bookwyrm "$BOOKWYRM_HOSTNAME.$DOMAIN_NAME" "$BOOKWYRM_CLIENT_SECRET"