Skip to content

Build and Docker Image

TKeeper is a Java 21 application built with Gradle.

Requirements

  • JDK 21
  • Docker
  • Gradle wrapper (./gradlew) is included in the repository

Clone the repository

git clone https://github.com/exploit-org/tkeeper
cd tkeeper

Build the runnable JAR

From the repository root:

./gradlew shadowJar

The output JAR is produced under:

build/libs/

Example:

build/libs/tkeeper-1.0.0.jar

Build the Docker image

Build the runnable JAR and the Docker image:

./gradlew dockerBuild

Image will have following tags:

  • exploit/tkeeper:{currentVersion}
  • exploit/tkeeper:latest

Ports

TKeeper uses two TCP ports:

  • 8080: external/client-facing API surface
  • 9090: internal keeper-to-keeper communication

Warning

Treat the internal port (9090) as cluster-internal. Publish it only where required for keeper-to-keeper connectivity, and avoid exposing it to untrusted or public networks.

Docker Compose example

The example below publishes the public API port to the host and keeps the internal port available only on the Compose network.

services:
  keeper-1:
    image: exploit/tkeeper:1.0.0
    container_name: keeper-1
    environment:
      KEEPER_DEV_ENABLED: "false"
      KEEPER_CONFIG_LOCATION: /etc/tkeeper
    volumes:
      - ./config/keeper-1:/etc/tkeeper:ro
    ports:
      - "8081:8080"
    expose:
      - "9090" # INTERNAL PORT
    networks: [tkeeper-net]

  keeper-2:
    image: exploit/tkeeper:1.0.0
    container_name: keeper-2
    environment:
      KEEPER_DEV_ENABLED: "false"
      KEEPER_CONFIG_LOCATION: /etc/tkeeper
    volumes:
      - ./config/keeper-2:/etc/tkeeper:ro
    ports:
      - "8082:8080"
    expose:
      - "9090" # INTERNAL PORT
    networks: [tkeeper-net]

networks:
  tkeeper-net:
    driver: bridge

Note

TKeeper can load configuration from multiple sources. See Configuration.