Dokploy

Postiz

Postiz is a modern, open-source platform for managing and publishing content across multiple channels.

Postiz logo

Configuration

version: "3.8"

services:
  postiz-app:
    image: ghcr.io/gitroomhq/postiz-app:latest
    restart: always

    environment:
      MAIN_URL: "https://${POSTIZ_HOST}"
      FRONTEND_URL: "https://${POSTIZ_HOST}"
      NEXT_PUBLIC_BACKEND_URL: "https://${POSTIZ_HOST}/api"
      JWT_SECRET: ${JWT_SECRET}
      DATABASE_URL: "postgresql://${DB_USER}:${DB_PASSWORD}@postiz-postgres:5432/${DB_NAME}"
      REDIS_URL: "redis://postiz-redis:6379"
      BACKEND_INTERNAL_URL: "http://localhost:3000"
      TEMPORAL_ADDRESS: "temporal:7233"
      IS_GENERAL: "true"
      DISABLE_REGISTRATION: "false"
      RUN_CRON: "true"
      NOT_SECURED: "true"
      STORAGE_PROVIDER: "local"
      UPLOAD_DIRECTORY: "/uploads"
      NEXT_PUBLIC_UPLOAD_DIRECTORY: "/uploads"

      # === Social Media API Settings ===
      # These variables should be defined in the Dokploy Environment tab.
      # For more configuration options and details, please refer to the official documentation.
      FACEBOOK_APP_ID: ${FACEBOOK_APP_ID}
      FACEBOOK_APP_SECRET: ${FACEBOOK_APP_SECRET}
      LINKEDIN_CLIENT_ID: ${LINKEDIN_CLIENT_ID}
      LINKEDIN_CLIENT_SECRET: ${LINKEDIN_CLIENT_SECRET}
      X_API_KEY: ${X_API_KEY}
      X_API_SECRET: ${X_API_SECRET}

    volumes:
      - postiz-config:/config/
      - postiz-uploads:/uploads/
    depends_on:
      postiz-postgres:
        condition: service_healthy
      postiz-redis:
        condition: service_healthy
      temporal:
        condition: service_started

  postiz-postgres:
    image: postgres:17-alpine
    restart: always

    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USER}
      POSTGRES_DB: ${DB_NAME}
    volumes:
      - postgres-volume:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"]
      interval: 10s
      timeout: 3s
      retries: 3
      start_period: 10s

  postiz-redis:
    image: redis:7.2
    restart: always

    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 3s
      retries: 3
    volumes:
      - postiz-redis-data:/data

  temporal-elasticsearch:
    image: elasticsearch:7.17.27
    environment:
      - cluster.routing.allocation.disk.threshold_enabled=true
      - cluster.routing.allocation.disk.watermark.low=512mb
      - cluster.routing.allocation.disk.watermark.high=256mb
      - cluster.routing.allocation.disk.watermark.flood_stage=128mb
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms256m -Xmx256m
      - xpack.security.enabled=false
    volumes:
      - temporal-es-data:/usr/share/elasticsearch/data

  temporal-postgresql:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: ${TEMPORAL_PASSWORD}
      POSTGRES_USER: ${TEMPORAL_USER}
    volumes:
      - temporal-pg-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${TEMPORAL_USER}"]
      interval: 10s
      timeout: 5s
      retries: 5

  temporal:
    image: temporalio/auto-setup:1.28.1
    depends_on:
      temporal-postgresql:
        condition: service_healthy
      temporal-elasticsearch:
        condition: service_started
    environment:
      - DB=postgres12
      - DB_PORT=5432
      - POSTGRES_USER=${TEMPORAL_USER}
      - POSTGRES_PWD=${TEMPORAL_PASSWORD}
      - POSTGRES_SEEDS=temporal-postgresql
      - ENABLE_ES=true
      - ES_SEEDS=temporal-elasticsearch
      - ES_VERSION=v7
      - TEMPORAL_NAMESPACE=default
    healthcheck:
      test: ["CMD", "tctl", "--address", "127.0.0.1:7233", "workflow", "list"]
      interval: 15s
      timeout: 10s
      retries: 30
      start_period: 120s

volumes:
  postgres-volume:
  postiz-redis-data:
  postiz-config:
  postiz-uploads:
  temporal-es-data:
  temporal-pg-data:
[variables]
main_domain = "${domain}"
db_password = "${password}"
db_user = "postiz"
db_name = "postiz"
temporal_password = "${password}"
temporal_user = "temporal"
jwt_secret = "${base64:32}"

[config]
env = [
    "POSTIZ_HOST=${main_domain}",
    "JWT_SECRET=${jwt_secret}",
    "DB_USER=${db_user}",
    "DB_PASSWORD=${db_password}",
    "DB_NAME=${db_name}",
    "TEMPORAL_USER=${temporal_user}",
    "TEMPORAL_PASSWORD=${temporal_password}",
    "FACEBOOK_APP_ID=",
    "FACEBOOK_APP_SECRET=",
    "LINKEDIN_CLIENT_ID=",
    "LINKEDIN_CLIENT_SECRET=",
    "X_API_KEY=",
    "X_API_SECRET="
]
mounts = []

[[config.domains]]
serviceName = "postiz-app"
port = 5000
host = "${main_domain}"

Base64

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

ewogICJjb21wb3NlIjogInZlcnNpb246IFwiMy44XCJcblxuc2VydmljZXM6XG4gIHBvc3Rpei1hcHA6XG4gICAgaW1hZ2U6IGdoY3IuaW8vZ2l0cm9vbWhxL3Bvc3Rpei1hcHA6bGF0ZXN0XG4gICAgcmVzdGFydDogYWx3YXlzXG5cbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIE1BSU5fVVJMOiBcImh0dHBzOi8vJHtQT1NUSVpfSE9TVH1cIlxuICAgICAgRlJPTlRFTkRfVVJMOiBcImh0dHBzOi8vJHtQT1NUSVpfSE9TVH1cIlxuICAgICAgTkVYVF9QVUJMSUNfQkFDS0VORF9VUkw6IFwiaHR0cHM6Ly8ke1BPU1RJWl9IT1NUfS9hcGlcIlxuICAgICAgSldUX1NFQ1JFVDogJHtKV1RfU0VDUkVUfVxuICAgICAgREFUQUJBU0VfVVJMOiBcInBvc3RncmVzcWw6Ly8ke0RCX1VTRVJ9OiR7REJfUEFTU1dPUkR9QHBvc3Rpei1wb3N0Z3Jlczo1NDMyLyR7REJfTkFNRX1cIlxuICAgICAgUkVESVNfVVJMOiBcInJlZGlzOi8vcG9zdGl6LXJlZGlzOjYzNzlcIlxuICAgICAgQkFDS0VORF9JTlRFUk5BTF9VUkw6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwXCJcbiAgICAgIFRFTVBPUkFMX0FERFJFU1M6IFwidGVtcG9yYWw6NzIzM1wiXG4gICAgICBJU19HRU5FUkFMOiBcInRydWVcIlxuICAgICAgRElTQUJMRV9SRUdJU1RSQVRJT046IFwiZmFsc2VcIlxuICAgICAgUlVOX0NST046IFwidHJ1ZVwiXG4gICAgICBOT1RfU0VDVVJFRDogXCJ0cnVlXCJcbiAgICAgIFNUT1JBR0VfUFJPVklERVI6IFwibG9jYWxcIlxuICAgICAgVVBMT0FEX0RJUkVDVE9SWTogXCIvdXBsb2Fkc1wiXG4gICAgICBORVhUX1BVQkxJQ19VUExPQURfRElSRUNUT1JZOiBcIi91cGxvYWRzXCJcbiAgICAgIFxuICAgICAgIyA9PT0gU29jaWFsIE1lZGlhIEFQSSBTZXR0aW5ncyA9PT1cbiAgICAgICMgVGhlc2UgdmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGluIHRoZSBEb2twbG95IEVudmlyb25tZW50IHRhYi5cbiAgICAgICMgRm9yIG1vcmUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFuZCBkZXRhaWxzLCBwbGVhc2UgcmVmZXIgdG8gdGhlIG9mZmljaWFsIGRvY3VtZW50YXRpb24uXG4gICAgICBGQUNFQk9PS19BUFBfSUQ6ICR7RkFDRUJPT0tfQVBQX0lEfVxuICAgICAgRkFDRUJPT0tfQVBQX1NFQ1JFVDogJHtGQUNFQk9PS19BUFBfU0VDUkVUfVxuICAgICAgTElOS0VESU5fQ0xJRU5UX0lEOiAke0xJTktFRElOX0NMSUVOVF9JRH1cbiAgICAgIExJTktFRElOX0NMSUVOVF9TRUNSRVQ6ICR7TElOS0VESU5fQ0xJRU5UX1NFQ1JFVH1cbiAgICAgIFhfQVBJX0tFWTogJHtYX0FQSV9LRVl9XG4gICAgICBYX0FQSV9TRUNSRVQ6ICR7WF9BUElfU0VDUkVUfVxuXG4gICAgdm9sdW1lczpcbiAgICAgIC0gcG9zdGl6LWNvbmZpZzovY29uZmlnL1xuICAgICAgLSBwb3N0aXotdXBsb2FkczovdXBsb2Fkcy9cbiAgICBkZXBlbmRzX29uOlxuICAgICAgcG9zdGl6LXBvc3RncmVzOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgICAgcG9zdGl6LXJlZGlzOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgICAgdGVtcG9yYWw6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9zdGFydGVkXG5cbiAgcG9zdGl6LXBvc3RncmVzOlxuICAgIGltYWdlOiBwb3N0Z3JlczoxNy1hbHBpbmVcbiAgICByZXN0YXJ0OiBhbHdheXNcblxuICAgIGVudmlyb25tZW50OlxuICAgICAgUE9TVEdSRVNfUEFTU1dPUkQ6ICR7REJfUEFTU1dPUkR9XG4gICAgICBQT1NUR1JFU19VU0VSOiAke0RCX1VTRVJ9XG4gICAgICBQT1NUR1JFU19EQjogJHtEQl9OQU1FfVxuICAgIHZvbHVtZXM6XG4gICAgICAtIHBvc3RncmVzLXZvbHVtZTovdmFyL2xpYi9wb3N0Z3Jlc3FsL2RhdGFcbiAgICBoZWFsdGhjaGVjazpcbiAgICAgIHRlc3Q6IFtcIkNNRC1TSEVMTFwiLCBcInBnX2lzcmVhZHkgLVUgJHtEQl9VU0VSfSAtZCAke0RCX05BTUV9XCJdXG4gICAgICBpbnRlcnZhbDogMTBzXG4gICAgICB0aW1lb3V0OiAzc1xuICAgICAgcmV0cmllczogM1xuICAgICAgc3RhcnRfcGVyaW9kOiAxMHNcblxuICBwb3N0aXotcmVkaXM6XG4gICAgaW1hZ2U6IHJlZGlzOjcuMlxuICAgIHJlc3RhcnQ6IGFsd2F5c1xuXG4gICAgaGVhbHRoY2hlY2s6XG4gICAgICB0ZXN0OiBbXCJDTURcIiwgXCJyZWRpcy1jbGlcIiwgXCJwaW5nXCJdXG4gICAgICBpbnRlcnZhbDogMTBzXG4gICAgICB0aW1lb3V0OiAzc1xuICAgICAgcmV0cmllczogM1xuICAgIHZvbHVtZXM6XG4gICAgICAtIHBvc3Rpei1yZWRpcy1kYXRhOi9kYXRhXG5cbiAgdGVtcG9yYWwtZWxhc3RpY3NlYXJjaDpcbiAgICBpbWFnZTogZWxhc3RpY3NlYXJjaDo3LjE3LjI3XG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIGNsdXN0ZXIucm91dGluZy5hbGxvY2F0aW9uLmRpc2sudGhyZXNob2xkX2VuYWJsZWQ9dHJ1ZVxuICAgICAgLSBjbHVzdGVyLnJvdXRpbmcuYWxsb2NhdGlvbi5kaXNrLndhdGVybWFyay5sb3c9NTEybWJcbiAgICAgIC0gY2x1c3Rlci5yb3V0aW5nLmFsbG9jYXRpb24uZGlzay53YXRlcm1hcmsuaGlnaD0yNTZtYlxuICAgICAgLSBjbHVzdGVyLnJvdXRpbmcuYWxsb2NhdGlvbi5kaXNrLndhdGVybWFyay5mbG9vZF9zdGFnZT0xMjhtYlxuICAgICAgLSBkaXNjb3ZlcnkudHlwZT1zaW5nbGUtbm9kZVxuICAgICAgLSBFU19KQVZBX09QVFM9LVhtczI1Nm0gLVhteDI1Nm1cbiAgICAgIC0geHBhY2suc2VjdXJpdHkuZW5hYmxlZD1mYWxzZVxuICAgIHZvbHVtZXM6XG4gICAgICAtIHRlbXBvcmFsLWVzLWRhdGE6L3Vzci9zaGFyZS9lbGFzdGljc2VhcmNoL2RhdGFcblxuICB0ZW1wb3JhbC1wb3N0Z3Jlc3FsOlxuICAgIGltYWdlOiBwb3N0Z3JlczoxNlxuICAgIGVudmlyb25tZW50OlxuICAgICAgUE9TVEdSRVNfUEFTU1dPUkQ6ICR7VEVNUE9SQUxfUEFTU1dPUkR9XG4gICAgICBQT1NUR1JFU19VU0VSOiAke1RFTVBPUkFMX1VTRVJ9XG4gICAgdm9sdW1lczpcbiAgICAgIC0gdGVtcG9yYWwtcGctZGF0YTovdmFyL2xpYi9wb3N0Z3Jlc3FsL2RhdGFcbiAgICBoZWFsdGhjaGVjazpcbiAgICAgIHRlc3Q6IFtcIkNNRC1TSEVMTFwiLCBcInBnX2lzcmVhZHkgLVUgJHtURU1QT1JBTF9VU0VSfVwiXVxuICAgICAgaW50ZXJ2YWw6IDEwc1xuICAgICAgdGltZW91dDogNXNcbiAgICAgIHJldHJpZXM6IDVcblxuICB0ZW1wb3JhbDpcbiAgICBpbWFnZTogdGVtcG9yYWxpby9hdXRvLXNldHVwOjEuMjguMVxuICAgIGRlcGVuZHNfb246XG4gICAgICB0ZW1wb3JhbC1wb3N0Z3Jlc3FsOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgICAgdGVtcG9yYWwtZWxhc3RpY3NlYXJjaDpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX3N0YXJ0ZWRcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gREI9cG9zdGdyZXMxMlxuICAgICAgLSBEQl9QT1JUPTU0MzJcbiAgICAgIC0gUE9TVEdSRVNfVVNFUj0ke1RFTVBPUkFMX1VTRVJ9XG4gICAgICAtIFBPU1RHUkVTX1BXRD0ke1RFTVBPUkFMX1BBU1NXT1JEfVxuICAgICAgLSBQT1NUR1JFU19TRUVEUz10ZW1wb3JhbC1wb3N0Z3Jlc3FsXG4gICAgICAtIEVOQUJMRV9FUz10cnVlXG4gICAgICAtIEVTX1NFRURTPXRlbXBvcmFsLWVsYXN0aWNzZWFyY2hcbiAgICAgIC0gRVNfVkVSU0lPTj12N1xuICAgICAgLSBURU1QT1JBTF9OQU1FU1BBQ0U9ZGVmYXVsdFxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDogW1wiQ01EXCIsIFwidGN0bFwiLCBcIi0tYWRkcmVzc1wiLCBcIjEyNy4wLjAuMTo3MjMzXCIsIFwid29ya2Zsb3dcIiwgXCJsaXN0XCJdXG4gICAgICBpbnRlcnZhbDogMTVzXG4gICAgICB0aW1lb3V0OiAxMHNcbiAgICAgIHJldHJpZXM6IDMwXG4gICAgICBzdGFydF9wZXJpb2Q6IDEyMHNcblxudm9sdW1lczpcbiAgcG9zdGdyZXMtdm9sdW1lOlxuICBwb3N0aXotcmVkaXMtZGF0YTpcbiAgcG9zdGl6LWNvbmZpZzpcbiAgcG9zdGl6LXVwbG9hZHM6XG4gIHRlbXBvcmFsLWVzLWRhdGE6XG4gIHRlbXBvcmFsLXBnLWRhdGE6IiwKICAiY29uZmlnIjogIlt2YXJpYWJsZXNdXG5tYWluX2RvbWFpbiA9IFwiJHtkb21haW59XCJcbmRiX3Bhc3N3b3JkID0gXCIke3Bhc3N3b3JkfVwiXG5kYl91c2VyID0gXCJwb3N0aXpcIlxuZGJfbmFtZSA9IFwicG9zdGl6XCJcbnRlbXBvcmFsX3Bhc3N3b3JkID0gXCIke3Bhc3N3b3JkfVwiXG50ZW1wb3JhbF91c2VyID0gXCJ0ZW1wb3JhbFwiXG5qd3Rfc2VjcmV0ID0gXCIke2Jhc2U2NDozMn1cIlxuXG5bY29uZmlnXVxuZW52ID0gW1xuICAgIFwiUE9TVElaX0hPU1Q9JHttYWluX2RvbWFpbn1cIixcbiAgICBcIkpXVF9TRUNSRVQ9JHtqd3Rfc2VjcmV0fVwiLFxuICAgIFwiREJfVVNFUj0ke2RiX3VzZXJ9XCIsXG4gICAgXCJEQl9QQVNTV09SRD0ke2RiX3Bhc3N3b3JkfVwiLFxuICAgIFwiREJfTkFNRT0ke2RiX25hbWV9XCIsXG4gICAgXCJURU1QT1JBTF9VU0VSPSR7dGVtcG9yYWxfdXNlcn1cIixcbiAgICBcIlRFTVBPUkFMX1BBU1NXT1JEPSR7dGVtcG9yYWxfcGFzc3dvcmR9XCIsXG4gICAgXCJGQUNFQk9PS19BUFBfSUQ9XCIsXG4gICAgXCJGQUNFQk9PS19BUFBfU0VDUkVUPVwiLFxuICAgIFwiTElOS0VESU5fQ0xJRU5UX0lEPVwiLFxuICAgIFwiTElOS0VESU5fQ0xJRU5UX1NFQ1JFVD1cIixcbiAgICBcIlhfQVBJX0tFWT1cIixcbiAgICBcIlhfQVBJX1NFQ1JFVD1cIlxuXVxubW91bnRzID0gW11cblxuW1tjb25maWcuZG9tYWluc11dXG5zZXJ2aWNlTmFtZSA9IFwicG9zdGl6LWFwcFwiXG5wb3J0ID0gNTAwMFxuaG9zdCA9IFwiJHttYWluX2RvbWFpbn1cIlxuIgp9

Tags

cms, content-management, publishing


Version: latest

On this page