From 6ecb27a9bbdb6079e2c9c1cc676e3e6b9a95c0a9 Mon Sep 17 00:00:00 2001 From: Reto Galante Date: Mon, 2 Sep 2024 18:15:30 +0200 Subject: [PATCH] Use solution files --- content/en/docs/03/Caddyfile-docker | 11 --- content/en/docs/03/_index.md | 8 +-- content/en/docs/03/config.py | 107 ---------------------------- 3 files changed, 4 insertions(+), 122 deletions(-) delete mode 100644 content/en/docs/03/Caddyfile-docker delete mode 100644 content/en/docs/03/config.py diff --git a/content/en/docs/03/Caddyfile-docker b/content/en/docs/03/Caddyfile-docker deleted file mode 100644 index d6a4ec1..0000000 --- a/content/en/docs/03/Caddyfile-docker +++ /dev/null @@ -1,11 +0,0 @@ -# SPDX-FileCopyrightText: 2023 Marlon W (Mawoka) -# -# SPDX-License-Identifier: MPL-2.0 - -:8080 { - reverse_proxy * http://frontend:3000 - reverse_proxy /api/* http://api:8081 - reverse_proxy /openapi.json http://api:8081 # Only use if you need to serve the OpenAPI spec - reverse_proxy /socket.io/* http://api:8081 - -} diff --git a/content/en/docs/03/_index.md b/content/en/docs/03/_index.md index db84b7c..01c289b 100644 --- a/content/en/docs/03/_index.md +++ b/content/en/docs/03/_index.md @@ -21,8 +21,8 @@ Fortunately, there is a free open-source quiz app called [ClassQuiz](https://cla It allows the creation of shareable, fully customizable quizzes and surveys.\ The app is split in a frontend and an api part: -* The frontend is written in type script and uses a redis memcache. -* The backend is mostly written in python, uses a postgreSQL database and meilisearch. +* The frontend is written in type script and uses a Redis memcache. +* The backend is mostly written in python, uses a PostgreSQL database and Meilisearch. Caddy is used as reverse proxy to keep the parts together. @@ -61,7 +61,7 @@ If patching does not work, overwrite the file `classquiz/config.py` with the con {{< details title="show final config.py file" >}} -{{< readfile file="config.py" code="true" lang="Python" >}} +{{< readfile file="solution/config.py" code="true" lang="Python" >}} {{< /details >}} @@ -82,7 +82,7 @@ If patching does not work, overwrite the file `Caddyfile-docker` with the conten {{< details title="show final Caddyfile-docker file" >}} -{{< readfile file="Caddyfile-docker" code="true" >}} +{{< readfile file="solution/Caddyfile-docker" code="true" >}} {{< /details >}} diff --git a/content/en/docs/03/config.py b/content/en/docs/03/config.py deleted file mode 100644 index fbc66d5..0000000 --- a/content/en/docs/03/config.py +++ /dev/null @@ -1,107 +0,0 @@ -# SPDX-FileCopyrightText: 2023 Marlon W (Mawoka) -# -# SPDX-License-Identifier: MPL-2.0 - -import re -from functools import lru_cache - -from redis import asyncio as redis_lib -import redis as redis_base_lib -from pydantic import BaseSettings, RedisDsn, PostgresDsn, BaseModel -import meilisearch as MeiliSearch -from typing import Optional -from arq import create_pool -from arq.connections import RedisSettings, ArqRedis - -from classquiz.storage import Storage - - -class CustomOpenIDProvider(BaseModel): - scopes: str = "openid email profile" - server_metadata_url: str - client_id: str - client_secret: str - - -class Settings(BaseSettings): - """ - Settings class for the shop app. - """ - - root_address: str = "http://127.0.0.1:8000" - redis: RedisDsn = "redis://redisd:6379/0?decode_responses=True" - skip_email_verification: bool = True - db_url: str | PostgresDsn = "postgresql://postgres:classquiz@postgresd:5432/classquiz" - hcaptcha_key: str | None = None - recaptcha_key: str | None = None - mail_address: str = "some@example.org" - mail_password: str = "some@example.org" - mail_username: str = "some@example.org" - mail_server: str = "some.example.org" - mail_port: int = "525" - secret_key: str = "secret" - access_token_expire_minutes: int = 30 - cache_expiry: int = 86400 - sentry_dsn: str | None - meilisearch_url: str = "http://meilisearchd:7700" - meilisearch_index: str = "classquiz" - google_client_id: Optional[str] - google_client_secret: Optional[str] - github_client_id: Optional[str] - github_client_secret: Optional[str] - custom_openid_provider: CustomOpenIDProvider | None = None - telemetry_enabled: bool = True - free_storage_limit: int = 1074000000 - pixabay_api_key: str | None = None - mods: list[str] = [] - registration_disabled: bool = False - - # storage_backend - storage_backend: str | None = "local" - - # if storage_backend == "local": - storage_path: str | None = "/app/data" - - # if storage_backend == "s3": - s3_access_key: str | None - s3_secret_key: str | None - s3_bucket_name: str = "classquiz" - s3_base_url: str | None - - class Config: - env_file = ".env" - env_file_encoding = "utf-8" - env_nested_delimiter = "__" - - -async def initialize_arq(): - # skipcq: PYL-W0603 - global arq - arq = await create_pool(RedisSettings.from_dsn(settings.redis)) - - -@lru_cache() -def settings() -> Settings: - return Settings() - - -pool = redis_lib.ConnectionPool().from_url(settings().redis) - -redis: redis_base_lib.client.Redis = redis_lib.Redis(connection_pool=pool) -arq: ArqRedis = ArqRedis(pool_or_conn=pool) -storage: Storage = Storage( - backend=settings().storage_backend, - storage_path=settings().storage_path, - access_key=settings().s3_access_key, - secret_key=settings().s3_secret_key, - bucket_name=settings().s3_bucket_name, - base_url=settings().s3_base_url, -) - -meilisearch = MeiliSearch.Client(settings().meilisearch_url) - -ALLOWED_TAGS_FOR_QUIZ = ["b", "strong", "i", "em", "small", "mark", "del", "sub", "sup"] - -ALLOWED_MIME_TYPES = ["image/png", "video/mp4", "image/jpeg", "image/gif", "image/webp"] - -server_regex = rf"^{re.escape(settings().root_address)}/api/v1/storage/download/.{{36}}--.{{36}}$"