mirror of
https://github.com/coollabsio/coolify.git
synced 2026-03-11 08:55:47 +00:00
290 lines
9.5 KiB
YAML
290 lines
9.5 KiB
YAML
# documentation: https://docs.postiz.com
|
|
# slogan: Open source social media scheduling tool.
|
|
# category: analytics
|
|
# tags: post everywhere, social media, planning
|
|
# logo: svgs/postiz.svg
|
|
# port: 5000
|
|
|
|
configs:
|
|
temporal-dynamicconfig:
|
|
content: "system.forceSearchAttributesCacheRefreshOnRead:\n - value: true\n constraints: {}\nlimit.maxIDLength:\n - value: 255\n constraints: {}\nfrontend.keepAliveMaxConnectionAge:\n - value: 5m\n constraints: {}\nfrontend.keepAliveMaxConnectionAgeGrace:\n - value: 70s\n constraints: {}\nfrontend.enableReadVisibilityFromES:\n - value: true\n constraints:\n namespace: default\nhistory.defaultActivityRetryPolicy:\n - value:\n InitialIntervalInSeconds: 1\n MaximumIntervalCoefficient: 100.0\n BackoffCoefficient: 2.0\n MaximumAttempts: 0\n"
|
|
services:
|
|
postiz:
|
|
image: ghcr.io/gitroomhq/postiz-app:v2.19.0
|
|
environment:
|
|
- SERVICE_URL_POSTIZ_5000
|
|
- MAIN_URL=${SERVICE_URL_POSTIZ}
|
|
- FRONTEND_URL=${SERVICE_URL_POSTIZ}
|
|
- NEXT_PUBLIC_BACKEND_URL=${SERVICE_URL_POSTIZ}/api
|
|
- JWT_SECRET=${SERVICE_PASSWORD_JWTSECRET}
|
|
- DATABASE_URL=postgresql://postgres:${SERVICE_PASSWORD_POSTGRESQL}@postgres:5432/${POSTGRESQL_DATABASE:-postiz-db}
|
|
- REDIS_URL=redis://default:${SERVICE_PASSWORD_REDIS}@redis:6379
|
|
- BACKEND_INTERNAL_URL=http://localhost:3000
|
|
- TEMPORAL_ADDRESS=temporal:7233
|
|
- DISABLE_REGISTRATION=${DISABLE_REGISTRATION:-false}
|
|
- RUN_CRON=${RUN_CRON:-true}
|
|
|
|
# Cloudflare R2 Settings
|
|
- CLOUDFLARE_ACCOUNT_ID=${CLOUDFLARE_ACCOUNT_ID}
|
|
- CLOUDFLARE_ACCESS_KEY=${CLOUDFLARE_ACCESS_KEY}
|
|
- CLOUDFLARE_SECRET_ACCESS_KEY=${CLOUDFLARE_SECRET_ACCESS_KEY}
|
|
- CLOUDFLARE_BUCKETNAME=${CLOUDFLARE_BUCKETNAME}
|
|
- CLOUDFLARE_BUCKET_URL=${CLOUDFLARE_BUCKET_URL}
|
|
- CLOUDFLARE_REGION=${CLOUDFLARE_REGION}
|
|
|
|
# Storage Settings
|
|
- STORAGE_PROVIDER=${STORAGE_PROVIDER:-local}
|
|
- UPLOAD_DIRECTORY=${UPLOAD_DIRECTORY:-/uploads}
|
|
- NEXT_PUBLIC_UPLOAD_DIRECTORY=${NEXT_PUBLIC_UPLOAD_DIRECTORY:-/uploads}
|
|
- NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY=${NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY}
|
|
|
|
# Email Settings
|
|
- RESEND_API_KEY=${RESEND_API_KEY}
|
|
- EMAIL_FROM_ADDRESS=${EMAIL_FROM_ADDRESS}
|
|
- EMAIL_FROM_NAME=${EMAIL_FROM_NAME}
|
|
- EMAIL_PROVIDER=${EMAIL_PROVIDER}
|
|
|
|
# Social Media API Settings
|
|
- X_API_KEY=${SERVICE_X_API}
|
|
- X_API_SECRET=${SERVICE_X_SECRET}
|
|
- LINKEDIN_CLIENT_ID=${SERVICE_LINKEDIN_ID}
|
|
- LINKEDIN_CLIENT_SECRET=${SERVICE_LINKEDIN_SECRET}
|
|
- REDDIT_CLIENT_ID=${SERVICE_REDDIT_API}
|
|
- REDDIT_CLIENT_SECRET=${SERVICE_REDDIT_SECRET}
|
|
- GITHUB_CLIENT_ID=${SERVICE_GITHUB_ID}
|
|
- GITHUB_CLIENT_SECRET=${SERVICE_GITHUB_SECRET}
|
|
- THREADS_APP_ID=${SERVICE_THREADS_ID}
|
|
- THREADS_APP_SECRET=${SERVICE_THREADS_SECRET}
|
|
- FACEBOOK_APP_ID=${SERVICE_FACEBOOK_ID}
|
|
- FACEBOOK_APP_SECRET=${SERVICE_FACEBOOK_SECRET}
|
|
- YOUTUBE_CLIENT_ID=${SERVICE_YOUTUBE_ID}
|
|
- YOUTUBE_CLIENT_SECRET=${SERVICE_YOUTUBE_SECRET}
|
|
- TIKTOK_CLIENT_ID=${SERVICE_TIKTOK_ID}
|
|
- TIKTOK_CLIENT_SECRET=${SERVICE_TIKTOK_SECRET}
|
|
- PINTEREST_CLIENT_ID=${SERVICE_PINTEREST_ID}
|
|
- PINTEREST_CLIENT_SECRET=${SERVICE_PINTEREST_SECRET}
|
|
- DRIBBBLE_CLIENT_ID=${SERVICE_DRIBBLE_ID}
|
|
- DRIBBBLE_CLIENT_SECRET=${SERVICE_DRIBBLE_SECRET}
|
|
- DISCORD_CLIENT_ID=${SERVICE_DISCORD_ID}
|
|
- DISCORD_CLIENT_SECRET=${SERVICE_DISCORD_SECRET}
|
|
- DISCORD_BOT_TOKEN_ID=${SERVICE_DISCORD_TOKEN}
|
|
- SLACK_ID=${SERVICE_SLACK_ID}
|
|
- SLACK_SECRET=${SERVICE_SLACK_SECRET}
|
|
- SLACK_SIGNING_SECRET=${SLACK_SIGNING_SECRET}
|
|
- MASTODON_CLIENT_ID=${SERVICE_MASTODON_ID}
|
|
- MASTODON_CLIENT_SECRET=${SERVICE_MASTODON_SECRET}
|
|
- INSTAGRAM_APP_ID=${INSTAGRAM_APP_ID}
|
|
- INSTAGRAM_APP_SECRET=${INSTAGRAM_APP_SECRET}
|
|
|
|
# Integration APIs
|
|
- BEEHIIVE_API_KEY=${SERVICE_BEEHIIVE_KEY}
|
|
- BEEHIIVE_PUBLICATION_ID=${SERVICE_BEEHIIVE_PUBID}
|
|
- OPENAI_API_KEY=${SERVICE_OPENAI_KEY}
|
|
|
|
# Misc Settings
|
|
- NEXT_PUBLIC_DISCORD_SUPPORT=${NEXT_PUBLIC_DISCORD_SUPPORT}
|
|
- NEXT_PUBLIC_POLOTNO=${NEXT_PUBLIC_POLOTNO}
|
|
- IS_GENERAL=${IS_GENERAL:-true}
|
|
- NX_ADD_PLUGINS=${NX_ADD_PLUGINS:-false}
|
|
- NOT_SECURED=${NOT_SECURED:-false}
|
|
|
|
# Payment Settings
|
|
- FEE_AMOUNT=${FEE_AMOUNT:-0.05}
|
|
- STRIPE_PUBLISHABLE_KEY=${STRIPE_PUBLISHABLE_KEY}
|
|
- STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY}
|
|
- STRIPE_SIGNING_KEY=${STRIPE_SIGNING_KEY}
|
|
- STRIPE_SIGNING_KEY_CONNECT=${STRIPE_SIGNING_KEY_CONNECT}
|
|
|
|
expose:
|
|
- 5000
|
|
volumes:
|
|
- postiz_config:/config/
|
|
- postiz_uploads:/uploads/
|
|
networks:
|
|
- postiz-network
|
|
- temporal-network
|
|
depends_on:
|
|
postgres:
|
|
condition: service_healthy
|
|
redis:
|
|
condition: service_healthy
|
|
healthcheck:
|
|
test:
|
|
- CMD-SHELL
|
|
- "node -e \"require('http').get('http://localhost:5000/', (r) => { process.exit(r.statusCode < 400 ? 0 : 1) }).on('error', () => process.exit(1))\""
|
|
interval: 5s
|
|
timeout: 20s
|
|
retries: 10
|
|
|
|
postgres:
|
|
image: postgres:17-alpine
|
|
volumes:
|
|
- postiz_postgresql_data:/var/lib/postgresql/data
|
|
environment:
|
|
- POSTGRES_USER=postgres
|
|
- POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRESQL}
|
|
- POSTGRES_DB=${POSTGRESQL_DATABASE:-postiz-db}
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB:-postiz-db}"]
|
|
interval: 5s
|
|
timeout: 20s
|
|
retries: 10
|
|
|
|
redis:
|
|
image: redis:7.2
|
|
environment:
|
|
- REDIS_PASSWORD=${SERVICE_PASSWORD_REDIS}
|
|
command: redis-server --requirepass ${SERVICE_PASSWORD_REDIS}
|
|
volumes:
|
|
- postiz_redis_data:/data
|
|
healthcheck:
|
|
test:
|
|
- CMD
|
|
- redis-cli
|
|
- -a
|
|
- ${SERVICE_PASSWORD_REDIS}
|
|
- ping
|
|
interval: 5s
|
|
timeout: 10s
|
|
retries: 20
|
|
spotlight:
|
|
pull_policy: always
|
|
container_name: spotlight
|
|
ports:
|
|
- '8969:8969/tcp'
|
|
image: 'ghcr.io/getsentry/spotlight:latest'
|
|
networks:
|
|
- postiz-network
|
|
healthcheck:
|
|
test:
|
|
- CMD-SHELL
|
|
- "bash -c 'echo > /dev/tcp/localhost/8969'"
|
|
interval: 5s
|
|
timeout: 10s
|
|
retries: 10
|
|
temporal-elasticsearch:
|
|
container_name: 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
|
|
networks:
|
|
- temporal-network
|
|
expose:
|
|
- 9200
|
|
volumes:
|
|
- 'temporal_es_data:/var/lib/elasticsearch/data'
|
|
healthcheck:
|
|
test:
|
|
- CMD-SHELL
|
|
- 'curl -sf "http://localhost:9200/_cluster/health?wait_for_status=yellow&timeout=5s" || exit 1'
|
|
interval: 10s
|
|
timeout: 10s
|
|
retries: 15
|
|
start_period: 30s
|
|
temporal-postgresql:
|
|
container_name: temporal-postgresql
|
|
image: 'postgres:16'
|
|
environment:
|
|
- 'POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES}'
|
|
- 'POSTGRES_USER=${SERVICE_USER_POSTGRES}'
|
|
networks:
|
|
- temporal-network
|
|
expose:
|
|
- 5432
|
|
volumes:
|
|
- 'temporal_pg_data:/var/lib/postgresql/data'
|
|
healthcheck:
|
|
test:
|
|
- CMD-SHELL
|
|
- 'pg_isready -U $${POSTGRES_USER}'
|
|
interval: 5s
|
|
timeout: 20s
|
|
retries: 10
|
|
temporal:
|
|
container_name: temporal
|
|
ports:
|
|
- '7233:7233'
|
|
image: 'temporalio/auto-setup:1.28.1'
|
|
configs:
|
|
-
|
|
source: temporal-dynamicconfig
|
|
target: /etc/temporal/config/dynamicconfig/development-sql.yaml
|
|
depends_on:
|
|
- temporal-postgresql
|
|
- temporal-elasticsearch
|
|
environment:
|
|
- DB=postgres12
|
|
- DB_PORT=5432
|
|
- 'POSTGRES_USER=${SERVICE_USER_POSTGRES}'
|
|
- 'POSTGRES_PWD=${SERVICE_PASSWORD_POSTGRES}'
|
|
- 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
|
|
- tctl
|
|
- '--address'
|
|
- 'localhost:7233'
|
|
- cluster
|
|
- health
|
|
interval: 10s
|
|
timeout: 10s
|
|
retries: 30
|
|
start_period: 120s
|
|
temporal-admin-tools:
|
|
container_name: temporal-admin-tools
|
|
image: 'temporalio/admin-tools:1.28.1-tctl-1.18.4-cli-1.4.1'
|
|
environment:
|
|
- 'TEMPORAL_ADDRESS=temporal:7233'
|
|
- 'TEMPORAL_CLI_ADDRESS=temporal:7233'
|
|
networks:
|
|
- temporal-network
|
|
stdin_open: true
|
|
depends_on:
|
|
- temporal
|
|
tty: true
|
|
healthcheck:
|
|
test:
|
|
- CMD
|
|
- tctl
|
|
- cluster
|
|
- health
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 5
|
|
start_period: 30s
|
|
temporal-ui:
|
|
container_name: temporal-ui
|
|
image: 'temporalio/ui:2.34.0'
|
|
environment:
|
|
- 'TEMPORAL_ADDRESS=temporal:7233'
|
|
- 'TEMPORAL_CORS_ORIGINS=http://localhost:3000'
|
|
networks:
|
|
- temporal-network
|
|
ports:
|
|
- '8082:8080'
|
|
healthcheck:
|
|
test:
|
|
- CMD-SHELL
|
|
- 'wget -q --spider http://localhost:8080 || exit 1'
|
|
interval: 5s
|
|
timeout: 10s
|
|
retries: 10
|
|
start_period: 15s
|
|
networks:
|
|
postiz-network:
|
|
external: false
|
|
temporal-network:
|
|
driver: bridge
|