Loading repository data…
Loading repository data…
faizkhairi / repository
Full-stack Vue 3 + Spring Boot 3.3 boilerplate — zero external dependencies. JWT auth, PostgreSQL, Flyway, OpenAPI, Shadcn-vue, Docker Compose.
Full-stack monorepo: Vue 3 + Vite frontend, Spring Boot 3.3 (Java 21) backend. JWT auth, PostgreSQL, Flyway, OpenAPI, Docker Compose. Zero external account dependencies.
# Create project from template
gh repo create my-app --template faizkhairi/vue-springboot-boilerplate --private --clone
cd my-app
cd backend
# Ensure Java 21 and Gradle are installed, or use ./gradlew
./gradlew bootRun
# Or: export DATABASE_URL=jdbc:postgresql://localhost:5432/vue_springboot && ./gradlew bootRun
cd frontend
pnpm install
pnpm dev
Option A — PostgreSQL + Mailpit only (run backend/frontend on host):
cd docker
docker compose up -d postgres mailpit
# Backend: DATABASE_URL=jdbc:postgresql://localhost:5432/vue_springboot
# Mailpit UI: http://localhost:8025
Option B — Full stack (backend + frontend in containers):
cd docker
docker compose up -d
# Frontend: http://localhost (port 80)
# Backend API: http://localhost:8080
# Mailpit UI: http://localhost:8025
Backend (application.yml / env):
DATABASE_URL, DATABASE_USER, DATABASE_PASSWORDJWT_SECRET (min 256-bit for HS256)SMTP_HOST, SMTP_PORT (dev: localhost:1025 for Mailpit)APP_URL, SMTP_FROM (for email links and sender)Frontend:
VITE_API_BASE_URL — backend base URL (e.g. http://localhost:8080)The backend uses springdoc-openapi to automatically generate OpenAPI 3.0 documentation from Spring annotations.
Access Swagger UI:
cd backend && ./gradlew bootRunOpenAPI JSON Spec:
openapi-generator-cli)Key Endpoints:
| Endpoint | Method | Description |
|---|---|---|
/api/auth/login | POST | Authenticate with email/password, returns JWT tokens |
/api/auth/register | POST | Create new user account |
/api/auth/refresh | POST | Refresh access token using refresh token |
/api/users/me | GET | Get authenticated user profile |
Authentication:
Most endpoints require a valid JWT access token. In Swagger UI:
/api/auth/login to get tokensaccessToken from the responseBearer {accessToken}Backend (SLF4J + Logback):
logs/application.log (rolling daily, 30-day retention)logs/audit.log (90-day retention)logback-spring.xmlFrontend (Structured Logger):
src/utils/logger.ts)cd backend && ./gradlew test (JUnit 5 + Testcontainers PostgreSQL). CI runs build with -x test; run tests locally.cd frontend && npm run test (Vitest), npm run test:e2e (Playwright; run dev server or set PLAYWRIGHT_BASE_URL).backend/ — Spring Boot (Java 21, Gradle), Dockerfile
frontend/ — Vue 3 + Vite, Pinia, Vue Router, Dockerfile, Vitest, Playwright
docker/ — docker-compose (PostgreSQL, Mailpit, optional backend + frontend)
Faiz Khairi — faizkhairi.github.io — @faizkhairi