Dokploy

TREK

A minimalist, self-hosted trip planner with Kanban-style task boards, budgets, packing lists, interactive maps, real-time collaboration, and OIDC single sign-on.

TREK logo

Configuration

services:
  trek:
    image: mauriceboe/trek:3.3.0
    restart: unless-stopped
    environment:
      - NODE_ENV=production
      - PORT=3000
      # Encryption key for secrets at rest. Persisted via the env below so it
      # survives container recreation.
      - ENCRYPTION_KEY=${ENCRYPTION_KEY}
      - TZ=${TZ:-UTC}
      - LOG_LEVEL=${LOG_LEVEL:-info}
      # Public base URL, used for links in notifications and required for OIDC
      - APP_URL=${APP_URL}
      # Comma-separated origins for CORS and email notification links
      - ALLOWED_ORIGINS=${ALLOWED_ORIGINS}
      # Initial admin credentials, only used on first boot when no users exist
      - ADMIN_EMAIL=${ADMIN_EMAIL}
      - ADMIN_PASSWORD=${ADMIN_PASSWORD}
    volumes:
      - trek-data:/app/data
      - trek-uploads:/app/uploads
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://localhost:3000/api/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 15s

volumes:
  trek-data:
  trek-uploads:
[variables]
main_domain = "${domain}"
encryption_key = "${password:64}"
admin_email = "${email}"
admin_password = "${password:16}"

[config]
[[config.domains]]
serviceName = "trek"
port = 3000
host = "${main_domain}"

[config.env]
# Encryption key for secrets at rest (equivalent to `openssl rand -hex 32`)
"ENCRYPTION_KEY" = "${encryption_key}"
# Timezone for logs, reminders and scheduled tasks (e.g. Europe/Berlin)
"TZ" = "UTC"
# info = concise user actions; debug = verbose admin-level details
"LOG_LEVEL" = "info"
# Public base URL, used for links in notifications and required for OIDC.
# Change to https:// once you enable SSL on the domain.
"APP_URL" = "http://${main_domain}"
# Comma-separated origins for CORS and email notification links
"ALLOWED_ORIGINS" = "http://${main_domain}"
# Initial admin credentials, only used on first boot when no users exist
"ADMIN_EMAIL" = "${admin_email}"
"ADMIN_PASSWORD" = "${admin_password}"

# --- Optional: OIDC single sign-on (Google, Apple, Authentik, Keycloak, ...) ---
# "OIDC_ISSUER" = "https://auth.example.com"
# "OIDC_CLIENT_ID" = "trek"
# "OIDC_CLIENT_SECRET" = "supersecret"
# "OIDC_DISPLAY_NAME" = "SSO"
# "OIDC_ONLY" = "false"
# "OIDC_SCOPE" = "openid email profile"
# "OIDC_ADMIN_CLAIM" = "groups"
# "OIDC_ADMIN_VALUE" = "app-trek-admins"
# "OIDC_DISCOVERY_URL" = ""

# --- Optional: extras ---
# Default language on the login page (de, en, es, fr, hu, nl, br, cs, pl, ru, zh, zh-TW, it, ar, ...)
# "DEFAULT_LANGUAGE" = "en"
# How long users stay logged in (1h | 12h | 7d | 30d | 90d). Default: 24h
# "SESSION_DURATION" = "30d"
# Unsplash Access Key for trip-cover / place-image search
# "UNSPLASH_ACCESS_KEY" = ""

Base64

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

ewogICJjb21wb3NlIjogInNlcnZpY2VzOlxuICB0cmVrOlxuICAgIGltYWdlOiBtYXVyaWNlYm9lL3RyZWs6My4zLjBcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGVudmlyb25tZW50OlxuICAgICAgLSBOT0RFX0VOVj1wcm9kdWN0aW9uXG4gICAgICAtIFBPUlQ9MzAwMFxuICAgICAgIyBFbmNyeXB0aW9uIGtleSBmb3Igc2VjcmV0cyBhdCByZXN0LiBQZXJzaXN0ZWQgdmlhIHRoZSBlbnYgYmVsb3cgc28gaXRcbiAgICAgICMgc3Vydml2ZXMgY29udGFpbmVyIHJlY3JlYXRpb24uXG4gICAgICAtIEVOQ1JZUFRJT05fS0VZPSR7RU5DUllQVElPTl9LRVl9XG4gICAgICAtIFRaPSR7VFo6LVVUQ31cbiAgICAgIC0gTE9HX0xFVkVMPSR7TE9HX0xFVkVMOi1pbmZvfVxuICAgICAgIyBQdWJsaWMgYmFzZSBVUkwsIHVzZWQgZm9yIGxpbmtzIGluIG5vdGlmaWNhdGlvbnMgYW5kIHJlcXVpcmVkIGZvciBPSURDXG4gICAgICAtIEFQUF9VUkw9JHtBUFBfVVJMfVxuICAgICAgIyBDb21tYS1zZXBhcmF0ZWQgb3JpZ2lucyBmb3IgQ09SUyBhbmQgZW1haWwgbm90aWZpY2F0aW9uIGxpbmtzXG4gICAgICAtIEFMTE9XRURfT1JJR0lOUz0ke0FMTE9XRURfT1JJR0lOU31cbiAgICAgICMgSW5pdGlhbCBhZG1pbiBjcmVkZW50aWFscywgb25seSB1c2VkIG9uIGZpcnN0IGJvb3Qgd2hlbiBubyB1c2VycyBleGlzdFxuICAgICAgLSBBRE1JTl9FTUFJTD0ke0FETUlOX0VNQUlMfVxuICAgICAgLSBBRE1JTl9QQVNTV09SRD0ke0FETUlOX1BBU1NXT1JEfVxuICAgIHZvbHVtZXM6XG4gICAgICAtIHRyZWstZGF0YTovYXBwL2RhdGFcbiAgICAgIC0gdHJlay11cGxvYWRzOi9hcHAvdXBsb2Fkc1xuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDogW1wiQ01EXCIsIFwid2dldFwiLCBcIi1xTy1cIiwgXCJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpL2hlYWx0aFwiXVxuICAgICAgaW50ZXJ2YWw6IDMwc1xuICAgICAgdGltZW91dDogMTBzXG4gICAgICByZXRyaWVzOiAzXG4gICAgICBzdGFydF9wZXJpb2Q6IDE1c1xuXG52b2x1bWVzOlxuICB0cmVrLWRhdGE6XG4gIHRyZWstdXBsb2FkczpcbiIsCiAgImNvbmZpZyI6ICJbdmFyaWFibGVzXVxubWFpbl9kb21haW4gPSBcIiR7ZG9tYWlufVwiXG5lbmNyeXB0aW9uX2tleSA9IFwiJHtwYXNzd29yZDo2NH1cIlxuYWRtaW5fZW1haWwgPSBcIiR7ZW1haWx9XCJcbmFkbWluX3Bhc3N3b3JkID0gXCIke3Bhc3N3b3JkOjE2fVwiXG5cbltjb25maWddXG5bW2NvbmZpZy5kb21haW5zXV1cbnNlcnZpY2VOYW1lID0gXCJ0cmVrXCJcbnBvcnQgPSAzMDAwXG5ob3N0ID0gXCIke21haW5fZG9tYWlufVwiXG5cbltjb25maWcuZW52XVxuIyBFbmNyeXB0aW9uIGtleSBmb3Igc2VjcmV0cyBhdCByZXN0IChlcXVpdmFsZW50IHRvIGBvcGVuc3NsIHJhbmQgLWhleCAzMmApXG5cIkVOQ1JZUFRJT05fS0VZXCIgPSBcIiR7ZW5jcnlwdGlvbl9rZXl9XCJcbiMgVGltZXpvbmUgZm9yIGxvZ3MsIHJlbWluZGVycyBhbmQgc2NoZWR1bGVkIHRhc2tzIChlLmcuIEV1cm9wZS9CZXJsaW4pXG5cIlRaXCIgPSBcIlVUQ1wiXG4jIGluZm8gPSBjb25jaXNlIHVzZXIgYWN0aW9uczsgZGVidWcgPSB2ZXJib3NlIGFkbWluLWxldmVsIGRldGFpbHNcblwiTE9HX0xFVkVMXCIgPSBcImluZm9cIlxuIyBQdWJsaWMgYmFzZSBVUkwsIHVzZWQgZm9yIGxpbmtzIGluIG5vdGlmaWNhdGlvbnMgYW5kIHJlcXVpcmVkIGZvciBPSURDLlxuIyBDaGFuZ2UgdG8gaHR0cHM6Ly8gb25jZSB5b3UgZW5hYmxlIFNTTCBvbiB0aGUgZG9tYWluLlxuXCJBUFBfVVJMXCIgPSBcImh0dHA6Ly8ke21haW5fZG9tYWlufVwiXG4jIENvbW1hLXNlcGFyYXRlZCBvcmlnaW5zIGZvciBDT1JTIGFuZCBlbWFpbCBub3RpZmljYXRpb24gbGlua3NcblwiQUxMT1dFRF9PUklHSU5TXCIgPSBcImh0dHA6Ly8ke21haW5fZG9tYWlufVwiXG4jIEluaXRpYWwgYWRtaW4gY3JlZGVudGlhbHMsIG9ubHkgdXNlZCBvbiBmaXJzdCBib290IHdoZW4gbm8gdXNlcnMgZXhpc3RcblwiQURNSU5fRU1BSUxcIiA9IFwiJHthZG1pbl9lbWFpbH1cIlxuXCJBRE1JTl9QQVNTV09SRFwiID0gXCIke2FkbWluX3Bhc3N3b3JkfVwiXG5cbiMgLS0tIE9wdGlvbmFsOiBPSURDIHNpbmdsZSBzaWduLW9uIChHb29nbGUsIEFwcGxlLCBBdXRoZW50aWssIEtleWNsb2FrLCAuLi4pIC0tLVxuIyBcIk9JRENfSVNTVUVSXCIgPSBcImh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbVwiXG4jIFwiT0lEQ19DTElFTlRfSURcIiA9IFwidHJla1wiXG4jIFwiT0lEQ19DTElFTlRfU0VDUkVUXCIgPSBcInN1cGVyc2VjcmV0XCJcbiMgXCJPSURDX0RJU1BMQVlfTkFNRVwiID0gXCJTU09cIlxuIyBcIk9JRENfT05MWVwiID0gXCJmYWxzZVwiXG4jIFwiT0lEQ19TQ09QRVwiID0gXCJvcGVuaWQgZW1haWwgcHJvZmlsZVwiXG4jIFwiT0lEQ19BRE1JTl9DTEFJTVwiID0gXCJncm91cHNcIlxuIyBcIk9JRENfQURNSU5fVkFMVUVcIiA9IFwiYXBwLXRyZWstYWRtaW5zXCJcbiMgXCJPSURDX0RJU0NPVkVSWV9VUkxcIiA9IFwiXCJcblxuIyAtLS0gT3B0aW9uYWw6IGV4dHJhcyAtLS1cbiMgRGVmYXVsdCBsYW5ndWFnZSBvbiB0aGUgbG9naW4gcGFnZSAoZGUsIGVuLCBlcywgZnIsIGh1LCBubCwgYnIsIGNzLCBwbCwgcnUsIHpoLCB6aC1UVywgaXQsIGFyLCAuLi4pXG4jIFwiREVGQVVMVF9MQU5HVUFHRVwiID0gXCJlblwiXG4jIEhvdyBsb25nIHVzZXJzIHN0YXkgbG9nZ2VkIGluICgxaCB8IDEyaCB8IDdkIHwgMzBkIHwgOTBkKS4gRGVmYXVsdDogMjRoXG4jIFwiU0VTU0lPTl9EVVJBVElPTlwiID0gXCIzMGRcIlxuIyBVbnNwbGFzaCBBY2Nlc3MgS2V5IGZvciB0cmlwLWNvdmVyIC8gcGxhY2UtaW1hZ2Ugc2VhcmNoXG4jIFwiVU5TUExBU0hfQUNDRVNTX0tFWVwiID0gXCJcIlxuIgp9

Tags

travel, planning, productivity


Version: 3.3.0

On this page