diff --git a/.gitignore b/.gitignore index 71b578d..ac41daf 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ target/ *.jar *.war !.mvn/wrapper/maven-wrapper.jar +!gradle/wrapper/gradle-wrapper.jar # Environment .env diff --git a/README.md b/README.md index d3c93ff..7f4c5c0 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ The user enters a registration number, composes a letter (from a template or fre git clone bilhej cd bilhej cp .env.example .env # fill in your keys -docker compose up -d +docker compose up -d # or: ./gradlew up ``` The app will be available at: @@ -72,7 +72,7 @@ No CORS configuration needed in development — the browser never calls the back **Spring profiles:** | Profile | Datasource | Use | |---------|-----------|-----| -| default | H2 in-memory | Local IDE dev (`./gradlew bootRun`) | +| default | H2 in-memory | Local IDE dev (`./gradlew :backend:bootRun`) | | `docker` | PostgreSQL via `docker-compose.yml` | Docker Compose dev | | `prod` | PostgreSQL (production config) | Deploy (`docker-compose.prod.yml`) | @@ -130,17 +130,21 @@ bilhej/ ├── docker-compose.yml # dev: postgres + backend (bootRun) + frontend (Vite HMR) ├── docker-compose.prod.yml # prod: multi-stage builds, no source mounts, restart: unless-stopped ├── docker/ -│ ├── backend.Dockerfile # dev: JDK + gradle bootRun +│ ├── backend.Dockerfile # dev: JDK + gradle :backend:bootRun │ ├── backend.prod.Dockerfile # prod: multi-stage (Gradle → JRE Alpine, non-root) │ ├── frontend.Dockerfile # dev: Node + vite dev server │ ├── frontend.prod.Dockerfile # prod: multi-stage (Node → nginx) │ ├── nginx.conf # prod: SPA fallback + /api proxy │ └── entrypoint.sh # prod: self-signed cert generation +├── gradlew # Gradle wrapper (run from repo root) +├── gradle/ +│ └── wrapper/ +├── settings.gradle # rootProject.name + include 'backend' +├── build.gradle # convenience tasks: check, up, down, reset ├── .env.example ├── README.md ├── REQUIREMENTS.md -├── CODING_GUIDELINES.md -└── ARCHITECTURE.md +└── CODING_GUIDELINES.md ``` --- @@ -149,7 +153,7 @@ bilhej/ | Aspect | `docker compose up -d` | `docker compose -f docker-compose.prod.yml up -d` | |--------|------------------------|---------------------------------------------------| -| Backend | `./gradlew bootRun` (compiles on change) | Multi-stage build → `java -jar app.jar` | +| Backend | `./gradlew :backend:bootRun` (compiles on change) | Multi-stage build → `java -jar app.jar` | | Backend image | `eclipse-temurin:21-jdk` (~400 MB) | `eclipse-temurin:21-jre-alpine` (~200 MB) | | Backend user | root | `bilhej` (non-root) | | Frontend | Vite dev server (HMR, `--host 0.0.0.0`) | nginx serving static `dist/` | @@ -163,19 +167,27 @@ bilhej/ ## Development +### All-in-one (from repo root) + +```bash +./gradlew check # lint → frontend test → backend test → integration test +./gradlew up # docker compose up -d +./gradlew down # docker compose down +./gradlew reset # docker compose down -v && docker compose up -d (full DB reset) +``` + ### Frontend (dev server with HMR) ```bash cd frontend -npm install -npm run dev +npm install # first time only +npm run dev # :3000 with HMR ``` ### Backend (IDE or CLI) ```bash -cd backend -./gradlew bootRun +./gradlew :backend:bootRun # :8080, profile: default (H2) ``` ### Stripe Webhooks (local testing) @@ -184,10 +196,15 @@ cd backend stripe listen --forward-to localhost:8080/api/webhooks/stripe ``` +### Database reset + +```bash +./gradlew reset # wipes DB volume and restarts containers +``` + --- ## Related Documents - [REQUIREMENTS.md](./REQUIREMENTS.md) — Full product requirements and business model - [CODING_GUIDELINES.md](./CODING_GUIDELINES.md) — Code conventions and standards -- [ARCHITECTURE.md](./ARCHITECTURE.md) — Detailed architecture and data flow