diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..0d0a388 --- /dev/null +++ b/.env.example @@ -0,0 +1,12 @@ +SECRET_KEY= +DEBUG=True +ADMIN_EMAIL= +EMAIL_HOST_USER= +EMAIL_HOST_PASSWORD= +REDIS_PASSWORD= +REDIS_HOST=192.168.1.2 +POSTGRES_USER= +POSTGRES_PASSWORD= +POSTGRES_HOST=192.168.1.2 +POSTGRES_PORT=5433 +TUNNEL_TOKEN= diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..d8da16e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "cSpell.words": [ + "appendonly", + "PGID", + "PUID", + "requirepass", + "ttvdrops" + ] +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4bf9a7a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,55 @@ +# Stage 1: Build the requirements.txt using Poetry +FROM python:3.12-slim AS builder + +# Set environment variables for Python +ENV PYTHONDONTWRITEBYTECODE 1 +ENV PYTHONUNBUFFERED 1 +ENV PATH="${PATH}:/root/.local/bin" + +# Install system dependencies +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + curl \ + git \ + && rm -rf /var/lib/apt/lists/* + +# Install Poetry +RUN curl -sSL https://install.python-poetry.org | python3 - + +# Copy only the poetry.lock/pyproject.toml to leverage Docker cache +WORKDIR /app +COPY pyproject.toml poetry.lock /app/ + +# Install dependencies and create requirements.txt +RUN poetry self add poetry-plugin-export && poetry export --format=requirements.txt --output=requirements.txt --only=main --without-hashes + +# Stage 2: Install dependencies and run the Django application +FROM python:3.12-slim AS runner + +# Set environment variables for Python +ENV PYTHONDONTWRITEBYTECODE 1 +ENV PYTHONUNBUFFERED 1 + +# Install system dependencies +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + libpq-dev \ + git \ + netcat-openbsd \ + && rm -rf /var/lib/apt/lists/* + +# Copy the generated requirements.txt from the builder stage +WORKDIR /app +COPY --from=builder /app/requirements.txt /app/ + +# Install application dependencies +RUN pip install --no-cache-dir -r requirements.txt + +# Copy the rest of the application code +COPY . /app/ + +# The port the application will listen on +EXPOSE 8000 + +# Run startup script +CMD ["./docker-entrypoint.sh"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..985f373 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,74 @@ +services: + # ttvdrops: + # container_name: ttvdrops + # image: ghcr.io/thelovinator1/ttvdrops:latest + # restart: always + # networks: + # - ttvdrops_redis + # - ttvdrops_db + # - ttvdrops_web + # environment: + # - SECRET_KEY=${SECRET_KEY} + # - DEBUG=${DEBUG} + # - ADMIN_EMAIL=${ADMIN_EMAIL} + # - EMAIL_HOST_USER=${EMAIL_HOST_USER} + # - EMAIL_HOST_PASSWORD=${EMAIL_HOST_PASSWORD} + # - REDIS_HOST=redis + # - REDIS_PASSWORD=${REDIS_PASSWORD} + # - POSTGRES_HOST=postgres + # - POSTGRES_PORT=5432 + # - POSTGRES_DB=${POSTGRES_DB} + # - POSTGRES_USER=${POSTGRES_USER} + # - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + # volumes: + # - /mnt/Fourteen/Docker/ttvdrops/staticfiles:/app/staticfiles + web: + container_name: ttvdrops_web + image: lscr.io/linuxserver/nginx:latest + restart: always + environment: + - PUID=1000 + - PGID=1000 + - TZ=Europe/Stockholm + expose: + - 80 + - 443 + volumes: + - /mnt/Fourteen/Docker/ttvdrops/Nginx:/config + networks: + - ttvdrops_web + redis: + container_name: ttvdrops_redis + image: redis:latest + restart: always + user: "1000:1000" + ports: + - 6380:6379 + command: /bin/sh -c 'redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes' + volumes: + - /mnt/Fourteen/Docker/ttvdrops/Redis:/data + networks: + - ttvdrops_redis + postgres: + container_name: ttvdrops_postgres + image: postgres:16 + # user: "1000:1000" + ports: + - 5433:5432 + restart: always + environment: + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + - POSTGRES_DB=${POSTGRES_DB} + volumes: + - /mnt/Fourteen/Docker/ttvdrops/Postgres:/var/lib/postgresql/data + networks: + - ttvdrops_db + +networks: + ttvdrops_redis: + driver: bridge + ttvdrops_db: + driver: bridge + ttvdrops_web: + driver: bridge