213 lines
5.5 KiB
Markdown
213 lines
5.5 KiB
Markdown
**Vaessl: Spring Boot setup**
|
|
|
|
This app will use the current latest version 4.0.4 of Spring Boot and the latest OpenJDK 25 LTS.
|
|
|
|
The dependencies are chosen to specifically work with Spring AI and PostgreSQL/pgvector. For the AI function OpenAI is chosen since it is known to work with LiteLLM. The PostgreSQL dependency makes sure to include PostGreSQL support for self hosted databases.
|
|
|
|
# Spring Initializr settings
|
|
|
|
**Build System: Gradle - Kotlin**
|
|
|
|
Gradel Kotlin is chosen to make mobile/Android app development easier.
|
|
|
|
**Spring Boot: 4.0.4**
|
|
|
|
**Packaging: Jar**
|
|
|
|
**Configuration: YAML**
|
|
|
|
**Java: 25**
|
|
|
|
**Dependencies**
|
|
|
|
- Lombok
|
|
- Spring Boot DevTools
|
|
- Spring Web
|
|
- Spring Security
|
|
- Spring Data JPA
|
|
- OpenAI AI
|
|
- PostgreSQL Driver
|
|
- Validation
|
|
|
|
# Project Settings
|
|
|
|
PostGreSQL and OpenAI need an initial setup so that the local instance is able to start. I will comment out Spring Security since user management is an issue for a later iteration of the app.
|
|
|
|
The build.gradle.kts will look something like this:
|
|
|
|
```
|
|
plugins {
|
|
java
|
|
id("org.springframework.boot") version "4.0.4"
|
|
id("io.spring.dependency-management") version "1.1.7"
|
|
}
|
|
|
|
group = "com.vaessl"
|
|
version = "0.0.1-SNAPSHOT"
|
|
|
|
java {
|
|
toolchain {
|
|
languageVersion = JavaLanguageVersion.of(25)
|
|
}
|
|
}
|
|
|
|
configurations {
|
|
compileOnly {
|
|
extendsFrom(configurations.annotationProcessor.get())
|
|
}
|
|
}
|
|
|
|
repositories {
|
|
mavenCentral()
|
|
}
|
|
|
|
extra["springAiVersion"] = "2.0.0-M3"
|
|
|
|
dependencies {
|
|
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
|
|
// implementation("org.springframework.boot:spring-boot-starter-security")
|
|
implementation("org.springframework.boot:spring-boot-starter-validation")
|
|
implementation("org.springframework.boot:spring-boot-starter-webmvc")
|
|
implementation("org.springframework.ai:spring-ai-starter-model-openai")
|
|
compileOnly("org.projectlombok:lombok")
|
|
developmentOnly("org.springframework.boot:spring-boot-devtools")
|
|
runtimeOnly("org.postgresql:postgresql")
|
|
annotationProcessor("org.projectlombok:lombok")
|
|
testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test")
|
|
// testImplementation("org.springframework.boot:spring-boot-starter-security-test")
|
|
testImplementation("org.springframework.boot:spring-boot-starter-validation-test")
|
|
testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test")
|
|
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
|
|
}
|
|
|
|
dependencyManagement {
|
|
imports {
|
|
mavenBom("org.springframework.ai:spring-ai-bom:${property("springAiVersion")}")
|
|
}
|
|
}
|
|
|
|
tasks.withType<Test> {
|
|
useJUnitPlatform()
|
|
}
|
|
|
|
```
|
|
|
|
To configure OpenAI (which I will use instead of LiteLLM initially since I have an OpenAI Api key and can get going quickly) and PostGreSQL I will create a .env_dev file in the root dir, fill all credentials and add it to .gitignore
|
|
|
|
```
|
|
DB_URL=jdbc:postgresql://192.168.1.208:5433/vaessl
|
|
DB_USERNAME=myusername
|
|
DB_PASSWORD=mypw
|
|
OPENAI_KEY=myapikey
|
|
OPENAI_BASE_URL=https://api.openai.com
|
|
PG_DRIVER_CLASS_NAME=org.postgresql.Driver
|
|
```
|
|
|
|
The initial application.yaml in the resources folder will look like this:
|
|
|
|
```
|
|
spring:
|
|
application:
|
|
name: vaessl
|
|
config:
|
|
import: "optional:file:.env_dev[.properties]"
|
|
datasource:
|
|
url : ${DB_URL}
|
|
username: ${DB_USERNAME}
|
|
password: ${DB_PASSWORD}
|
|
driver-class-name: ${PG_DRIVER_CLASS_NAME}
|
|
|
|
jpa:
|
|
hibernate:
|
|
ddl-auto: update
|
|
show-sql: true
|
|
|
|
ai:
|
|
openai:
|
|
base-url: ${OPENAI_BASE_URL}
|
|
api-key: ${OPENAI_KEY}
|
|
chat:
|
|
options:
|
|
model: gpt-4o-mini
|
|
|
|
logging:
|
|
level:
|
|
org.springframework.boot.context.config: TRACE
|
|
|
|
```
|
|
|
|
Note that I'm using my own locally hosted PostgreSQL instance here and created a dedicated db for this project. The Docker Compose file will look something like this:
|
|
|
|
```
|
|
---
|
|
services:
|
|
code-server:
|
|
image: code-server-dev:latest
|
|
container_name: code-server
|
|
environment:
|
|
- PUID=1000
|
|
- PGID=1000
|
|
- TZ=Europe/Vienna
|
|
# - PASSWORD= #optional
|
|
- HASHED_PASSWORD=hashedpw
|
|
# - SUDO_PASSWORD_HASH= #optional
|
|
- PROXY_DOMAIN=code-server.your.website
|
|
- DEFAULT_WORKSPACE=/config/workspace
|
|
volumes:
|
|
- /home/pi/docker/vscode:/config
|
|
- /home/pi/docker/vscode/workspace:/workspace
|
|
ports:
|
|
- 8443:8443
|
|
- 8124:8080
|
|
- 5173:5173
|
|
restart: unless-stopped
|
|
|
|
vaessl-db:
|
|
image: pgvector/pgvector:pg18
|
|
container_name: vaessl-db
|
|
environment:
|
|
- POSTGRES_DB=vaessl
|
|
- POSTGRES_USER=user
|
|
- POSTGRES_PASSWORD=pw
|
|
ports:
|
|
- 5433:5432
|
|
|
|
vassal-test-db:
|
|
image: pgvector/pgvector:pg18
|
|
container_name: vassal-test-db
|
|
environment:
|
|
- POSTGRES_DB=vassal_test
|
|
- POSTGRES_USER=user
|
|
- POSTGRES_PASSWORD=pw
|
|
ports:
|
|
- 5434:5432
|
|
```
|
|
|
|
# Appendix: Additional config for developing in Code-Server
|
|
|
|
When using the code-server container there are additional config steps to mind:
|
|
|
|
- Assign the 8080 port to a different port if it is used by another docker container by adding a port variable in the docker-compose.yaml. I assigned it to 8124.
|
|
|
|
```
|
|
ports:
|
|
- 8443:8443
|
|
- 8124:8080
|
|
```
|
|
|
|
- define a proxy domain for automatic Url generations when starting localhost
|
|
|
|
```
|
|
environment:
|
|
- PROXY_DOMAIN=code-server.your.website
|
|
```
|
|
|
|
This makes sure port 8080 is reachable via https://8080.code-server.your.website as per code-server documentation for using subdomains: https://coder.com/docs/code-server/guide#using-a-subdomain
|
|
|
|
- make sure to add the subdomain in your proxy platform like Cloudflare Zero Trust Tunnel or Pangolin and point it to the local ip in my case http://192.168.208:8124
|
|
|
|
|
|
|
|
|
|
|