From d4c86e71dcc2fc2e1977ba8856408d7cdae4f997 Mon Sep 17 00:00:00 2001 From: Daniel Krizan Date: Fri, 17 Apr 2026 14:04:03 +0200 Subject: [PATCH 01/10] feat: add slim Docker image variant without embedded postgres MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The existing `tolgee/tolgee` image is based on `postgres` to support `postgres-autostart.mode: EMBEDDED`. For production deployments against an external database, the postgres server binaries and their transitive OS packages aren't used at runtime. Add a slim variant built from `eclipse-temurin:21-jre-alpine` that carries only what the application needs. Published alongside the existing image: - tolgee/tolgee:slim (floating, tracks latest) - tolgee/tolgee:-slim The slim image sets `TOLGEE_POSTGRES_AUTOSTART_ENABLED=false` by default since embedded postgres isn't available in this variant; it must be run against an external database. Revives the approach from PR #3193 (stale). Current Dockerfile and default `tolgee/tolgee` tag are unchanged — this is purely additive. Co-authored-by: Matthew Sekirin Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/release.yml | 2 ++ docker/app/Dockerfile.slim | 47 +++++++++++++++++++++++++++++++ gradle/docker.gradle | 53 +++++++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 docker/app/Dockerfile.slim diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b590025aa31..9b304b68ce3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -63,6 +63,8 @@ jobs: docker buildx create --use ./gradlew dockerPublish VERSION=latest ./gradlew dockerPublish + DOCKER_CACHE_FROM=type=registry,ref=tolgee/tolgee:slim ./gradlew dockerPublishSlim + VERSION=latest DOCKER_CACHE_FROM=type=registry,ref=tolgee/tolgee:slim ./gradlew dockerPublishSlim env: VERSION: ${{ steps.version.outputs.VERSION }} TOLGEE_API_KEY: ${{secrets.TOLGEE_API_KEY}} diff --git a/docker/app/Dockerfile.slim b/docker/app/Dockerfile.slim new file mode 100644 index 00000000000..1639fdbafaf --- /dev/null +++ b/docker/app/Dockerfile.slim @@ -0,0 +1,47 @@ +FROM eclipse-temurin:21-jre-alpine + +RUN apk --no-cache add bash + +############# +### Tolgee # +############# + +# Expose application port +EXPOSE 8080 + +# Define persistent volume for data storage +VOLUME /data + +# Environment variables for configuration +# Postgres autostart is disabled — the slim image doesn't bundle the postgres +# server, so it must be run against an external database. +ENV HEALTHCHECK_PORT=8080 \ + spring_profiles_active=docker \ + TOLGEE_POSTGRES_AUTOSTART_ENABLED=false + +# Copy necessary application files +COPY BOOT-INF/lib /app/lib +COPY META-INF /app/META-INF +COPY BOOT-INF/classes /app +COPY --chmod=755 cmd.sh /app + +# Download OpenTelemetry Java agent for distributed tracing +# When OTEL_JAVAAGENT_ENABLED=true, cmd.sh will use this agent +# See: docs/observability/ +# Version is passed from gradle.properties via --build-arg (see gradle/docker.gradle) +ARG OTEL_AGENT_VERSION +RUN test -n "$OTEL_AGENT_VERSION" || (echo "OTEL_AGENT_VERSION build arg is required" && exit 1) +RUN wget -O /app/opentelemetry-javaagent.jar \ + "https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v${OTEL_AGENT_VERSION}/opentelemetry-javaagent.jar" + +################# +### Let's go ## +################# + +# Define the startup command +ENTRYPOINT ["/app/cmd.sh"] + + +# Health check to ensure the app is up and running +HEALTHCHECK --interval=10s --timeout=3s --retries=20 \ + CMD wget --spider -q "http://127.0.0.1:$HEALTHCHECK_PORT/actuator/health" || exit 1 diff --git a/gradle/docker.gradle b/gradle/docker.gradle index 95e0d6bff2b..0d2c9d263d9 100644 --- a/gradle/docker.gradle +++ b/gradle/docker.gradle @@ -33,6 +33,23 @@ tasks.register('docker') { dependsOn("dockerPrepare") } +// Builds the slim Docker image for local development. +// Single platform, no push, tagged as tolgee/tolgee:slim. +// Uses Dockerfile.slim — JRE-only base, no embedded postgres. +tasks.register('dockerSlim') { + doLast { + exec { + workingDir dockerPath + commandLine "docker", "build", ".", + "-f", "Dockerfile.slim", + "-t", "tolgee/tolgee:slim", + "--build-arg", "OTEL_AGENT_VERSION=${opentelemetryJavaagentVersion}", + "--cache-from", "type=registry,ref=tolgee/tolgee:slim" + } + } + dependsOn("dockerPrepare") +} + // Builds and pushes multi-platform Docker image for CI. // Reads configuration from environment variables: // - VERSION: image tag version (default: 'latest') @@ -69,6 +86,42 @@ task dockerPublish { dependsOn("dockerPrepare") } +// Builds and pushes the multi-platform slim Docker image for CI. +// Uses Dockerfile.slim — JRE-only base, no embedded postgres. +// Tag mapping: +// - VERSION=latest -> tolgee/tolgee:slim (floating slim tag) +// - VERSION=vX.Y.Z -> tolgee/tolgee:vX.Y.Z-slim (versioned slim tag) +// Other env vars match dockerPublish (DOCKER_IMAGE, DOCKER_CACHE_FROM, DOCKER_CACHE_TO). +task dockerPublishSlim { + doLast { + def version = System.getenv('VERSION') ?: 'latest' + def imageName = System.getenv('DOCKER_IMAGE') ?: 'tolgee/tolgee' + def tag = version == 'latest' ? "${imageName}:slim" : "${imageName}:${version}-slim" + def cacheFrom = System.getenv('DOCKER_CACHE_FROM') + def cacheTo = System.getenv('DOCKER_CACHE_TO') + + def commandParams = ["docker", "buildx", "build", ".", + "-f", "Dockerfile.slim", + "-t", tag, + "--build-arg", "OTEL_AGENT_VERSION=${opentelemetryJavaagentVersion}", + "--platform", "linux/arm64,linux/amd64", + "--push"] + + if (cacheFrom) { + commandParams += ["--cache-from", cacheFrom] + } + if (cacheTo) { + commandParams += ["--cache-to", cacheTo] + } + + exec { + workingDir dockerPath + commandLine commandParams + } + } + dependsOn("dockerPrepare") +} + tasks.register('cleanDocker') { doLast { delete(dockerPath) From 448a8bebe2a840b70c0b215a9b38ba219b63297e Mon Sep 17 00:00:00 2001 From: Daniel Krizan Date: Wed, 27 May 2026 09:41:29 +0200 Subject: [PATCH 02/10] chore: build slim release image without registry cache MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Match #3676's policy for the default image — relying on the registry layer cache pins the apk layer to the previously published image and masks CVE fixes. Drop DOCKER_CACHE_FROM from both dockerPublishSlim invocations so each release re-resolves apk packages. --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9b304b68ce3..7d738a5b84d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -63,8 +63,8 @@ jobs: docker buildx create --use ./gradlew dockerPublish VERSION=latest ./gradlew dockerPublish - DOCKER_CACHE_FROM=type=registry,ref=tolgee/tolgee:slim ./gradlew dockerPublishSlim - VERSION=latest DOCKER_CACHE_FROM=type=registry,ref=tolgee/tolgee:slim ./gradlew dockerPublishSlim + ./gradlew dockerPublishSlim + VERSION=latest ./gradlew dockerPublishSlim env: VERSION: ${{ steps.version.outputs.VERSION }} TOLGEE_API_KEY: ${{secrets.TOLGEE_API_KEY}} From 9e5051f345116a49f8c16eda57335ddcce43a647 Mon Sep 17 00:00:00 2001 From: Daniel Krizan Date: Mon, 1 Jun 2026 16:40:28 +0200 Subject: [PATCH 03/10] ci: add slim docker smoke test job Build the slim image, run it against a real postgres service container, and wait for /actuator/health to report UP. Catches regressions where a change works on the default postgres-based image but breaks on slim (missing native deps, JRE-distribution divergence, autostart assumptions in startup code, etc.). --- .github/workflows/test.yml | 68 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 052a682498b..a676a0369db 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -496,6 +496,69 @@ jobs: run: npm run eslint working-directory: ./email + docker-slim-smoke: + name: Slim Docker smoke 🐳 + needs: [backend-build] + runs-on: ubuntu-24.04 + services: + postgres: + image: postgres:13 + env: + POSTGRES_PASSWORD: postgres + POSTGRES_DB: postgres + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 5s + --health-timeout 3s + --health-retries 10 + steps: + - uses: actions/checkout@v4 + + - name: Setup environment + uses: ./.github/actions/setup-env + with: + node: "false" + + - name: Download backend build result + uses: ./.github/actions/download-backend-build + + - name: Build slim Docker image + run: ./gradlew dockerSlim + env: + SKIP_SERVER_BUILD: true + + # The slim image bundles no postgres server — must connect to the service + # container above. `--network host` puts the app on the runner's network + # so localhost:5432 resolves to the mapped postgres port. + - name: Start slim image + run: | + docker run -d --name tolgee-slim --network host \ + -e SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/postgres \ + -e SPRING_DATASOURCE_USERNAME=postgres \ + -e SPRING_DATASOURCE_PASSWORD=postgres \ + tolgee/tolgee:slim + + - name: Wait for app to report healthy + run: | + for i in $(seq 1 90); do + status=$(curl -fsS http://localhost:8080/actuator/health 2>/dev/null \ + | sed -n 's/.*"status":"\([^"]*\)".*/\1/p') + if [ "$status" = "UP" ]; then + echo "Slim image healthy after $((i * 2))s" + exit 0 + fi + echo "[$i] status=${status:-}; retrying in 2s" + sleep 2 + done + echo "❌ Slim image did not report UP within 180s" + exit 1 + + - name: Dump container logs on failure + if: failure() + run: docker logs tolgee-slim || true + everything-passed: name: Everything passed 🎉 needs: @@ -508,6 +571,7 @@ jobs: - schema-check - migration-check - data-cy-check + - docker-slim-smoke - e2e - e2e-code-checks - e2e-install-deps @@ -550,6 +614,10 @@ jobs: failed_jobs+=("data-cy-check") fi + if [[ "${{ needs.docker-slim-smoke.result }}" != "success" ]]; then + failed_jobs+=("docker-slim-smoke") + fi + if [[ "${{ needs.e2e.result }}" != "success" ]]; then failed_jobs+=("e2e") fi From 52ecf79470a022cb7cef9b8dd347f64a41e567a7 Mon Sep 17 00:00:00 2001 From: Daniel Krizan Date: Tue, 9 Jun 2026 10:06:34 +0200 Subject: [PATCH 04/10] ci: use jq to parse actuator health status in slim smoke test --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a676a0369db..93067339042 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -544,7 +544,7 @@ jobs: run: | for i in $(seq 1 90); do status=$(curl -fsS http://localhost:8080/actuator/health 2>/dev/null \ - | sed -n 's/.*"status":"\([^"]*\)".*/\1/p') + | jq -r '.status // empty') if [ "$status" = "UP" ]; then echo "Slim image healthy after $((i * 2))s" exit 0 From 2fe6cfe4bfff6bb4fee7e3ff784848574e6374b2 Mon Sep 17 00:00:00 2001 From: Daniel Krizan Date: Wed, 17 Jun 2026 16:23:25 +0200 Subject: [PATCH 05/10] Update .github/workflows/test.yml Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .github/workflows/test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 93067339042..2fdded469d3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -500,6 +500,8 @@ jobs: name: Slim Docker smoke 🐳 needs: [backend-build] runs-on: ubuntu-24.04 + permissions: + contents: read services: postgres: image: postgres:13 From c5f9e425049553a1bb4411919acb9ebaa4da73e5 Mon Sep 17 00:00:00 2001 From: Daniel Krizan Date: Wed, 8 Jul 2026 11:07:38 +0200 Subject: [PATCH 06/10] feat: warn on startup that embedded postgres is deprecated The bundled PostgreSQL will be removed once the slim image becomes the default tolgee/tolgee image. Warn operators running the embedded server so they can migrate to an external database before that change. --- ...dedPostgresDeprecationCommandLineRunner.kt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 backend/app/src/main/kotlin/io/tolgee/commandLineRunners/EmbeddedPostgresDeprecationCommandLineRunner.kt diff --git a/backend/app/src/main/kotlin/io/tolgee/commandLineRunners/EmbeddedPostgresDeprecationCommandLineRunner.kt b/backend/app/src/main/kotlin/io/tolgee/commandLineRunners/EmbeddedPostgresDeprecationCommandLineRunner.kt new file mode 100644 index 00000000000..422d413d093 --- /dev/null +++ b/backend/app/src/main/kotlin/io/tolgee/commandLineRunners/EmbeddedPostgresDeprecationCommandLineRunner.kt @@ -0,0 +1,27 @@ +package io.tolgee.commandLineRunners + +import io.tolgee.configuration.tolgee.PostgresAutostartProperties +import io.tolgee.configuration.tolgee.PostgresAutostartProperties.PostgresAutostartMode +import org.slf4j.LoggerFactory +import org.springframework.boot.CommandLineRunner +import org.springframework.stereotype.Component + +@Component +class EmbeddedPostgresDeprecationCommandLineRunner( + private val postgresAutostartProperties: PostgresAutostartProperties, +) : CommandLineRunner { + private val logger = LoggerFactory.getLogger(this::class.java) + + override fun run(vararg args: String) { + if (!postgresAutostartProperties.enabled || postgresAutostartProperties.mode != PostgresAutostartMode.EMBEDDED) { + return + } + + logger.warn( + "The embedded PostgreSQL bundled in the tolgee/tolgee image is deprecated and will be removed in a future " + + "major version. Migrate to an external database and use the slim tolgee/tolgee image. " + + "See https://docs.tolgee.io/platform/self_hosting/running_with_docker" + + "#running-with-docker-compose-with-external-postgresql-database", + ) + } +} From 548c5445c176bd0dc23cfdcf19ff4f627a40e148 Mon Sep 17 00:00:00 2001 From: Daniel Krizan Date: Thu, 16 Jul 2026 15:44:20 +0200 Subject: [PATCH 07/10] chore: keep the slim image internal and name v4 in the deprecation warning The slim image is no longer published to Docker Hub. Self-hosters migrate by pointing the current image at an external database, which the fat image already supports, so a public slim tag would only advertise a name that becomes obsolete once v4 drops the bundled postgres. The image is still built on demand by the EE image build and the smoke test, so dockerSlim stays and dockerPublishSlim goes. --- .github/workflows/release.yml | 2 - ...dedPostgresDeprecationCommandLineRunner.kt | 4 +- gradle/docker.gradle | 46 ++----------------- 3 files changed, 7 insertions(+), 45 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7d738a5b84d..b590025aa31 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -63,8 +63,6 @@ jobs: docker buildx create --use ./gradlew dockerPublish VERSION=latest ./gradlew dockerPublish - ./gradlew dockerPublishSlim - VERSION=latest ./gradlew dockerPublishSlim env: VERSION: ${{ steps.version.outputs.VERSION }} TOLGEE_API_KEY: ${{secrets.TOLGEE_API_KEY}} diff --git a/backend/app/src/main/kotlin/io/tolgee/commandLineRunners/EmbeddedPostgresDeprecationCommandLineRunner.kt b/backend/app/src/main/kotlin/io/tolgee/commandLineRunners/EmbeddedPostgresDeprecationCommandLineRunner.kt index 422d413d093..446a5c0412e 100644 --- a/backend/app/src/main/kotlin/io/tolgee/commandLineRunners/EmbeddedPostgresDeprecationCommandLineRunner.kt +++ b/backend/app/src/main/kotlin/io/tolgee/commandLineRunners/EmbeddedPostgresDeprecationCommandLineRunner.kt @@ -18,8 +18,8 @@ class EmbeddedPostgresDeprecationCommandLineRunner( } logger.warn( - "The embedded PostgreSQL bundled in the tolgee/tolgee image is deprecated and will be removed in a future " + - "major version. Migrate to an external database and use the slim tolgee/tolgee image. " + + "The embedded PostgreSQL bundled in the tolgee/tolgee image is deprecated and will be removed in Tolgee v4. " + + "Migrate to an external database before upgrading. " + "See https://docs.tolgee.io/platform/self_hosting/running_with_docker" + "#running-with-docker-compose-with-external-postgresql-database", ) diff --git a/gradle/docker.gradle b/gradle/docker.gradle index 0d2c9d263d9..3ae4be3389a 100644 --- a/gradle/docker.gradle +++ b/gradle/docker.gradle @@ -33,9 +33,10 @@ tasks.register('docker') { dependsOn("dockerPrepare") } -// Builds the slim Docker image for local development. -// Single platform, no push, tagged as tolgee/tolgee:slim. -// Uses Dockerfile.slim — JRE-only base, no embedded postgres. +// Builds the slim Docker image, tagged as tolgee/tolgee:slim. +// Uses Dockerfile.slim - JRE-only base, no embedded postgres. +// The slim image is not published; it is built on demand by the EE image +// build in the billing repo and by the slim smoke test. tasks.register('dockerSlim') { doLast { exec { @@ -43,8 +44,7 @@ tasks.register('dockerSlim') { commandLine "docker", "build", ".", "-f", "Dockerfile.slim", "-t", "tolgee/tolgee:slim", - "--build-arg", "OTEL_AGENT_VERSION=${opentelemetryJavaagentVersion}", - "--cache-from", "type=registry,ref=tolgee/tolgee:slim" + "--build-arg", "OTEL_AGENT_VERSION=${opentelemetryJavaagentVersion}" } } dependsOn("dockerPrepare") @@ -86,42 +86,6 @@ task dockerPublish { dependsOn("dockerPrepare") } -// Builds and pushes the multi-platform slim Docker image for CI. -// Uses Dockerfile.slim — JRE-only base, no embedded postgres. -// Tag mapping: -// - VERSION=latest -> tolgee/tolgee:slim (floating slim tag) -// - VERSION=vX.Y.Z -> tolgee/tolgee:vX.Y.Z-slim (versioned slim tag) -// Other env vars match dockerPublish (DOCKER_IMAGE, DOCKER_CACHE_FROM, DOCKER_CACHE_TO). -task dockerPublishSlim { - doLast { - def version = System.getenv('VERSION') ?: 'latest' - def imageName = System.getenv('DOCKER_IMAGE') ?: 'tolgee/tolgee' - def tag = version == 'latest' ? "${imageName}:slim" : "${imageName}:${version}-slim" - def cacheFrom = System.getenv('DOCKER_CACHE_FROM') - def cacheTo = System.getenv('DOCKER_CACHE_TO') - - def commandParams = ["docker", "buildx", "build", ".", - "-f", "Dockerfile.slim", - "-t", tag, - "--build-arg", "OTEL_AGENT_VERSION=${opentelemetryJavaagentVersion}", - "--platform", "linux/arm64,linux/amd64", - "--push"] - - if (cacheFrom) { - commandParams += ["--cache-from", cacheFrom] - } - if (cacheTo) { - commandParams += ["--cache-to", cacheTo] - } - - exec { - workingDir dockerPath - commandLine commandParams - } - } - dependsOn("dockerPrepare") -} - tasks.register('cleanDocker') { doLast { delete(dockerPath) From ca5498b88c3d989e52ce00e7eb37722409bb7358 Mon Sep 17 00:00:00 2001 From: Daniel Krizan Date: Thu, 16 Jul 2026 16:07:15 +0200 Subject: [PATCH 08/10] docs: mark EMBEDDED postgres autostart mode as deprecated Only the EMBEDDED mode goes away in v4. DOCKER mode stays, as it is how Tolgee starts postgres when running with Java, so the deprecation is scoped to the mode rather than the whole postgres-autostart config. --- .../configuration/tolgee/PostgresAutostartProperties.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/backend/data/src/main/kotlin/io/tolgee/configuration/tolgee/PostgresAutostartProperties.kt b/backend/data/src/main/kotlin/io/tolgee/configuration/tolgee/PostgresAutostartProperties.kt index a2a3f3efb4f..478b76cdb74 100644 --- a/backend/data/src/main/kotlin/io/tolgee/configuration/tolgee/PostgresAutostartProperties.kt +++ b/backend/data/src/main/kotlin/io/tolgee/configuration/tolgee/PostgresAutostartProperties.kt @@ -21,7 +21,13 @@ class PostgresAutostartProperties { "This is default option when running Tolgee using Java. " + "See [Running with Java](/self_hosting/running_with_java.mdx).\n" + "- `EMBEDDED` - Tolgee tries to run it's embedded PostgreSQL " + - "which is bundled in the `tolgee/tolgee` Docker image.", + "which is bundled in the `tolgee/tolgee` Docker image.\n" + + "\n" + + "`EMBEDDED` is deprecated. Tolgee v4 removes the bundled PostgreSQL from the " + + "`tolgee/tolgee` image, so setups using it have to move to an external database " + + "before upgrading. See " + + "[Running with Docker](/self_hosting/running_with_docker" + + "#running-with-docker-compose-with-external-postgresql-database).", ) var mode: PostgresAutostartMode = PostgresAutostartMode.DOCKER From b289936b8cb6e5da802ee8a712d8d1c75e4af044 Mon Sep 17 00:00:00 2001 From: Daniel Krizan Date: Fri, 17 Jul 2026 11:43:39 +0200 Subject: [PATCH 09/10] docs: point the postgres deprecation notices at the migration guide The notices linked the external database section, which sets up an empty database on postgres:15. That is the wrong target for the people the notices reach: a bundled database is postgres:13, and postgres:15 refuses to start on its files. --- .../EmbeddedPostgresDeprecationCommandLineRunner.kt | 2 +- .../configuration/tolgee/PostgresAutostartProperties.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/app/src/main/kotlin/io/tolgee/commandLineRunners/EmbeddedPostgresDeprecationCommandLineRunner.kt b/backend/app/src/main/kotlin/io/tolgee/commandLineRunners/EmbeddedPostgresDeprecationCommandLineRunner.kt index 446a5c0412e..913e5e87e29 100644 --- a/backend/app/src/main/kotlin/io/tolgee/commandLineRunners/EmbeddedPostgresDeprecationCommandLineRunner.kt +++ b/backend/app/src/main/kotlin/io/tolgee/commandLineRunners/EmbeddedPostgresDeprecationCommandLineRunner.kt @@ -21,7 +21,7 @@ class EmbeddedPostgresDeprecationCommandLineRunner( "The embedded PostgreSQL bundled in the tolgee/tolgee image is deprecated and will be removed in Tolgee v4. " + "Migrate to an external database before upgrading. " + "See https://docs.tolgee.io/platform/self_hosting/running_with_docker" + - "#running-with-docker-compose-with-external-postgresql-database", + "#migrate-from-the-bundled-database", ) } } diff --git a/backend/data/src/main/kotlin/io/tolgee/configuration/tolgee/PostgresAutostartProperties.kt b/backend/data/src/main/kotlin/io/tolgee/configuration/tolgee/PostgresAutostartProperties.kt index 478b76cdb74..6e5cb5d4aa2 100644 --- a/backend/data/src/main/kotlin/io/tolgee/configuration/tolgee/PostgresAutostartProperties.kt +++ b/backend/data/src/main/kotlin/io/tolgee/configuration/tolgee/PostgresAutostartProperties.kt @@ -26,8 +26,8 @@ class PostgresAutostartProperties { "`EMBEDDED` is deprecated. Tolgee v4 removes the bundled PostgreSQL from the " + "`tolgee/tolgee` image, so setups using it have to move to an external database " + "before upgrading. See " + - "[Running with Docker](/self_hosting/running_with_docker" + - "#running-with-docker-compose-with-external-postgresql-database).", + "[Migrate from the bundled database](/self_hosting/running_with_docker" + + "#migrate-from-the-bundled-database).", ) var mode: PostgresAutostartMode = PostgresAutostartMode.DOCKER From 9ef40c2e6f4c9a7248c06799941714850272f710 Mon Sep 17 00:00:00 2001 From: Daniel Krizan Date: Fri, 17 Jul 2026 12:01:56 +0200 Subject: [PATCH 10/10] ci: smoke test the slim image against postgres 17 Postgres 13 went end of life in November 2025. The backend test suite already runs against 16.3 via the docker autostart runner, so 17 is a small step from what is tested today, and it is the version the self hosting docs point at. --- .github/workflows/test.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2fdded469d3..177dbf16e18 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -504,7 +504,7 @@ jobs: contents: read services: postgres: - image: postgres:13 + image: postgres:17 env: POSTGRES_PASSWORD: postgres POSTGRES_DB: postgres @@ -531,9 +531,6 @@ jobs: env: SKIP_SERVER_BUILD: true - # The slim image bundles no postgres server — must connect to the service - # container above. `--network host` puts the app on the runner's network - # so localhost:5432 resolves to the mapped postgres port. - name: Start slim image run: | docker run -d --name tolgee-slim --network host \