Add some scaffolding.

This commit is contained in:
2026-05-29 12:57:56 -06:00
parent 804fae4a90
commit 6ca1117565
8 changed files with 264 additions and 0 deletions

10
.dockerignore Normal file
View File

@@ -0,0 +1,10 @@
.git
.idea
.vscode
target/
*.md
Makefile
docker-compose.yml
.env
.env.local
src/test/

26
.gitignore vendored Normal file
View File

@@ -0,0 +1,26 @@
# Maven
target/
*.class
*.jar
*.war
# IDE
.idea/
*.iml
.vscode/
*.eclipse
.project
.classpath
.settings/
# Environment
.env
.env.local
# OS
.DS_Store
Thumbs.db
# Logs
*.log
logs/

12
Dockerfile Normal file
View File

@@ -0,0 +1,12 @@
FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
COPY target/notesvault-0.0.1-SNAPSHOT.jar app.jar
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

16
Makefile Normal file
View File

@@ -0,0 +1,16 @@
.PHONY: run test docker-build docker-up docker-down
run:
JWT_SECRET=dev-secret-change-me mvn spring-boot:run
test:
mvn test
docker-build:
docker build -t notesvault:latest .
docker-up:
docker compose up -d
docker-down:
docker compose down

28
docker-compose.yml Normal file
View File

@@ -0,0 +1,28 @@
services:
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: notesvault
POSTGRES_USER: notesvault
POSTGRES_PASSWORD: notesvault
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U notesvault"]
interval: 5s
timeout: 5s
retries: 5
api:
build: .
ports:
- "8080:8080"
environment:
SPRING_PROFILES_ACTIVE: postgres
DATASOURCE_URL: jdbc:postgresql://postgres:5432/notesvault
DATASOURCE_USERNAME: notesvault
DATASOURCE_PASSWORD: notesvault
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET must be set}
depends_on:
postgres:
condition: service_healthy

126
pom.xml Normal file
View File

@@ -0,0 +1,126 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.0</version>
<relativePath/>
</parent>
<groupId>com.seanstarkey</groupId>
<artifactId>notesvault</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>notesvault</name>
<description>Secure Notes Vault API</description>
<properties>
<java.version>21</java.version>
<jjwt.version>0.12.6</jjwt.version>
</properties>
<dependencies>
<!-- Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Validation -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- H2 (dev/test) -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<!-- PostgreSQL (prod) -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Flyway core -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<!-- jjwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>${jjwt.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>${jjwt.version}</version>
<scope>runtime</scope>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,15 @@
spring:
datasource:
url: ${DATASOURCE_URL:jdbc:postgresql://localhost:5432/notesvault}
driver-class-name: org.postgresql.Driver
username: ${DATASOURCE_USERNAME:notesvault}
password: ${DATASOURCE_PASSWORD:notesvault}
jpa:
database-platform: org.hibernate.dialect.PostgreSQLDialect
hibernate:
ddl-auto: validate
flyway:
locations: classpath:db/migration
h2:
console:
enabled: false

View File

@@ -0,0 +1,31 @@
spring:
datasource:
url: jdbc:h2:mem:notesvault;DB_CLOSE_DELAY=-1;MODE=PostgreSQL;NON_KEYWORDS=VALUE
driver-class-name: org.h2.Driver
username: sa
password: ""
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: validate
open-in-view: false
flyway:
locations: classpath:db/migration
h2:
console:
enabled: false
app:
jwt:
secret: ${JWT_SECRET:dev-secret-change-me-do-not-use-in-production}
expiration-seconds: 86400
---
spring:
config:
activate:
on-profile: dev
h2:
console:
enabled: true
path: /h2-console