diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..d12010e --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,40 @@ +name: Deploy fil (kreuzberg) + +on: + push: + branches: + - main + workflow_dispatch: + +env: + SERVICE_NAME: fil + +jobs: + deploy: + runs-on: debian-host + + env: + PATH: /usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/bin:/snap/bin + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Validate Nomad job + run: nomad job validate kreuzberg.nomad + env: + NOMAD_ADDR: "https://nomad.i80.dk:4646" + + - name: Deploy to Nomad + run: nomad job run kreuzberg.nomad + env: + NOMAD_ADDR: "https://nomad.i80.dk:4646" + + - name: Check deployment status + run: | + echo "=== Job status ===" + nomad job status ${SERVICE_NAME} + echo "=== Allocations ===" + nomad job allocs ${SERVICE_NAME} + env: + NOMAD_ADDR: "https://nomad.i80.dk:4646" diff --git a/kreuzberg.nomad b/kreuzberg.nomad new file mode 100644 index 0000000..6d5f863 --- /dev/null +++ b/kreuzberg.nomad @@ -0,0 +1,110 @@ +variable "image_tag" { + description = "Docker image tag" + type = string + default = "latest" +} + +job "fil" { + region = "global" + datacenters = ["dc1"] + type = "service" + + meta { + uuid = uuidv4() + deployed_at = "[[ timeNowUTC ]]" + } + + update { + stagger = "30s" + max_parallel = 1 + auto_revert = true + progress_deadline = "20m" + } + + group "fil-group" { + count = 1 + + constraint { + attribute = "${node.unique.name}" + value = "autobox.i80.dk" + } + + update { + canary = 1 + auto_promote = true + min_healthy_time = "30s" + healthy_deadline = "15m" + progress_deadline = "20m" + auto_revert = true + } + + network { + port "http" {} + } + + reschedule { + attempts = 5 + interval = "10m" + delay = "30s" + delay_function = "exponential" + max_delay = "120s" + unlimited = false + } + + service { + provider = "consul" + name = "fil" + port = "http" + + tags = [ + "traefik.enable=true", + "traefik.http.routers.fil.rule=Host(`fil.i80.dk`)", + "traefik.http.routers.fil.tls=true", + ] + + check { + name = "http_health" + type = "http" + port = "http" + path = "/health" + interval = "15s" + timeout = "5s" + } + } + + task "fil-task" { + driver = "docker" + + config { + image = "ghcr.io/kreuzberg-dev/kreuzberg:${var.image_tag}" + ports = ["http"] + force_pull = true + args = [ + "serve", + "--host", "0.0.0.0", + "--port", "${NOMAD_PORT_http}", + ] + } + + restart { + attempts = 5 + interval = "10m" + delay = "20s" + mode = "fail" + } + + env { + RUST_LOG = "info" + KREUZBERG_CACHE_DIR = "/app/.kreuzberg" + HF_HOME = "/app/.kreuzberg/huggingface" + LD_LIBRARY_PATH = "/usr/local/lib:/usr/lib:/lib" + } + + resources { + cpu = 500 + memory = 1024 + memory_max = 4096 + } + } + } +}