diff --git a/datagen/Dockerfile.dev b/datagen/Dockerfile.dev index de0ae2c8..03c1e185 100644 --- a/datagen/Dockerfile.dev +++ b/datagen/Dockerfile.dev @@ -1,4 +1,4 @@ -FROM gcr.io/distroless/static-debian10:nonroot +FROM gcr.io/distroless/static-debian13:nonroot@sha256:1c2c046bc09ed40fad370b599a0b1ae7987f55b01e247cf27a7c27cd97e5bbc7 ARG TARGETPLATFORM COPY ${TARGETPLATFORM}/oxynote-datagen /oxynote-datagen ENTRYPOINT ["/oxynote-datagen"] diff --git a/docker/docker-compose.dev.yaml b/docker/docker-compose.dev.yaml index 11ec0543..9598ae26 100644 --- a/docker/docker-compose.dev.yaml +++ b/docker/docker-compose.dev.yaml @@ -1,6 +1,6 @@ services: caddy: - image: caddy:2.11-alpine + image: caddy:2.11.4-alpine container_name: caddy volumes: - caddy_data:/data @@ -106,9 +106,9 @@ services: max-size: 10m max-file: "3" postgres: - image: pgvector/pgvector:pg16 + image: postgres:18.6-alpine volumes: - - postgres_data:/var/lib/postgresql/data + - postgres_data:/var/lib/postgresql - ./demo/postgres/init-demo-db.sh:/docker-entrypoint-initdb.d/init-demo-db.sh environment: POSTGRES_USER: devuser @@ -127,7 +127,7 @@ services: max-size: 10m max-file: "3" mariadb: - image: mariadb:11-noble + image: mariadb:11.8.9-noble volumes: - mariadb_data:/var/lib/mysql - ./demo/mariadb/init-demo-db.sql:/docker-entrypoint-initdb.d/init-demo-db.sql @@ -150,7 +150,7 @@ services: max-file: "3" meilisearch: container_name: meilisearch - image: getmeili/meilisearch:v1.53 + image: getmeili/meilisearch:v1.53.1 volumes: - meilisearch_data:/meili_data environment: @@ -165,7 +165,7 @@ services: max-file: "3" mailpit: container_name: mailpit - image: axllent/mailpit + image: axllent/mailpit:v1.31.0 restart: unless-stopped logging: driver: local @@ -175,7 +175,7 @@ services: max-file: "3" valkey: container_name: valkey - image: valkey/valkey:9.1-alpine + image: valkey/valkey:9.1.1-alpine volumes: - valkey_data:/data restart: unless-stopped @@ -192,7 +192,7 @@ services: max-file: "3" minio: container_name: minio - image: minio/minio + image: minio/minio:RELEASE.2025-09-07T16-13-09Z command: server --console-address ":9001" /data volumes: - minio_data:/data @@ -208,7 +208,7 @@ services: max-file: "3" changedetection: container_name: changedetection - image: dgtlmoon/changedetection.io + image: dgtlmoon/changedetection.io:0.55.8 volumes: - changedetection_data:/datastore environment: @@ -228,7 +228,10 @@ services: browser-sockpuppet-chrome: container_name: browser-sockpuppet-chrome hostname: browser-sockpuppet-chrome - image: dgtlmoon/sockpuppetbrowser:latest + # upstream publishes no per-release tags (its version tags lag latest by + # months), so latest is pinned by digest instead; dependabot bumps the + # digest when a new latest is published. + image: dgtlmoon/sockpuppetbrowser:latest@sha256:7116c61ef9cfce3d48a7efd9355d2fbe19f593ea3cfb52a5ded40ecbcb0a3f9d cap_add: - SYS_ADMIN # TODO: Recommended in their docker-compose example, need to double-check this. restart: unless-stopped @@ -239,7 +242,7 @@ services: - MAX_CONCURRENT_CHROME_PROCESSES=10 - LOG_LEVEL=WARNING grafana: - image: grafana/grafana:latest + image: grafana/grafana:13.1.4 container_name: grafana ports: - "8083:3000" diff --git a/e2e/CLAUDE.md b/e2e/CLAUDE.md index 91dabb77..37e18b0e 100644 --- a/e2e/CLAUDE.md +++ b/e2e/CLAUDE.md @@ -103,9 +103,9 @@ dev stack uses, never a published release. It deliberately differs from - **Env is inlined and committed.** There is nothing secret in it, so CI needs no setup step. Unlike `docker/env/*.example.env`, it lists only the variables that matter — it is a fixture, not an operator template. -- **Every image is pinned**, including the two the dev stack floats - (`minio` and `mailpit`). A run has to fail because this repository - changed, not because an upstream `latest` moved overnight. +- **Every image is pinned**, as in the dev stack. A run has to fail + because this repository changed, not because an upstream `latest` + moved overnight. - **Only the services the tests touch.** No changedetection, sockpuppet-chrome, mariadb, datagen, prometheus or grafana. - **The front door is `docker/Caddyfile` verbatim**, mounted from the dev diff --git a/e2e/docker-compose.yaml b/e2e/docker-compose.yaml index 1880fb29..8ce6da51 100644 --- a/e2e/docker-compose.yaml +++ b/e2e/docker-compose.yaml @@ -11,15 +11,15 @@ # the front door is the dev Caddyfile verbatim: e2e must exercise the # same routing and the same /api/x and /api/internal blocks that ship. # -# every image is pinned, including the two the dev stack floats. A run -# has to fail because this repository changed, not because something -# upstream published a new latest overnight. +# every image is pinned, as in the dev stack. A run has to fail because +# this repository changed, not because something upstream published a +# new latest overnight. name: oxynote-e2e services: caddy: - image: caddy:2.11-alpine + image: caddy:2.11.4-alpine volumes: - ../docker/Caddyfile:/etc/caddy/Caddyfile ports: @@ -137,7 +137,7 @@ services: condition: service_healthy postgres: - image: pgvector/pgvector:pg16 + image: postgres:18.6-alpine environment: POSTGRES_USER: devuser POSTGRES_PASSWORD: devpass @@ -149,7 +149,7 @@ services: retries: 20 valkey: - image: valkey/valkey:9.1-alpine + image: valkey/valkey:9.1.1-alpine healthcheck: test: ["CMD", "valkey-cli", "ping"] interval: 5s @@ -157,7 +157,7 @@ services: retries: 20 meilisearch: - image: getmeili/meilisearch:v1.53 + image: getmeili/meilisearch:v1.53.1 environment: - MEILI_MASTER_KEY=devmasterkey - MEILI_ENV=development diff --git a/server/CLAUDE.md b/server/CLAUDE.md index 4409dbd8..b4c09989 100644 --- a/server/CLAUDE.md +++ b/server/CLAUDE.md @@ -118,7 +118,7 @@ The ProseMirror schema is defined in `server/auth-realtime/src/schema/` (one fil ## Database -Postgres (image `pgvector/pgvector:pg16`). Migrations are embedded in the core binary from `server/core/internal/db/migrations/` and applied automatically by `db.New` on startup via `rubenv/sql-migrate`. Add new migrations as the next-numbered `NNN_.sql` file. +Postgres (image `postgres:18.6-alpine`). Migrations are embedded in the core binary from `server/core/internal/db/migrations/` and applied automatically by `db.New` on startup via `rubenv/sql-migrate`. Add new migrations as the next-numbered `NNN_.sql` file. **The core migrations own all tables, including the Better Auth ones** (`users`, `user_accounts`, `organizations`, … are created by `001_initial.sql` with snake_case columns matching the `fields` mappings in `src/auth.ts`). The generated `better_auth_schema.sql` is **reference output only — never apply it directly**; regenerate it to diff what Better Auth expects after changing `src/auth.ts`: diff --git a/server/core/Dockerfile.dev b/server/core/Dockerfile.dev index ea092d41..437fc54a 100644 --- a/server/core/Dockerfile.dev +++ b/server/core/Dockerfile.dev @@ -1,4 +1,4 @@ -FROM gcr.io/distroless/static-debian10:nonroot +FROM gcr.io/distroless/static-debian13:nonroot@sha256:1c2c046bc09ed40fad370b599a0b1ae7987f55b01e247cf27a7c27cd97e5bbc7 ARG TARGETPLATFORM ARG BINARY COPY ${TARGETPLATFORM}/${BINARY} /app