diff --git a/.woodpecker.yml b/.woodpecker.yml index 966aca4..726847b 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -58,9 +58,8 @@ steps: tags: - ${CI_COMMIT_SHA} - latest - dockerfile: docker/Dockerfile + dockerfile: docker/Dockerfile.scheduler context: . - build_args: "SERVICE_CMD=python -m services.scheduler.app" when: event: push branch: main diff --git a/docker/Dockerfile b/docker/Dockerfile index c25199d..78f9f11 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -19,7 +19,6 @@ RUN pip install --no-cache-dir -r requirements.txt COPY services/ /app/services/ COPY tests/ /app/tests/ COPY conftest.py /app/conftest.py -COPY infra/migrations/ /app/infra/migrations/ RUN useradd -m -u 1000 stonks && \ chown -R stonks:stonks /app diff --git a/docker/Dockerfile.scheduler b/docker/Dockerfile.scheduler new file mode 100644 index 0000000..cc3d036 --- /dev/null +++ b/docker/Dockerfile.scheduler @@ -0,0 +1,31 @@ +# Scheduler image — adds postgresql-client for running migrations via psql. +# Built separately from the base service image. Only the scheduler uses this. +FROM registry.celestium.life/dockerhub-cache/library/python:3.12-slim + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 +ENV PYTHONPATH=/app + +RUN apt-get update && apt-get install -y --no-install-recommends \ + gcc \ + libpq-dev \ + curl \ + postgresql-client \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY services/ /app/services/ +COPY tests/ /app/tests/ +COPY conftest.py /app/conftest.py +COPY infra/migrations/ /app/infra/migrations/ + +RUN useradd -m -u 1000 stonks && \ + chown -R stonks:stonks /app + +USER stonks + +CMD ["python", "-m", "services.scheduler.app"] diff --git a/infra/helm/stonks-oracle/templates/deployments.yaml b/infra/helm/stonks-oracle/templates/deployments.yaml index ca3c8ba..f96e21c 100644 --- a/infra/helm/stonks-oracle/templates/deployments.yaml +++ b/infra/helm/stonks-oracle/templates/deployments.yaml @@ -33,7 +33,17 @@ spec: - name: run-migrations image: {{ $root.Values.image.registry }}/{{ $svc.image }}:{{ $root.Values.image.tag }} imagePullPolicy: {{ $root.Values.image.pullPolicy }} - command: ["python", "-m", "services.shared.migrate"] + command: ["sh", "-c"] + args: + - | + for f in $(ls /app/infra/migrations/*.sql 2>/dev/null | sort); do + echo "Applying $(basename $f)..." + PGPASSWORD="$POSTGRES_PASSWORD" psql \ + -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" \ + -U "$POSTGRES_USER" -d "$POSTGRES_DB" \ + -f "$f" -v ON_ERROR_STOP=0 > /dev/null 2>&1 || true + done + echo "Migrations complete." securityContext: {{- include "stonks.containerSecurityContext" $root | nindent 12 }} envFrom: