diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 395a067..a10e29e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,7 +2,7 @@ fail_fast: true repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.0.1 + rev: v4.5.0 hooks: - id: check-yaml - id: check-toml @@ -15,8 +15,7 @@ repos: - id: check-merge-conflict - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.8 + rev: v0.1.13 hooks: - id: ruff args: [--fix] - - id: ruff-format diff --git a/Dockerfile b/Dockerfile index 5a4aa9b..fd62f39 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,22 +1,83 @@ -# Use an official Python runtime as a parent image -FROM python:slim +# Python builder stage +FROM python:alpine3.18 AS py-builder -# Set the working directory in the container to /app +# Set the working directory WORKDIR /app -# Add metadata to the image to describe that the container is listening on port 80 -EXPOSE 8000 +# Copy only the pyproject.toml files +COPY core/pyproject.toml /app/core/ +COPY chat/pyproject.toml /app/chat/ +COPY notifier/pyproject.toml /app/notifier/ -# Copy the current directory contents into the container at /app -COPY . /app +# Install system dependencies +RUN apk update && apk add --no-cache \ + gcc \ + curl \ + git -# Install any needed packages specified in pyproject.toml -RUN apt-get update && apt-get install -y gcc curl && \ - curl -sSL https://install.python-poetry.org | python - && \ - echo "export PATH=$PATH:/root/.local/bin" >> ~/.bashrc && \ +# Install Poetry +RUN curl -sSL https://install.python-poetry.org | python - + +# Configure environment variables and install Python dependencies +RUN echo "export PATH=$PATH:/root/.local/bin" >> ~/.bashrc && \ . ~/.bashrc && \ poetry config virtualenvs.create false && \ poetry install --no-dev -# Run server when the container launches -CMD granian --no-ws --host 0.0.0.0 --port 8000 --interface asgi main:app +# Go builder stage +FROM golang:1.21.3-alpine3.18 AS go-builder + +# Set the working directory +WORKDIR /authorizer + +# Copy the entire submodule directory +COPY authorizer /authorizer + +# Fetch submodules +RUN apk update && apk add --no-cache git && \ + git submodule update --init --recursive + +ARG VERSION="latest" +ENV VERSION="$VERSION" + +# Build the server +RUN cd /authorizer && \ + make clean && make && \ + chmod 777 build/server + +# Final image +FROM alpine:3.18 + +# Set the working directory +WORKDIR /app + +# Copy built services from previous stages +COPY --from=go-builder /authorizer /app/authorizer + +# Copy Python dependencies from the py-builder stage +COPY --from=py-builder /root/.local /root/.local + +# Install system dependencies +RUN apk update && apk add --no-cache \ + gcc \ + curl \ + git \ + postgresql \ + supervisor \ + make \ + python3 \ + py3-pip + +# Install Python dependencies for gateway project +COPY . /app/ +RUN poetry config virtualenvs.create false && \ + poetry install --no-dev + +# Supervisor configuration +COPY supervisor/conf.d/* /etc/supervisor/conf.d/ + +# Expose ports for each service +EXPOSE 8000 + +# Command to start Supervisor +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"] diff --git a/pyproject.toml b/pyproject.toml index ab0eef4..0b451e3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "discoursio-inbox" -version = "0.2.19" +version = "0.2.22" description = "Inbox server for discours.io" authors = ["Tony Rewin "] @@ -9,7 +9,7 @@ python = "^3.12" sentry-sdk = "^1.39.1" redis = { extras = ["hiredis"], version = "^5.0.1" } ariadne = "^0.21" -starlette = "^0.34.0" +starlette = "^0.36.1" itsdangerous = "^2.1.2" aiohttp = "^3.9.1" requests = "^2.31.0" diff --git a/services/auth.py b/services/auth.py index f16dd1f..99ede4b 100644 --- a/services/auth.py +++ b/services/auth.py @@ -39,15 +39,22 @@ async def check_auth(req) -> str | None: } # Asynchronous HTTP request to the authentication server async with ClientSession() as session: - async with session.post(AUTH_URL, json=gql, headers=headers) as response: + async with session.post( + AUTH_URL, json=gql, headers=headers + ) as response: if response.status == 200: data = await response.json() errors = data.get('errors') if errors: logger.error(f'{errors}') else: - user_id = data.get('data', {}).get(query_name, {}).get('claims', {}).get('sub') - logger.info(f'[services.auth] got user_id: {user_id}') + user_id = ( + data.get('data', {}) + .get(query_name, {}) + .get('claims', {}) + .get('sub') + ) + logger.info(f'got user_id: {user_id}') return user_id except Exception as e: # Handling and logging exceptions during authentication check