chore: wire oidc environment configuration
This commit is contained in:
@@ -13,3 +13,6 @@ TEAMCITY_BUILD_NUMBER=local
|
|||||||
SOURCE_REVISION=local
|
SOURCE_REVISION=local
|
||||||
TLS_CERT_FILE=/etc/travel-planner/tls/tls.crt
|
TLS_CERT_FILE=/etc/travel-planner/tls/tls.crt
|
||||||
TLS_KEY_FILE=/etc/travel-planner/tls/tls.key
|
TLS_KEY_FILE=/etc/travel-planner/tls/tls.key
|
||||||
|
OIDC_ISSUER=https://idp.example.invalid/realms/travel-planner
|
||||||
|
OIDC_AUDIENCE=travel-planner-api
|
||||||
|
OIDC_CLIENT_ID=travel-planner-web
|
||||||
|
|||||||
16
README.md
16
README.md
@@ -19,10 +19,24 @@ docs/ Specs, plans, and architecture documentation
|
|||||||
```bash
|
```bash
|
||||||
pnpm install
|
pnpm install
|
||||||
pnpm dev:infra
|
pnpm dev:infra
|
||||||
DATABASE_URL=postgresql://travel_planner:travel_planner_dev@localhost:5432/travel_planner REDIS_URL=redis://localhost:6379 pnpm --filter backend start:api
|
DATABASE_URL=postgresql://travel_planner:travel_planner_dev@localhost:5432/travel_planner \
|
||||||
|
REDIS_URL=redis://localhost:6379 \
|
||||||
|
OIDC_ISSUER=https://idp.example.invalid/realms/travel-planner \
|
||||||
|
OIDC_AUDIENCE=travel-planner-api \
|
||||||
|
pnpm --filter backend start:api
|
||||||
pnpm --filter frontend start
|
pnpm --filter frontend start
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Run pending migrations against the dev database before starting the API for the first time:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export DATABASE_URL=postgresql://travel_planner:travel_planner_dev@localhost:5432/travel_planner
|
||||||
|
export REDIS_URL=redis://localhost:6379
|
||||||
|
export OIDC_ISSUER=https://idp.example.invalid/realms/travel-planner
|
||||||
|
export OIDC_AUDIENCE=travel-planner-api
|
||||||
|
pnpm --filter backend build:api && node backend/dist/apps/api/src/migration.js
|
||||||
|
```
|
||||||
|
|
||||||
`pnpm dev:infra` starts local PostgreSQL/Redis (see `compose.dev.yml`); `pnpm dev:infra:down` stops them.
|
`pnpm dev:infra` starts local PostgreSQL/Redis (see `compose.dev.yml`); `pnpm dev:infra:down` stops them.
|
||||||
|
|
||||||
## Quality gates
|
## Quality gates
|
||||||
|
|||||||
@@ -4,6 +4,9 @@ services:
|
|||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: docker/edge.Dockerfile
|
dockerfile: docker/edge.Dockerfile
|
||||||
|
args:
|
||||||
|
OIDC_ISSUER: "${OIDC_ISSUER}"
|
||||||
|
OIDC_CLIENT_ID: "${OIDC_CLIENT_ID}"
|
||||||
ports:
|
ports:
|
||||||
- "${APP_HTTPS_PORT:-443}:443"
|
- "${APP_HTTPS_PORT:-443}:443"
|
||||||
volumes:
|
volumes:
|
||||||
@@ -25,6 +28,8 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
DATABASE_URL: "postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}"
|
DATABASE_URL: "postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}"
|
||||||
REDIS_URL: "redis://redis:6379"
|
REDIS_URL: "redis://redis:6379"
|
||||||
|
OIDC_ISSUER: "${OIDC_ISSUER}"
|
||||||
|
OIDC_AUDIENCE: "${OIDC_AUDIENCE}"
|
||||||
APP_VERSION: "${APP_VERSION:-dev}"
|
APP_VERSION: "${APP_VERSION:-dev}"
|
||||||
TEAMCITY_BUILD_NUMBER: "${TEAMCITY_BUILD_NUMBER:-local}"
|
TEAMCITY_BUILD_NUMBER: "${TEAMCITY_BUILD_NUMBER:-local}"
|
||||||
SOURCE_REVISION: "${SOURCE_REVISION:-local}"
|
SOURCE_REVISION: "${SOURCE_REVISION:-local}"
|
||||||
@@ -50,6 +55,8 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
DATABASE_URL: "postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}"
|
DATABASE_URL: "postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}"
|
||||||
REDIS_URL: "redis://redis:6379"
|
REDIS_URL: "redis://redis:6379"
|
||||||
|
OIDC_ISSUER: "${OIDC_ISSUER}"
|
||||||
|
OIDC_AUDIENCE: "${OIDC_AUDIENCE}"
|
||||||
APP_VERSION: "${APP_VERSION:-dev}"
|
APP_VERSION: "${APP_VERSION:-dev}"
|
||||||
TEAMCITY_BUILD_NUMBER: "${TEAMCITY_BUILD_NUMBER:-local}"
|
TEAMCITY_BUILD_NUMBER: "${TEAMCITY_BUILD_NUMBER:-local}"
|
||||||
SOURCE_REVISION: "${SOURCE_REVISION:-local}"
|
SOURCE_REVISION: "${SOURCE_REVISION:-local}"
|
||||||
|
|||||||
@@ -6,6 +6,14 @@ COPY frontend/package.json frontend/package.json
|
|||||||
COPY backend/package.json backend/package.json
|
COPY backend/package.json backend/package.json
|
||||||
RUN pnpm install --frozen-lockfile
|
RUN pnpm install --frozen-lockfile
|
||||||
COPY frontend frontend
|
COPY frontend frontend
|
||||||
|
|
||||||
|
ARG OIDC_ISSUER=https://idp.example.invalid/realms/travel-planner
|
||||||
|
ARG OIDC_CLIENT_ID=travel-planner-web
|
||||||
|
RUN sed -i \
|
||||||
|
-e "s#issuer: '.*',#issuer: '${OIDC_ISSUER}',#" \
|
||||||
|
-e "s#clientId: '.*',#clientId: '${OIDC_CLIENT_ID}',#" \
|
||||||
|
frontend/src/environments/environment.production.ts
|
||||||
|
|
||||||
RUN pnpm --filter frontend build
|
RUN pnpm --filter frontend build
|
||||||
|
|
||||||
FROM nginx:1.29.8-alpine
|
FROM nginx:1.29.8-alpine
|
||||||
|
|||||||
@@ -30,3 +30,11 @@ TeamCity supplies immutable `IMAGE_TAG` values (see `scripts/teamcity/build-imag
|
|||||||
| Rollback | `scripts/teamcity/rollback.sh` |
|
| Rollback | `scripts/teamcity/rollback.sh` |
|
||||||
|
|
||||||
The existing TeamCity project configures these as command-line/SSH build steps; all deployment logic stays in version control, not in TeamCity step configuration.
|
The existing TeamCity project configures these as command-line/SSH build steps; all deployment logic stays in version control, not in TeamCity step configuration.
|
||||||
|
|
||||||
|
## OIDC configuration (Phase 02+)
|
||||||
|
|
||||||
|
`api` and `worker` both require `OIDC_ISSUER` and `OIDC_AUDIENCE` at startup (validated fail-fast by `loadEnvironment`, same as `DATABASE_URL`/`REDIS_URL`). Neither is a secret — this is a public PKCE client with no client secret. The Angular production bundle bakes `OIDC_ISSUER`/`OIDC_CLIENT_ID` in at **image build time** via `docker/edge.Dockerfile` build args (sourced from the `OIDC_ISSUER`/`OIDC_CLIENT_ID` environment variables passed to `docker compose build`), not at container runtime, since static frontend assets cannot read server-side environment variables after the fact.
|
||||||
|
|
||||||
|
## Migrations (Phase 02+)
|
||||||
|
|
||||||
|
`backend/apps/api/src/migration.ts` now runs real, versioned `node-pg-migrate` migrations from `backend/migrations/`; the Phase 01 no-op body has been replaced. The container command contract (`node backend/dist/apps/api/src/migration.js`) is unchanged, so `scripts/teamcity/deploy.sh` required no changes. Migrations are copied into the `travel-api` image so `docker compose run --rm --no-deps api node backend/dist/apps/api/src/migration.js` has everything it needs.
|
||||||
|
|||||||
Reference in New Issue
Block a user