From 3289453448d5c1ffb6a916506c26173a9c1500e0 Mon Sep 17 00:00:00 2001 From: Amruth Pillai Date: Fri, 6 Feb 2026 19:15:56 +0100 Subject: [PATCH] add .devcontainer --- .devcontainer/Dockerfile | 10 ++++ .devcontainer/devcontainer.json | 32 +++++++++++ .devcontainer/docker-compose.yml | 96 ++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/docker-compose.yml diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 000000000..b737eb77b --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,10 @@ +FROM mcr.microsoft.com/devcontainers/typescript-node:24 + +RUN corepack enable + +RUN apt-get update && apt-get install -y --no-install-recommends \ + git \ + curl \ + && rm -rf /var/lib/apt/lists/* + +EXPOSE 3000 \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000..486620c86 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,32 @@ +{ + "name": "Reactive Resume", + "service": "reactive_resume", + "dockerComposeFile": "docker-compose.yml", + "workspaceFolder": "/workspace", + + "forwardPorts": [3000, 4000, 5432, 8333], + "portsAttributes": { + "3000": { "label": "Reactive Resume", "onAutoForward": "openBrowser" }, + "4000": { "label": "Browserless (Printer)" }, + "5432": { "label": "PostgreSQL" }, + "8333": { "label": "SeaweedFS (S3)" } + }, + + "customizations": { + "vscode": { + "extensions": ["biomejs.biome", "bradlc.vscode-tailwindcss", "lokalise.i18n-ally"], + "settings": { + "biome.enabled": true, + "editor.codeActionsOnSave": { + "source.biome": "explicit", + "source.fixAll.biome": "explicit", + "source.organizeImports.biome": "explicit" + }, + "editor.defaultFormatter": "biomejs.biome", + "typescript.tsdk": "node_modules/typescript/lib" + } + } + }, + + "postCreateCommand": "corepack enable && pnpm install" +} diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml new file mode 100644 index 000000000..fa0ab42ec --- /dev/null +++ b/.devcontainer/docker-compose.yml @@ -0,0 +1,96 @@ +services: + reactive_resume: + build: + context: .. + dockerfile: .devcontainer/Dockerfile + volumes: + - ..:/workspace:cached + command: sleep infinity + depends_on: + postgres: + condition: service_healthy + browserless: + condition: service_started + seaweedfs: + condition: service_healthy + seaweedfs_create_bucket: + condition: service_completed_successfully + environment: + TZ: Etc/UTC + APP_URL: http://localhost:3000 + PRINTER_APP_URL: http://reactive_resume:3000 + PRINTER_ENDPOINT: ws://browserless:3000?token=1234567890 + DATABASE_URL: postgresql://postgres:postgres@postgres:5432/postgres + AUTH_SECRET: change-me-to-a-secure-secret-key-in-production + S3_ACCESS_KEY_ID: seaweedfs + S3_SECRET_ACCESS_KEY: seaweedfs + S3_REGION: us-east-1 + S3_ENDPOINT: http://seaweedfs:8333 + S3_BUCKET: reactive-resume + S3_FORCE_PATH_STYLE: "true" + + postgres: + image: postgres:latest + restart: unless-stopped + environment: + POSTGRES_DB: postgres + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + volumes: + - postgres_data:/var/lib/postgresql + healthcheck: + test: ["CMD", "pg_isready", "-U", "postgres", "-d", "postgres"] + start_period: 10s + interval: 30s + timeout: 10s + retries: 3 + + browserless: + image: ghcr.io/browserless/chromium:latest + restart: unless-stopped + environment: + QUEUED: "10" + HEALTH: "true" + CONCURRENT: "5" + TOKEN: "1234567890" + healthcheck: + test: + ["CMD", "curl", "-f", "http://localhost:3000/pressure?token=1234567890"] + interval: 10s + timeout: 5s + retries: 10 + + seaweedfs: + image: chrislusf/seaweedfs:latest + restart: unless-stopped + command: server -s3 -filer -dir=/data -ip=0.0.0.0 + environment: + AWS_ACCESS_KEY_ID: seaweedfs + AWS_SECRET_ACCESS_KEY: seaweedfs + volumes: + - seaweedfs_data:/data + healthcheck: + test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://localhost:8888"] + start_period: 10s + interval: 30s + timeout: 10s + retries: 3 + + seaweedfs_create_bucket: + image: quay.io/minio/mc:latest + restart: on-failure + entrypoint: > + /bin/sh -c " + until mc alias set seaweedfs http://seaweedfs:8333 seaweedfs seaweedfs; do + echo 'Waiting for SeaweedFS...'; + sleep 2; + done; + mc mb seaweedfs/reactive-resume --ignore-existing; + " + depends_on: + seaweedfs: + condition: service_healthy + +volumes: + postgres_data: + seaweedfs_data: