From 3e44de093e50317a1bf58b327db46dcdf554af6c Mon Sep 17 00:00:00 2001 From: Jonathan Date: Fri, 10 Jul 2026 17:16:24 +0200 Subject: [PATCH] feat: add worker loop and production Dockerfiles --- web/.dockerignore | 3 +++ web/Dockerfile | 23 +++++++++++++++++++++++ web/docker-entrypoint.sh | 4 ++++ web/public/.gitkeep | 0 worker/.dockerignore | 3 +++ worker/Dockerfile | 6 ++++++ worker/lyra_worker/main.py | 28 ++++++++++++++++++++++++++++ 7 files changed, 67 insertions(+) create mode 100644 web/.dockerignore create mode 100644 web/Dockerfile create mode 100644 web/docker-entrypoint.sh create mode 100644 web/public/.gitkeep create mode 100644 worker/.dockerignore create mode 100644 worker/Dockerfile create mode 100644 worker/lyra_worker/main.py diff --git a/web/.dockerignore b/web/.dockerignore new file mode 100644 index 0000000..304f800 --- /dev/null +++ b/web/.dockerignore @@ -0,0 +1,3 @@ +node_modules +.next +.env diff --git a/web/Dockerfile b/web/Dockerfile new file mode 100644 index 0000000..89f14be --- /dev/null +++ b/web/Dockerfile @@ -0,0 +1,23 @@ +FROM node:22-slim AS build +WORKDIR /app +RUN apt-get update && apt-get install -y openssl && rm -rf /var/lib/apt/lists/* +COPY package.json package-lock.json* ./ +COPY prisma ./prisma +RUN npm install +COPY . . +RUN npx prisma generate && npm run build + +FROM node:22-slim AS run +WORKDIR /app +RUN apt-get update && apt-get install -y openssl && rm -rf /var/lib/apt/lists/* +ENV NODE_ENV=production +COPY --from=build /app/.next/standalone ./ +COPY --from=build /app/.next/static ./.next/static +COPY --from=build /app/public ./public +COPY --from=build /app/prisma ./prisma +COPY --from=build /app/node_modules/prisma ./node_modules/prisma +COPY --from=build /app/node_modules/@prisma ./node_modules/@prisma +COPY --from=build /app/docker-entrypoint.sh ./ +RUN chmod +x docker-entrypoint.sh +EXPOSE 3000 +CMD ["./docker-entrypoint.sh"] diff --git a/web/docker-entrypoint.sh b/web/docker-entrypoint.sh new file mode 100644 index 0000000..447b90c --- /dev/null +++ b/web/docker-entrypoint.sh @@ -0,0 +1,4 @@ +#!/bin/sh +set -e +node node_modules/prisma/build/index.js migrate deploy +exec node server.js diff --git a/web/public/.gitkeep b/web/public/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/worker/.dockerignore b/worker/.dockerignore new file mode 100644 index 0000000..676f6fb --- /dev/null +++ b/worker/.dockerignore @@ -0,0 +1,3 @@ +tests +__pycache__ +*.pyc diff --git a/worker/Dockerfile b/worker/Dockerfile new file mode 100644 index 0000000..f75d665 --- /dev/null +++ b/worker/Dockerfile @@ -0,0 +1,6 @@ +FROM python:3.12-slim +WORKDIR /app +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt +COPY lyra_worker ./lyra_worker +CMD ["python", "-m", "lyra_worker.main"] diff --git a/worker/lyra_worker/main.py b/worker/lyra_worker/main.py new file mode 100644 index 0000000..bbfe538 --- /dev/null +++ b/worker/lyra_worker/main.py @@ -0,0 +1,28 @@ +import time + +from lyra_worker.claim import claim_next +from lyra_worker.db import connect +from lyra_worker.pipeline import run_pipeline + +IDLE_SLEEP = 2.0 +STAGE_DELAY = 1.0 # visible progress in the UI + + +def run_forever() -> None: + conn = connect() + print("worker: waiting for jobs", flush=True) + try: + while True: + job_id = claim_next(conn) + if job_id is None: + time.sleep(IDLE_SLEEP) + continue + print(f"worker: claimed job {job_id}", flush=True) + run_pipeline(conn, job_id, stage_delay=STAGE_DELAY) + print(f"worker: imported job {job_id}", flush=True) + finally: + conn.close() + + +if __name__ == "__main__": + run_forever()