fix: readme md
This commit is contained in:
@@ -0,0 +1,317 @@
|
|||||||
|
---
|
||||||
|
title: Docker Compose
|
||||||
|
description: 'Install Postiz using Docker Compose'
|
||||||
|
---
|
||||||
|
|
||||||
|
## Watch the Tutorial for docker-compose install:
|
||||||
|
[https://m.youtube.com/watch?v=A6CjAmJOWvA&t=5s](https://m.youtube.com/watch?v=A6CjAmJOWvA&t=5s)
|
||||||
|
|
||||||
|
## Warning
|
||||||
|
If you are upgrading from Postiz old version, please make sure you update your docker compose, you can read more here:
|
||||||
|
https://github.com/gitroomhq/postiz-app/releases/tag/v2.12.0
|
||||||
|
|
||||||
|
## Docker Compose
|
||||||
|
|
||||||
|
This guide assumes that you have docker installed, with a reasonable amount of resources to run Postiz. This Docker Compose setup has been tested with;
|
||||||
|
|
||||||
|
- Virtual Machine, Ubuntu 24.04, 2Gb RAM, 2 vCPUs.
|
||||||
|
|
||||||
|
<Snippet file="installation-pre-reqs.mdx" />
|
||||||
|
|
||||||
|
### Configuration uses environment variables
|
||||||
|
|
||||||
|
The docker containers for Postiz are entirely configured with environment variables.
|
||||||
|
|
||||||
|
- **Option A** - environment variables in your `docker-compose.yml` file
|
||||||
|
- **Option B** - environment variables in a `postiz.env` file mounted in `/config` for the Postiz container only
|
||||||
|
- **Option C** - environment variables in a `.env` file next to your `docker-compose.yml` file (not recommended).
|
||||||
|
|
||||||
|
... or a mixture of the above options!
|
||||||
|
|
||||||
|
There is a [configuration reference](/configuration/reference) page with a list
|
||||||
|
of configuration settings.
|
||||||
|
|
||||||
|
Setup:
|
||||||
|
```
|
||||||
|
git clone https://github.com/gitroomhq/postiz-docker-compose
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run:
|
||||||
|
```
|
||||||
|
docker compose up
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Example `docker-compose.yml` file
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
postiz:
|
||||||
|
image: ghcr.io/gitroomhq/postiz-app:latest
|
||||||
|
container_name: postiz
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
# === Required Settings
|
||||||
|
MAIN_URL: 'http://localhost:4007'
|
||||||
|
FRONTEND_URL: 'http://localhost:4007'
|
||||||
|
NEXT_PUBLIC_BACKEND_URL: 'http://localhost:4007/api'
|
||||||
|
JWT_SECRET: 'random string that is unique to every install - just type random characters here!'
|
||||||
|
DATABASE_URL: 'postgresql://postiz-user:postiz-password@postiz-postgres:5432/postiz-db-local'
|
||||||
|
REDIS_URL: 'redis://postiz-redis:6379'
|
||||||
|
BACKEND_INTERNAL_URL: 'http://localhost:3000'
|
||||||
|
TEMPORAL_ADDRESS: "temporal:7233"
|
||||||
|
IS_GENERAL: 'true'
|
||||||
|
DISABLE_REGISTRATION: 'false'
|
||||||
|
|
||||||
|
# === 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: 'false'
|
||||||
|
# POSTIZ_OAUTH_URL: 'https://auth.example.com'
|
||||||
|
# POSTIZ_OAUTH_AUTH_URL: 'https://auth.example.com/application/o/authorize'
|
||||||
|
# POSTIZ_OAUTH_TOKEN_URL: 'https://auth.example.com/application/o/token'
|
||||||
|
# POSTIZ_OAUTH_USERINFO_URL: 'https://authentik.example.com/application/o/userinfo'
|
||||||
|
# POSTIZ_OAUTH_CLIENT_ID: ''
|
||||||
|
# POSTIZ_OAUTH_CLIENT_SECRET: ''
|
||||||
|
# POSTIZ_OAUTH_SCOPE: "openid profile email" # Optional: uncomment to override default scope
|
||||||
|
|
||||||
|
# === 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
|
||||||
|
depends_on:
|
||||||
|
postiz-postgres:
|
||||||
|
condition: service_healthy
|
||||||
|
postiz-redis:
|
||||||
|
condition: service_healthy
|
||||||
|
|
||||||
|
postiz-postgres:
|
||||||
|
image: postgres:17-alpine
|
||||||
|
container_name: postiz-postgres
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
POSTGRES_PASSWORD: postiz-password
|
||||||
|
POSTGRES_USER: postiz-user
|
||||||
|
POSTGRES_DB: postiz-db-local
|
||||||
|
volumes:
|
||||||
|
- postgres-volume:/var/lib/postgresql/data
|
||||||
|
networks:
|
||||||
|
- postiz-network
|
||||||
|
healthcheck:
|
||||||
|
test: pg_isready -U postiz-user -d postiz-db-local
|
||||||
|
interval: 10s
|
||||||
|
timeout: 3s
|
||||||
|
retries: 3
|
||||||
|
postiz-redis:
|
||||||
|
image: redis:7.2
|
||||||
|
container_name: postiz-redis
|
||||||
|
restart: always
|
||||||
|
healthcheck:
|
||||||
|
test: redis-cli ping
|
||||||
|
interval: 10s
|
||||||
|
timeout: 3s
|
||||||
|
retries: 3
|
||||||
|
volumes:
|
||||||
|
- postiz-redis-data:/data
|
||||||
|
networks:
|
||||||
|
- postiz-network
|
||||||
|
|
||||||
|
# For Application Monitoring / Debugging
|
||||||
|
spotlight:
|
||||||
|
pull_policy: always
|
||||||
|
container_name: spotlight
|
||||||
|
ports:
|
||||||
|
- 8969:8969/tcp
|
||||||
|
image: ghcr.io/getsentry/spotlight:latest
|
||||||
|
networks:
|
||||||
|
- postiz-network
|
||||||
|
|
||||||
|
# -----------------------
|
||||||
|
# Temporal Stack
|
||||||
|
# -----------------------
|
||||||
|
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:
|
||||||
|
- /var/lib/elasticsearch/data
|
||||||
|
|
||||||
|
temporal-postgresql:
|
||||||
|
container_name: temporal-postgresql
|
||||||
|
image: postgres:16
|
||||||
|
environment:
|
||||||
|
POSTGRES_PASSWORD: temporal
|
||||||
|
POSTGRES_USER: temporal
|
||||||
|
networks:
|
||||||
|
- temporal-network
|
||||||
|
expose:
|
||||||
|
- 5432
|
||||||
|
volumes:
|
||||||
|
- /var/lib/postgresql/data
|
||||||
|
|
||||||
|
temporal:
|
||||||
|
container_name: temporal
|
||||||
|
ports:
|
||||||
|
- '7233:7233'
|
||||||
|
image: temporalio/auto-setup:1.28.1
|
||||||
|
depends_on:
|
||||||
|
- temporal-postgresql
|
||||||
|
- temporal-elasticsearch
|
||||||
|
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
|
||||||
|
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
|
||||||
|
environment:
|
||||||
|
- TEMPORAL_ADDRESS=temporal:7233
|
||||||
|
- TEMPORAL_CLI_ADDRESS=temporal:7233
|
||||||
|
networks:
|
||||||
|
- temporal-network
|
||||||
|
stdin_open: true
|
||||||
|
depends_on:
|
||||||
|
- temporal
|
||||||
|
tty: true
|
||||||
|
|
||||||
|
temporal-ui:
|
||||||
|
container_name: temporal-ui
|
||||||
|
image: temporalio/ui:2.34.0
|
||||||
|
environment:
|
||||||
|
- TEMPORAL_ADDRESS=temporal:7233
|
||||||
|
- TEMPORAL_CORS_ORIGINS=http://127.0.0.1:3000
|
||||||
|
networks:
|
||||||
|
- temporal-network
|
||||||
|
ports:
|
||||||
|
- '8080:8080'
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
postgres-volume:
|
||||||
|
external: false
|
||||||
|
|
||||||
|
postiz-redis-data:
|
||||||
|
external: false
|
||||||
|
|
||||||
|
postiz-config:
|
||||||
|
external: false
|
||||||
|
|
||||||
|
postiz-uploads:
|
||||||
|
external: false
|
||||||
|
|
||||||
|
networks:
|
||||||
|
postiz-network:
|
||||||
|
external: false
|
||||||
|
temporal-network:
|
||||||
|
driver: bridge
|
||||||
|
name: temporal-network
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user