# CannaManage Full-stack management platform for German cannabis cultivation associations (Anbauvereinigungen) under the CanG/KCanG regulatory framework. ## Tech Stack | Layer | Technology | |-------|-----------| | **Frontend** | Next.js 15, React 19, TypeScript, Tailwind CSS 4, shadcn/ui | | **Backend** | Spring Boot 3.5, Java 17, Spring Security (JWT + session) | | **Database** | PostgreSQL 16, Flyway migrations | | **Infrastructure** | Docker Compose, Gitea Actions CI/CD, TrueNAS deployment | ## Project Structure ``` cannamanage/ ├── cannamanage-api/ # Spring Boot REST API (entry point) ├── cannamanage-service/ # Business logic layer ├── cannamanage-domain/ # JPA entities, enums, value objects ├── cannamanage-frontend/ # Next.js frontend (pnpm) ├── deploy/ # Deployment scripts & nginx config ├── docker-compose.yml # Local development stack └── .gitea/workflows/ # CI/CD pipeline ``` ## Local Development ### Prerequisites - Java 17+ - Maven 3.9+ - Node.js 22+ with pnpm 10+ - Docker & Docker Compose ### Backend ```bash # Start PostgreSQL docker compose up -d db # Run Spring Boot mvn spring-boot:run -f cannamanage-api/pom.xml -Dspring-boot.run.profiles=local ``` ### Frontend ```bash cd cannamanage-frontend pnpm install pnpm dev ``` The frontend runs on http://localhost:3000, backend on http://localhost:8080. ### Full Stack (Docker) ```bash docker compose up --build ``` ## Deployment Push to `main` triggers the Gitea Actions CI pipeline which: 1. Runs backend tests (`mvn test`) 2. Runs frontend lint (`pnpm lint`) 3. Builds Docker images 4. Deploys to TrueNAS via Docker Compose 5. Verifies backend health + frontend availability Manual deploy: ```bash cd deploy && ./deploy.sh ``` ## Environment Variables | Variable | Purpose | Default | |----------|---------|---------| | `CANNAMANAGE_SECURITY_JWT_SECRET` | JWT signing key (base64, 256-bit) | — (required) | | `CORS_ORIGINS` | Allowed CORS origins (comma-separated) | `http://localhost:3000` | | `SMTP_HOST` / `SMTP_PORT` | Mail server for invites | `localhost:1025` | | `SCHEDULERS_ENABLED` | Enable background jobs | `true` | ## License Proprietary — Patrick Plate