services: postiz: image: ghcr.io/gitroomhq/postiz-app:latest container_name: postiz restart: always environment: # === Required Settings MAIN_URL: 'https://postiz.vyntehome.com' FRONTEND_URL: 'https://postiz.vyntehome.com' NEXT_PUBLIC_BACKEND_URL: 'https://postiz.vyntehome.com/api' JWT_SECRET: ${JWT_SECRET} DATABASE_URL: ${DATABASE_URL} REDIS_URL: ${REDIS_URL} BACKEND_INTERNAL_URL: 'http://localhost:3000' TEMPORAL_ADDRESS: "temporal:7233" IS_GENERAL: 'true' DISABLE_REGISTRATION: 'true' RUN_CRON: 'true' # === Storage Settings STORAGE_PROVIDER: 'local' UPLOAD_DIRECTORY: '/uploads' NEXT_PUBLIC_UPLOAD_DIRECTORY: '/uploads' # === Cloudflare (R2) Settings # STORAGE_PROVIDER: 'cloudflare' # CLOUDFLARE_ACCOUNT_ID: 'your-account-id' # CLOUDFLARE_ACCESS_KEY: 'your-access-key' # CLOUDFLARE_SECRET_ACCESS_KEY: 'your-secret-access-key' # CLOUDFLARE_BUCKETNAME: 'your-bucket-name' # CLOUDFLARE_BUCKET_URL: 'https://your-bucket-url.r2.cloudflarestorage.com/' # CLOUDFLARE_REGION: 'auto' # === Social Media API Settings X_API_KEY: '' X_API_SECRET: '' LINKEDIN_CLIENT_ID: '' LINKEDIN_CLIENT_SECRET: '' REDDIT_CLIENT_ID: '' REDDIT_CLIENT_SECRET: '' GITHUB_CLIENT_ID: '' GITHUB_CLIENT_SECRET: '' BEEHIIVE_API_KEY: '' BEEHIIVE_PUBLICATION_ID: '' THREADS_APP_ID: '' THREADS_APP_SECRET: '' FACEBOOK_APP_ID: '' FACEBOOK_APP_SECRET: '' YOUTUBE_CLIENT_ID: '' YOUTUBE_CLIENT_SECRET: '' TIKTOK_CLIENT_ID: '' TIKTOK_CLIENT_SECRET: '' PINTEREST_CLIENT_ID: '' PINTEREST_CLIENT_SECRET: '' DRIBBBLE_CLIENT_ID: '' DRIBBBLE_CLIENT_SECRET: '' DISCORD_CLIENT_ID: '' DISCORD_CLIENT_SECRET: '' DISCORD_BOT_TOKEN_ID: '' SLACK_ID: '' SLACK_SECRET: '' SLACK_SIGNING_SECRET: '' MASTODON_URL: 'https://mastodon.social' MASTODON_CLIENT_ID: '' MASTODON_CLIENT_SECRET: '' # === OAuth & Authentik Settings NEXT_PUBLIC_POSTIZ_OAUTH_DISPLAY_NAME: 'Authentik' NEXT_PUBLIC_POSTIZ_OAUTH_LOGO_URL: 'https://raw.githubusercontent.com/walkxcode/dashboard-icons/master/png/authentik.png' POSTIZ_GENERIC_OAUTH: 'true' POSTIZ_OAUTH_URL: 'https://authentik.vyntehome.com' POSTIZ_OAUTH_AUTH_URL: 'https://authentik.vyntehome.com/application/o/authorize/' POSTIZ_OAUTH_TOKEN_URL: 'https://authentik.vyntehome.com/application/o/token/' POSTIZ_OAUTH_USERINFO_URL: 'https://authentik.vyntehome.com/application/o/userinfo/' POSTIZ_OAUTH_CLIENT_ID: ${POSTIZ_OAUTH_CLIENT_ID} POSTIZ_OAUTH_CLIENT_SECRET: ${POSTIZ_OAUTH_CLIENT_SECRET} # POSTIZ_OAUTH_SCOPE: "openid profile email" # Optional: uncomment to override default scope EMAIL_PROVIDER: ${EMAIL_PROVIDER} EMAIL_HOST: ${EMAIL_HOST} EMAIL_PORT: ${EMAIL_PORT} EMAIL_SECURE: ${EMAIL_SECURE} EMAIL_USER: ${EMAIL_USER} EMAIL_PASS: ${EMAIL_PASS} EMAIL_FROM_NAME: ${EMAIL_FROM_NAME} EMAIL_FROM_ADDRESS: ${EMAIL_FROM_ADDRESS} # === Sentry # NEXT_PUBLIC_SENTRY_DSN: 'http://spotlight:8969/stream' # SENTRY_SPOTLIGHT: '1' # === Misc Settings OPENAI_API_KEY: '' NEXT_PUBLIC_DISCORD_SUPPORT: '' NEXT_PUBLIC_POLOTNO: '' API_LIMIT: 30 # === Payment / Stripe Settings FEE_AMOUNT: 0.05 STRIPE_PUBLISHABLE_KEY: '' STRIPE_SECRET_KEY: '' STRIPE_SIGNING_KEY: '' STRIPE_SIGNING_KEY_CONNECT: '' # === Developer Settings NX_ADD_PLUGINS: false # === Short Link Service Settings (Optional - leave blank if unused) # DUB_TOKEN: "" # DUB_API_ENDPOINT: "https://api.dub.co" # DUB_SHORT_LINK_DOMAIN: "dub.sh" # SHORT_IO_SECRET_KEY: "" # KUTT_API_KEY: "" # KUTT_API_ENDPOINT: "https://kutt.it/api/v2" # KUTT_SHORT_LINK_DOMAIN: "kutt.it" # LINK_DRIP_API_KEY: "" # LINK_DRIP_API_ENDPOINT: "https://api.linkdrip.com/v1/" # LINK_DRIP_SHORT_LINK_DOMAIN: "dripl.ink" volumes: - postiz-config:/config/ - postiz-uploads:/uploads/ ports: - "4007:5000" networks: - postiz-network - temporal-network healthcheck: test: ["CMD", "node", "-e", "const r=require('http').get('http://localhost:5000/',res=>process.exit(res.statusCode<500?0:1));r.on('error',()=>process.exit(1));r.setTimeout(4000,()=>{r.destroy();process.exit(1)})"] interval: 30s timeout: 10s retries: 5 start_period: 120s depends_on: temporal: condition: service_healthy # For Application Monitoring / Debugging spotlight: profiles: [debug] pull_policy: always container_name: spotlight restart: unless-stopped image: ghcr.io/getsentry/spotlight:latest networks: - postiz-network # ----------------------- # Temporal Stack # ----------------------- temporal-elasticsearch: container_name: temporal-elasticsearch image: elasticsearch:7.17.27 restart: always 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 networks: - temporal-network expose: - 9200 healthcheck: test: ["CMD-SHELL", "curl -fsS \"http://localhost:9200/_cluster/health?wait_for_status=yellow&timeout=5s\" || exit 1"] interval: 10s timeout: 10s retries: 10 start_period: 60s volumes: - temporal-elasticsearch-data:/usr/share/elasticsearch/data temporal-postgresql: container_name: temporal-postgresql image: postgres:16 restart: always environment: POSTGRES_PASSWORD: temporal POSTGRES_USER: temporal networks: - temporal-network expose: - 5432 healthcheck: test: ["CMD-SHELL", "pg_isready -U temporal"] interval: 10s timeout: 5s retries: 5 start_period: 10s volumes: - temporal-postgres-data:/var/lib/postgresql/data temporal: container_name: temporal restart: always image: temporalio/auto-setup:1.28.1 depends_on: temporal-postgresql: condition: service_healthy temporal-elasticsearch: condition: service_healthy environment: - DB=postgres12 - DB_PORT=5432 - POSTGRES_USER=temporal - POSTGRES_PWD=temporal - POSTGRES_SEEDS=temporal-postgresql - DYNAMIC_CONFIG_FILE_PATH=config/dynamicconfig/development-sql.yaml - ENABLE_ES=true - ES_SEEDS=temporal-elasticsearch - ES_VERSION=v7 - TEMPORAL_NAMESPACE=default networks: - temporal-network healthcheck: test: ["CMD", "temporal", "operator", "cluster", "health", "--address", "temporal:7233"] interval: 10s timeout: 5s retries: 10 start_period: 30s volumes: - ./dynamicconfig:/etc/temporal/config/dynamicconfig labels: kompose.volume.type: configMap temporal-admin-tools: container_name: temporal-admin-tools image: temporalio/admin-tools:1.28.1-tctl-1.18.4-cli-1.4.1 restart: on-failure environment: - TEMPORAL_ADDRESS=temporal:7233 - TEMPORAL_CLI_ADDRESS=temporal:7233 networks: - temporal-network stdin_open: true depends_on: temporal: condition: service_healthy tty: true temporal-ui: container_name: temporal-ui image: temporalio/ui:2.34.0 restart: always environment: - TEMPORAL_ADDRESS=temporal:7233 - TEMPORAL_CORS_ORIGINS=http://127.0.0.1:3000 networks: - temporal-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/healthz"] interval: 30s timeout: 5s retries: 5 start_period: 20s depends_on: temporal: condition: service_healthy volumes: postiz-config: external: false postiz-uploads: external: false temporal-postgres-data: external: false temporal-elasticsearch-data: external: false networks: postiz-network: external: false temporal-network: driver: bridge name: temporal-network