From 033c13e931a728d335c0a5f1d3ebfefe60999a0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Hells=C3=A9n?= Date: Fri, 9 Jan 2026 20:28:28 +0100 Subject: [PATCH] Add Docker support; add favicon --- .dockerignore | 27 +++ .vscode/settings.json | 9 + Dockerfile | 23 +++ config/settings.py | 19 +- config/urls.py | 9 - docker-compose.yml | 18 ++ pyproject.toml | 37 ++-- start.sh | 8 + static/about.txt | 6 + static/android-chrome-192x192.png | Bin 0 -> 6944 bytes static/android-chrome-512x512.png | Bin 0 -> 23469 bytes static/apple-touch-icon.png | Bin 0 -> 6157 bytes static/favicon-16x16.png | Bin 0 -> 454 bytes static/favicon-32x32.png | Bin 0 -> 854 bytes static/favicon.ico | Bin 0 -> 15406 bytes static/site.webmanifest | 19 ++ templates/base.html | 190 +++++++++++++----- .../commands/better_import_drops.py | 6 +- 18 files changed, 264 insertions(+), 107 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100755 start.sh create mode 100644 static/about.txt create mode 100644 static/android-chrome-192x192.png create mode 100644 static/android-chrome-512x512.png create mode 100644 static/apple-touch-icon.png create mode 100644 static/favicon-16x16.png create mode 100644 static/favicon-32x32.png create mode 100644 static/favicon.ico create mode 100644 static/site.webmanifest diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..696f042 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,27 @@ +.env +.env.example +.git/ +.github/ +.pre-commit-config.yaml +.pytest_cache/ +.ruff_cache/ +.venv +.vscode/ +.vscode/ +*.json +*.log +*.py[codz] +**/__pycache__/ +*$py.class +archive/ +check_these_please/ +db.sqlite3 +db.sqlite3-journal +env.bak/ +env/ +ENV/ +responses/ +staticfiles/ +tests/ +venv.bak/ +venv/ diff --git a/.vscode/settings.json b/.vscode/settings.json index 1188f98..f4d6caa 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,6 +6,7 @@ "appauthor", "appname", "ASGI", + "botuser", "collectstatic", "colorama", "createsuperuser", @@ -16,6 +17,9 @@ "dotenv", "dropcampaign", "elif", + "filterwarnings", + "granian", + "gunicorn", "Hellsén", "hostnames", "httpx", @@ -27,14 +31,17 @@ "Mailgun", "makemigrations", "McCabe", + "noinput", "noopener", "noreferrer", "platformdirs", "prefetcher", "psutil", + "pycache", "pydantic", "pydocstyle", "pygments", + "pyproject", "pyright", "pytest", "Ravendawn", @@ -42,12 +49,14 @@ "runserver", "sendgrid", "speculationrules", + "staticfiles", "testchannel", "testpass", "tqdm", "ttvdrops", "venv", "wrongpassword", + "wsgi", "xdist" ], "python.analysis.typeCheckingMode": "standard" diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..18dfc41 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +# syntax=docker/dockerfile:1 +FROM python:3.14-slim-trixie +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ + +ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy +ENV UV_NO_DEV=1 +ENV UV_PYTHON_DOWNLOADS=0 + +WORKDIR /app +COPY . /app/ + +RUN uv sync +RUN chmod +x /app/start.sh + +ENV PATH="/app/.venv/bin:$PATH" + +HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \ + CMD curl -f http://localhost:8000/ || exit 1 + +VOLUME ["/home/root/.local/share/TTVDrops"] +EXPOSE 8000 +ENTRYPOINT [ "/app/start.sh" ] +CMD ["uv", "run", "gunicorn", "config.wsgi:application", "--workers", "27", "--bind", "0.0.0.0:8000"] diff --git a/config/settings.py b/config/settings.py index 409ad0f..dbb5ee4 100644 --- a/config/settings.py +++ b/config/settings.py @@ -6,12 +6,10 @@ import sys from pathlib import Path from typing import Any -import django_stubs_ext from dotenv import load_dotenv from platformdirs import user_data_dir logger: logging.Logger = logging.getLogger("ttvdrops.settings") -django_stubs_ext.monkeypatch() load_dotenv(verbose=True) @@ -100,7 +98,7 @@ MEDIA_ROOT: Path = DATA_DIR / "media" MEDIA_ROOT.mkdir(exist_ok=True) MEDIA_URL = "/media/" -STATIC_ROOT: Path = BASE_DIR / "staticfiles" +STATIC_ROOT: Path = DATA_DIR / "staticfiles" STATIC_ROOT.mkdir(exist_ok=True) STATIC_URL = "static/" STATICFILES_DIRS: list[Path] = [BASE_DIR / "static"] @@ -181,18 +179,3 @@ DATABASES: dict[str, dict[str, str | Path | dict[str, str]]] = { }, }, } - -TESTING: bool = "test" in sys.argv or "PYTEST_VERSION" in os.environ - -if not TESTING: - DEBUG_TOOLBAR_CONFIG: dict[str, str] = { - "ROOT_TAG_EXTRA_ATTRS": "hx-preserve", - } - INSTALLED_APPS = [ # pyright: ignore[reportConstantRedefinition] - *INSTALLED_APPS, - "debug_toolbar", - ] - MIDDLEWARE = [ # pyright: ignore[reportConstantRedefinition] - "debug_toolbar.middleware.DebugToolbarMiddleware", - *MIDDLEWARE, - ] diff --git a/config/urls.py b/config/urls.py index 84d6bf6..96da617 100644 --- a/config/urls.py +++ b/config/urls.py @@ -15,15 +15,6 @@ urlpatterns: list[URLResolver] | list[URLPattern | URLResolver] = [ # type: ign path(route="", view=include("twitch.urls", namespace="twitch")), ] -if not settings.TESTING: - # Import debug_toolbar lazily to avoid ImportError when not installed in testing environments - from debug_toolbar.toolbar import debug_toolbar_urls # pyright: ignore[reportMissingTypeStubs] - - urlpatterns = [ - *urlpatterns, - *debug_toolbar_urls(), - ] - # Serve media in development if settings.DEBUG: urlpatterns += static( diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..75b080a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,18 @@ +services: + ttvdrops: + container_name: ttvdrops + build: . + ports: + - "8000:8000" + env_file: .env + environment: + - DJANGO_SECRET_KEY=${DJANGO_SECRET_KEY?Please set DJANGO_SECRET_KEY in your environment} + - DEBUG=1 + - EMAIL_HOST=${EMAIL_HOST:-smtp.example.com} + - EMAIL_PORT=${EMAIL_PORT:-587} + - EMAIL_HOST_USER=${EMAIL_HOST_USER:-} + - EMAIL_HOST_PASSWORD=${EMAIL_HOST_PASSWORD:-} + volumes: + # Data is stored in /home/root/.local/share/TTVDrops" inside the container + - ./data:/home/root/.local/share/TTVDrops + restart: unless-stopped diff --git a/pyproject.toml b/pyproject.toml index c9b6965..d19a25a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,27 +3,24 @@ name = "ttvdrops" version = "0.1.0" description = "Get notified when a new drop is available on Twitch." readme = "README.md" -requires-python = ">=3.13" +requires-python = ">=3.14" dependencies = [ - "dateparser>=1.2.2", - "django-debug-toolbar>=5.2.0", - "django>=5.2.4", - "djlint>=1.36.4", - "json-repair>=0.50.0", - "platformdirs>=4.3.8", - "python-dotenv>=1.1.1", - "pygments>=2.19.2", - "httpx>=0.28.1", - "pydantic>=2.12.5", - "tqdm>=4.67.1", - "colorama>=0.4.6", - "django-stubs-ext>=5.2.8", - "django-stubs[compatible-mypy]>=5.2.8", - "types-pygments>=2.19.0.20251121", + "dateparser", + "django-debug-toolbar", + "django", + "json-repair", + "platformdirs", + "python-dotenv", + "pygments", + "httpx", + "pydantic", + "tqdm", + "colorama", + "gunicorn", ] [dependency-groups] -dev = ["pytest>=8.4.1", "pytest-django>=4.11.1"] +dev = ["pytest", "pytest-django", "djlint"] [tool.pytest.ini_options] DJANGO_SETTINGS_MODULE = "config.settings" @@ -98,9 +95,3 @@ line-length = 120 [tool.djlint] profile = "django" ignore = "H021" - -[tool.mypy] -plugins = ["mypy_django_plugin.main"] - -[tool.django-stubs] -django_settings_module = "config.settings" diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..9361711 --- /dev/null +++ b/start.sh @@ -0,0 +1,8 @@ +#!/bin/sh +set -e + +echo "Collecting static files..." +uv run python manage.py collectstatic --noinput + +echo "Starting Django server..." +exec "$@" diff --git a/static/about.txt b/static/about.txt new file mode 100644 index 0000000..6e2355d --- /dev/null +++ b/static/about.txt @@ -0,0 +1,6 @@ +This favicon was generated using the following graphics from Twemoji: + +- Graphics Title: 1f4a6.svg +- Graphics Author: Copyright 2020 Twitter, Inc and other contributors (https://github.com/jdecked/twemoji) +- Graphics Source: https://github.com/jdecked/twemoji/blob/master/assets/svg/1f4a6.svg +- Graphics License: CC-BY 4.0 (https://creativecommons.org/licenses/by/4.0/) diff --git a/static/android-chrome-192x192.png b/static/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..0a655af21b8cdf2df7cc64264fd77f1964a56181 GIT binary patch literal 6944 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 A47O+4j2IZiuXwsRhE&{oGt<{2Bv9n| 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 L^>bP0l+XkKm#fME literal 0 HcmV?d00001 diff --git a/static/favicon-32x32.png b/static/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..35817ce748869c74599608d7234208ea84e3925b GIT binary patch literal 854 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANOKvYsxEAr-f_PWSZ)2^2Y= z?{@#;GN-65oSXQCRXP`m<=*m;l;E-Y{BCQ@J`SZQiM2%$ zj#}MCCnhK;b8Ipwom2fTCDo&C-wsVH<6rk?o1gphU|rg~-T%w~J)cu8cUpas?Y_3# zs~j0hi@~;u-HN0zj;!2Bt$=$1D<(0WER2>}`ed3(gdNAsb3uKd zIM}On8q|XMKZ!X8%cNdb;`_JtAj2+|3BPRlK8Yu?_p}IhzZZ3Q%k-q8;joR1MrO&% zr1{%rBfi?NoN$k0_OdU>YV`OzKcC^wTm4#wSw^PDHnFb2XP%hHV^+Zg?U{4`d+fGc zrC%w|U~$xoU6LhaUy7gW2 z`n+X^I=if<&-}#dzVo8GJ|AaD)%&vO&-_y5XLT`_y_YCgi^R2X51G4#+T1jqn>oe-LYf$dp)yB#3*GkO2RLP-z zj>rPNB`M!MI^Rp*_;S(U@zZ-sPxSaUT~~h-&+9FBZpFtZ|8#7nA1fR_)19%!LwyBf ziFZTI@^q%gFOABPf+~Smzh)k-c{(kNvKqD(^r=CuI3ERd+O25cEK>$c>_noD_*^Zy6{rV&2?>!+m`1XHFM;|v@vAup;+Dz-ScAMv~67_gr zIw>_rM#w|lIqiPYHiqR z@8z>lg_5=0OVag1jicDNw2MmR3bv;_J|p@koI!PmZ*Emh@$Jw2DaI1|w`4S885kHC NJYD@<);T3K0RT$?cOd`( literal 0 HcmV?d00001 diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ffe57c69eb0215c61b5c4e9221a210ae1dd53285 GIT binary patch literal 15406 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 lZ(py8z4v-;^w!sFW6DA6CEhHK=A&jgLu - - - - + + + + + + - + content="Twitch Drops Tracker - Track your Twitch drops and campaigns easily." /> + {% block title %} ttvdrops {% endblock title %} @@ -86,7 +168,7 @@ + value="{{ request.GET.q }}" /> {% if messages %} diff --git a/twitch/management/commands/better_import_drops.py b/twitch/management/commands/better_import_drops.py index 48ce75d..f6ebede 100644 --- a/twitch/management/commands/better_import_drops.py +++ b/twitch/management/commands/better_import_drops.py @@ -322,7 +322,7 @@ class Command(BaseCommand): for name, model, cache_attr in progress_bar: self.load_cache_for_model(progress_bar, name, model, cache_attr) tqdm.write("") - except (DatabaseError, OSError, RuntimeError, ValueError, TypeError): + except DatabaseError, OSError, RuntimeError, ValueError, TypeError: # If cache loading fails completely, just use empty caches tqdm.write(f"{Fore.YELLOW}⚠{Style.RESET_ALL} Cache preload skipped (database error)\n") @@ -1120,7 +1120,7 @@ class Command(BaseCommand): campaign_structure=campaign_structure, ) - except (ValidationError, json.JSONDecodeError): + except ValidationError, json.JSONDecodeError: if options["crash_on_error"]: raise @@ -1229,7 +1229,7 @@ class Command(BaseCommand): progress_bar.update(1) progress_bar.write(f"{Fore.GREEN}✓{Style.RESET_ALL} {file_path.name}") - except (ValidationError, json.JSONDecodeError): + except ValidationError, json.JSONDecodeError: if options["crash_on_error"]: raise