82b78053aa328fd777ff204f53d17df06fdce61e
Barotrauma Admin
Ktor + Exposed + PostgreSQL backend for managing game-server tasks and executing remote commands.
Project Structure
src/main/kotlin/com/nano/
├── main.kt # Application entry point + DI wiring
├── Routing.kt # HTTP routes (tasks, exec)
├── model/
│ ├── Task.kt # Task domain model + TaskStatus enum
│ └── ExecutorResult.kt
├── db/
│ ├── DatabaseConfig.kt # HikariCP + Exposed Database setup
│ └── Tables.kt # Exposed Table definitions (TaskTable)
├── repository/
│ └── TaskRepository.kt # CRUD operations on TaskTable, returns model objects
├── service/
│ └── TaskService.kt # Business logic: create, list, cancel tasks
└── executor/
└── Executor.kt # Bash command runner with log streaming
Layer flow
Model → DB (connection + table) → Repository → Service → Route
Local Development
# Start PostgreSQL + app
docker compose up --build
# Or run app without Docker (needs local Postgres)
./gradlew run
App is served at http://localhost:8080.
Environment variables
| Variable | Default | Description |
|---|---|---|
DATABASE_JDBC_URL |
jdbc:postgresql://localhost:5432/barotrauma-admin |
PostgreSQL JDBC URL |
DATABASE_USER |
postgres |
DB user |
DATABASE_PASSWORD |
postgres |
DB password |
DATABASE_POOL_SIZE |
10 |
HikariCP pool size |
API Endpoints
| Method | Path | Description |
|---|---|---|
| GET | / |
Health check |
| GET | /tasks |
List all tasks (?status=RUNNING to filter) |
| GET | /tasks/{id} |
Get task by UUID |
| POST | /tasks |
Create task {"name":"...", "payload":"..."} |
| POST | /tasks/{id}/cancel |
Cancel task |
| DELETE | /tasks/{id} |
Delete task |
| POST | /exec |
Run bash command {"command":"ls -la"} |
CI/CD (Gitea Actions)
The pipeline in .gitea/workflows/ci.yaml does:
- Build — compiles the project, runs tests
- Docker — builds image, pushes to registry
- Deploy — SSHes to target host, pulls image, restarts via
docker-compose.remote.yml
Required secrets in Gitea
| Secret | Description |
|---|---|
REGISTRY_URL |
Container registry host (e.g. gitea.example.com) |
REGISTRY_USER |
Registry username |
REGISTRY_PASSWORD |
Registry token / password |
DEPLOY_HOST |
Remote server hostname |
DEPLOY_PORT |
SSH port (default 22) |
DEPLOY_USER |
Remote SSH user |
DEPLOY_SSH_KEY |
Private SSH key for deployment |
DEPLOY_PATH |
Target directory on remote host |
DATABASE_JDBC_URL |
Production JDBC URL |
DATABASE_USER |
Production DB user |
DATABASE_PASSWORD |
Production DB password |
Required variables in Gitea
| Variable | Default | Description |
|---|---|---|
DATABASE_POOL_SIZE |
10 |
Connection pool size |
HOST_PORT |
8080 |
Host port mapping |
Runner tag
Pipeline uses runs-on: ubuntu-24.04. Register your Gitea runner with:
gitea actions runner register --labels "ubuntu-24.04:docker://node:20-bookworm"
Remote deployment
On the target host, place docker-compose.remote.yml and a .env file with the variables listed above.
docker compose -f docker-compose.remote.yml pull
docker compose -f docker-compose.remote.yml up -d
Building locally
./gradlew build
./gradlew test
./gradlew installDist
Languages
Kotlin
96.3%
Dockerfile
3.7%