# Travel Planner Self-hosted, AI-assisted travel planner. Angular PWA frontend, NestJS API + background worker, PostgreSQL, Redis/BullMQ, and a Mistral-backed travel agent behind a strict tool boundary. > `.env.example` lists configuration **names and non-secret defaults only**. Real production secrets (database password, SMTP credentials, LLM API keys, etc.) are never committed and live only on the deployment host / secret store, supplied to containers as environment variables. ## Repository layout ```text frontend/ Angular PWA (pnpm workspace member) backend/ NestJS workspace: apps/api, apps/worker, libs/* docker/ Production Dockerfiles and edge (Nginx) config scripts/ Compose-invariant checks and TeamCity entry points docs/ Specs, plans, and architecture documentation ``` ## Developer setup ```bash pnpm install 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 pnpm --filter frontend start ``` `pnpm dev:infra` starts local PostgreSQL/Redis (see `compose.dev.yml`); `pnpm dev:infra:down` stops them. ## Quality gates ```bash pnpm lint pnpm test pnpm test:compose pnpm build ``` ## TeamCity deployment scripts TeamCity invokes repository-owned scripts rather than duplicating deployment logic in step configuration: ```text scripts/teamcity/validate.sh # install, lint, test, compose-invariant check, build scripts/teamcity/build-images.sh # build + push immutable IMAGE_TAG images scripts/teamcity/deploy.sh # pull, migrate, compose up -d, smoke test scripts/teamcity/smoke.sh # health/root checks against APP_BASE_URL scripts/teamcity/rollback.sh # redeploy the previous IMAGE_TAG ``` `deploy.sh` never runs `docker compose down` as part of a routine deployment; `rollback.sh` never attempts an automatic database downgrade. ## Production topology Production Docker Compose (`compose.yml`) publishes **exactly one** host port, on the `edge` (Nginx) service, which serves the built Angular app and reverse-proxies `/api/*` and `/health/*` to the internal `api` service. `api`, `worker`, `postgres`, and `redis` are reachable only over the internal Docker network. See `docs/architecture/deployment.md` for the full contract and `scripts/teamcity/` for the TeamCity-invoked build/deploy/rollback scripts.