Dokploy

Weblate

Weblate is a libre web-based continuous localization platform with tight version control integration, quality checks, and support for over 50 file formats including PO, XLIFF, JSON, and Android resources.

Weblate logo

Configuration

services:
  weblate:
    image: weblate/weblate:2026.7.1.1
    restart: unless-stopped
    depends_on:
      database:
        condition: service_healthy
      cache:
        condition: service_healthy
    volumes:
      - weblate-data:/app/data
      - weblate-cache:/app/cache
    tmpfs:
      - /run
      - /tmp
    environment:
      WEBLATE_SITE_DOMAIN: ${WEBLATE_SITE_DOMAIN}
      WEBLATE_SITE_TITLE: ${WEBLATE_SITE_TITLE}
      WEBLATE_ADMIN_NAME: ${WEBLATE_ADMIN_NAME}
      WEBLATE_ADMIN_EMAIL: ${WEBLATE_ADMIN_EMAIL}
      WEBLATE_ADMIN_PASSWORD: ${WEBLATE_ADMIN_PASSWORD}
      WEBLATE_SERVER_EMAIL: ${WEBLATE_SERVER_EMAIL}
      WEBLATE_DEFAULT_FROM_EMAIL: ${WEBLATE_DEFAULT_FROM_EMAIL}
      WEBLATE_ENABLE_HTTPS: ${WEBLATE_ENABLE_HTTPS}
      WEBLATE_ALLOWED_HOSTS: "*"
      WEBLATE_REGISTRATION_OPEN: ${WEBLATE_REGISTRATION_OPEN}
      POSTGRES_HOST: database
      POSTGRES_PORT: 5432
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
      REDIS_HOST: cache
      REDIS_PORT: 6379

  database:
    image: postgres:18-alpine
    restart: unless-stopped
    volumes:
      - weblate-postgres-data:/var/lib/postgresql
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 10s
      timeout: 5s
      retries: 5

  cache:
    image: redis:8-alpine
    restart: unless-stopped
    command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"]
    volumes:
      - weblate-redis-data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  weblate-data:
  weblate-cache:
  weblate-postgres-data:
  weblate-redis-data:
[variables]
main_domain = "${domain}"
admin_password = "${password:32}"
postgres_password = "${password:32}"

[config]
env = [
  "WEBLATE_SITE_DOMAIN=${main_domain}",
  "WEBLATE_SITE_TITLE=Weblate",
  "WEBLATE_ADMIN_NAME=Weblate Admin",
  "WEBLATE_ADMIN_EMAIL=admin@${main_domain}",
  "WEBLATE_ADMIN_PASSWORD=${admin_password}",
  "WEBLATE_SERVER_EMAIL=weblate@${main_domain}",
  "WEBLATE_DEFAULT_FROM_EMAIL=weblate@${main_domain}",
  "WEBLATE_ENABLE_HTTPS=0",
  "WEBLATE_REGISTRATION_OPEN=1",
  "POSTGRES_USER=weblate",
  "POSTGRES_PASSWORD=${postgres_password}",
  "POSTGRES_DB=weblate",
]
mounts = []

[[config.domains]]
serviceName = "weblate"
port = 8080
host = "${main_domain}"

Base64

To import this template in Dokploy: create a Compose service → AdvancedBase64 import and paste the content below:

ewogICJjb21wb3NlIjogInNlcnZpY2VzOlxuICB3ZWJsYXRlOlxuICAgIGltYWdlOiB3ZWJsYXRlL3dlYmxhdGU6MjAyNi43LjEuMVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIGRhdGFiYXNlOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgICAgY2FjaGU6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5XG4gICAgdm9sdW1lczpcbiAgICAgIC0gd2VibGF0ZS1kYXRhOi9hcHAvZGF0YVxuICAgICAgLSB3ZWJsYXRlLWNhY2hlOi9hcHAvY2FjaGVcbiAgICB0bXBmczpcbiAgICAgIC0gL3J1blxuICAgICAgLSAvdG1wXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICBXRUJMQVRFX1NJVEVfRE9NQUlOOiAke1dFQkxBVEVfU0lURV9ET01BSU59XG4gICAgICBXRUJMQVRFX1NJVEVfVElUTEU6ICR7V0VCTEFURV9TSVRFX1RJVExFfVxuICAgICAgV0VCTEFURV9BRE1JTl9OQU1FOiAke1dFQkxBVEVfQURNSU5fTkFNRX1cbiAgICAgIFdFQkxBVEVfQURNSU5fRU1BSUw6ICR7V0VCTEFURV9BRE1JTl9FTUFJTH1cbiAgICAgIFdFQkxBVEVfQURNSU5fUEFTU1dPUkQ6ICR7V0VCTEFURV9BRE1JTl9QQVNTV09SRH1cbiAgICAgIFdFQkxBVEVfU0VSVkVSX0VNQUlMOiAke1dFQkxBVEVfU0VSVkVSX0VNQUlMfVxuICAgICAgV0VCTEFURV9ERUZBVUxUX0ZST01fRU1BSUw6ICR7V0VCTEFURV9ERUZBVUxUX0ZST01fRU1BSUx9XG4gICAgICBXRUJMQVRFX0VOQUJMRV9IVFRQUzogJHtXRUJMQVRFX0VOQUJMRV9IVFRQU31cbiAgICAgIFdFQkxBVEVfQUxMT1dFRF9IT1NUUzogXCIqXCJcbiAgICAgIFdFQkxBVEVfUkVHSVNUUkFUSU9OX09QRU46ICR7V0VCTEFURV9SRUdJU1RSQVRJT05fT1BFTn1cbiAgICAgIFBPU1RHUkVTX0hPU1Q6IGRhdGFiYXNlXG4gICAgICBQT1NUR1JFU19QT1JUOiA1NDMyXG4gICAgICBQT1NUR1JFU19VU0VSOiAke1BPU1RHUkVTX1VTRVJ9XG4gICAgICBQT1NUR1JFU19QQVNTV09SRDogJHtQT1NUR1JFU19QQVNTV09SRH1cbiAgICAgIFBPU1RHUkVTX0RCOiAke1BPU1RHUkVTX0RCfVxuICAgICAgUkVESVNfSE9TVDogY2FjaGVcbiAgICAgIFJFRElTX1BPUlQ6IDYzNzlcblxuICBkYXRhYmFzZTpcbiAgICBpbWFnZTogcG9zdGdyZXM6MTgtYWxwaW5lXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICB2b2x1bWVzOlxuICAgICAgLSB3ZWJsYXRlLXBvc3RncmVzLWRhdGE6L3Zhci9saWIvcG9zdGdyZXNxbFxuICAgIGVudmlyb25tZW50OlxuICAgICAgUE9TVEdSRVNfVVNFUjogJHtQT1NUR1JFU19VU0VSfVxuICAgICAgUE9TVEdSRVNfUEFTU1dPUkQ6ICR7UE9TVEdSRVNfUEFTU1dPUkR9XG4gICAgICBQT1NUR1JFU19EQjogJHtQT1NUR1JFU19EQn1cbiAgICBoZWFsdGhjaGVjazpcbiAgICAgIHRlc3Q6IFtcIkNNRC1TSEVMTFwiLCBcInBnX2lzcmVhZHkgLVUgJCR7UE9TVEdSRVNfVVNFUn0gLWQgJCR7UE9TVEdSRVNfREJ9XCJdXG4gICAgICBpbnRlcnZhbDogMTBzXG4gICAgICB0aW1lb3V0OiA1c1xuICAgICAgcmV0cmllczogNVxuXG4gIGNhY2hlOlxuICAgIGltYWdlOiByZWRpczo4LWFscGluZVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgY29tbWFuZDogW1wicmVkaXMtc2VydmVyXCIsIFwiLS1zYXZlXCIsIFwiNjBcIiwgXCIxXCIsIFwiLS1sb2dsZXZlbFwiLCBcIndhcm5pbmdcIl1cbiAgICB2b2x1bWVzOlxuICAgICAgLSB3ZWJsYXRlLXJlZGlzLWRhdGE6L2RhdGFcbiAgICBoZWFsdGhjaGVjazpcbiAgICAgIHRlc3Q6IFtcIkNNRFwiLCBcInJlZGlzLWNsaVwiLCBcInBpbmdcIl1cbiAgICAgIGludGVydmFsOiAxMHNcbiAgICAgIHRpbWVvdXQ6IDVzXG4gICAgICByZXRyaWVzOiA1XG5cbnZvbHVtZXM6XG4gIHdlYmxhdGUtZGF0YTpcbiAgd2VibGF0ZS1jYWNoZTpcbiAgd2VibGF0ZS1wb3N0Z3Jlcy1kYXRhOlxuICB3ZWJsYXRlLXJlZGlzLWRhdGE6XG4iLAogICJjb25maWciOiAiW3ZhcmlhYmxlc11cbm1haW5fZG9tYWluID0gXCIke2RvbWFpbn1cIlxuYWRtaW5fcGFzc3dvcmQgPSBcIiR7cGFzc3dvcmQ6MzJ9XCJcbnBvc3RncmVzX3Bhc3N3b3JkID0gXCIke3Bhc3N3b3JkOjMyfVwiXG5cbltjb25maWddXG5lbnYgPSBbXG4gIFwiV0VCTEFURV9TSVRFX0RPTUFJTj0ke21haW5fZG9tYWlufVwiLFxuICBcIldFQkxBVEVfU0lURV9USVRMRT1XZWJsYXRlXCIsXG4gIFwiV0VCTEFURV9BRE1JTl9OQU1FPVdlYmxhdGUgQWRtaW5cIixcbiAgXCJXRUJMQVRFX0FETUlOX0VNQUlMPWFkbWluQCR7bWFpbl9kb21haW59XCIsXG4gIFwiV0VCTEFURV9BRE1JTl9QQVNTV09SRD0ke2FkbWluX3Bhc3N3b3JkfVwiLFxuICBcIldFQkxBVEVfU0VSVkVSX0VNQUlMPXdlYmxhdGVAJHttYWluX2RvbWFpbn1cIixcbiAgXCJXRUJMQVRFX0RFRkFVTFRfRlJPTV9FTUFJTD13ZWJsYXRlQCR7bWFpbl9kb21haW59XCIsXG4gIFwiV0VCTEFURV9FTkFCTEVfSFRUUFM9MFwiLFxuICBcIldFQkxBVEVfUkVHSVNUUkFUSU9OX09QRU49MVwiLFxuICBcIlBPU1RHUkVTX1VTRVI9d2VibGF0ZVwiLFxuICBcIlBPU1RHUkVTX1BBU1NXT1JEPSR7cG9zdGdyZXNfcGFzc3dvcmR9XCIsXG4gIFwiUE9TVEdSRVNfREI9d2VibGF0ZVwiLFxuXVxubW91bnRzID0gW11cblxuW1tjb25maWcuZG9tYWluc11dXG5zZXJ2aWNlTmFtZSA9IFwid2VibGF0ZVwiXG5wb3J0ID0gODA4MFxuaG9zdCA9IFwiJHttYWluX2RvbWFpbn1cIlxuIgp9

Tags

localization, translation, i18n, self-hosted


Version: 2026.7.1.1

On this page