Managing multiple social media accounts is exhausting. Between juggling different platforms, scheduling posts at optimal times, and keeping up with analytics, it’s easy to feel overwhelmed. Commercial tools like Buffer and Hootsuite work well but come with hefty subscription fees and feature limitations. Enter Postiz – an open-source, self-hosted social media scheduling platform that puts you in complete control without the recurring costs.
What Does This Thing Actually Do?
Postiz is a comprehensive social media management tool that lets you schedule, publish, and analyze content across 18 different platforms from a single dashboard. Think of it as your personal social media command center – schedule posts weeks in advance, collaborate with your team, and use AI to optimize your content.
Built with NextJS, NestJS, and Prisma, Postiz offers:
- 18 Platform Support – Instagram, Facebook, TikTok, Reddit, LinkedIn, X (Twitter), Threads, BlueSky, Mastodon, YouTube, Pinterest, Dribbble, Slack, Discord, Warpcast, Lemmy, Telegram, and Nostr
- AI-Powered Content Creation – Generate posts, optimize content, and create stunning visuals with built-in AI tools
- Cross-Platform Publishing – Schedule the same post across multiple channels simultaneously
- Team Collaboration – Invite team members to collaborate, comment, and manage posts together
- Analytics Dashboard – Track performance metrics and engagement across all platforms
- Automation Features – Auto-post, auto-like, and auto-comment based on milestones
- Visual Editor – Canva-like interface for creating social media graphics
- Repeated Posts – Set posts to repeat automatically at specified intervals
- Customer Separation – Group accounts per customer for agency workflows
- API Access – Integrate with automation platforms like N8N, Make.com, and Zapier
- Webhooks – Trigger actions when posts are published
- Tagging System – Organize posts with colored tags for easy calendar filtering
Unlike hosted solutions, Postiz gives you complete data ownership and unlimited accounts without artificial limits. The self-hosted version has the exact same features as the cloud offering – no paywalls or premium tiers.
Docker Compose Setup
Postiz uses a multi-container setup with PostgreSQL for data storage and Redis for job queuing. Here’s the complete configuration:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
services: postiz: image: ghcr.io/gitroomhq/postiz-app:latest container_name: postiz restart: always environment: MAIN_URL: "https://postiz.your-server.com" FRONTEND_URL: "https://postiz.your-server.com" NEXT_PUBLIC_BACKEND_URL: "https://postiz.your-server.com/api" JWT_SECRET: "random-unique-string" 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" IS_GENERAL: "true" DISABLE_REGISTRATION: "false" STORAGE_PROVIDER: "local" UPLOAD_DIRECTORY: "/uploads" NEXT_PUBLIC_UPLOAD_DIRECTORY: "/uploads" volumes: - postiz-config:/config/ - postiz-uploads:/uploads/ ports: - 5000:5000 networks: - postiz-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 volumes: postgres-volume: postiz-redis-data: postiz-config: postiz-uploads: networks: postiz-network: |
Installation Steps
Getting Postiz running is straightforward with Docker Compose:
1. System Requirements
Ensure your system meets these minimum requirements:
- Docker and Docker Compose installed
- 2GB RAM minimum (tested on Ubuntu 24.04)
- 2 vCPUs
- Adequate disk space for media uploads
2. Generate JWT Secret
Create a secure random string for JWT authentication:
|
1 2 3 |
openssl rand -base64 32 |
Copy this value and update the JWT_SECRET environment variable in your compose file.
3. Configure Your URLs
Update these environment variables with your actual domain or server IP:
|
1 2 3 4 5 |
MAIN_URL: "https://postiz.yourdomain.com" FRONTEND_URL: "https://postiz.yourdomain.com" NEXT_PUBLIC_BACKEND_URL: "https://postiz.yourdomain.com/api" |
4. Configure Database Credentials
Update the PostgreSQL password in both the database service and the DATABASE_URL:
|
1 2 3 4 |
POSTGRES_PASSWORD: your-secure-password DATABASE_URL: "postgresql://postiz-user:your-secure-password@postiz-postgres:5432/postiz-db-local" |
5. Launch Postiz
|
1 2 3 |
docker compose up -d |
6. Access the Interface
Open your browser and navigate to http://your-server-ip:5000 or your configured domain.
7. Important: HTTPS Configuration
Security Note: Postiz marks login cookies as secure, requiring HTTPS in production. Set up a reverse proxy (Nginx, Caddy, Traefik) with SSL certificates before using in production.
For development/testing without HTTPS, add this environment variable:
|
1 2 3 |
NOT_SECURED: "true" |
Warning: Never use NOT_SECURED=true in production environments.
Environment Variables Explained
MAIN_URL
Purpose: The primary URL where users access Postiz.
Format: Full URL with protocol
Example: https://postiz.yourdomain.com
|
1 2 3 |
MAIN_URL=https://postiz.yourdomain.com |
This should match how users will access your Postiz installation.
FRONTEND_URL
Purpose: The public-facing frontend URL.
Format: Full URL with protocol
Example: https://postiz.yourdomain.com
|
1 2 3 |
FRONTEND_URL=https://postiz.yourdomain.com |
Typically matches MAIN_URL for single-domain deployments.
NEXT_PUBLIC_BACKEND_URL
Purpose: Backend API endpoint accessible from web browsers.
Format: Full URL with protocol and /api path
Example: https://postiz.yourdomain.com/api
|
1 2 3 |
NEXT_PUBLIC_BACKEND_URL=https://postiz.yourdomain.com/api |
This variable is exposed to the browser, so it must be publicly accessible.
BACKEND_INTERNAL_URL
Purpose: Internal backend URL for service-to-service communication within Docker network.
Format: HTTP URL with port
Default: http://localhost:3000
|
1 2 3 |
BACKEND_INTERNAL_URL=http://localhost:3000 |
Used for internal container communication. Keep as localhost when using Docker Compose.
JWT_SECRET
Purpose: Secures JWT authentication tokens.
Format: Random string, minimum 32 characters recommended
Security: Critical – must be unique for every installation
|
1 2 3 |
JWT_SECRET=your-generated-random-string-here |
Generate with: openssl rand -base64 32
DATABASE_URL
Purpose: PostgreSQL connection string for data persistence.
Format: postgresql://user:password@host:port/database
Example: postgresql://postiz-user:postiz-password@postiz-postgres:5432/postiz-db-local
|
1 2 3 |
DATABASE_URL=postgresql://postiz-user:postiz-password@postiz-postgres:5432/postiz-db-local |
Must match the PostgreSQL service credentials in your docker-compose file.
REDIS_URL
Purpose: Redis connection for job queue management.
Format: redis://host:port
Example: redis://postiz-redis:6379
|
1 2 3 |
REDIS_URL=redis://postiz-redis:6379 |
Redis handles background job processing and scheduled posts.
IS_GENERAL
Purpose: Required flag for self-hosted installations.
Format: Boolean string
Required Value: true
|
1 2 3 |
IS_GENERAL=true |
This must be set to “true” for self-hosted deployments to work correctly.
DISABLE_REGISTRATION
Purpose: Controls whether new users can register accounts.
Format: Boolean string
Default: false
|
1 2 3 |
DISABLE_REGISTRATION=false |
Set to true to restrict registration after creating your initial account.
STORAGE_PROVIDER
Purpose: Defines where uploaded media files are stored.
Format: String (local or cloudflare)
Default: local
|
1 2 3 |
STORAGE_PROVIDER=local |
Use local for filesystem storage or cloudflare for Cloudflare R2 object storage.
UPLOAD_DIRECTORY
Purpose: Server-side path where uploads are stored.
Format: Absolute path
Default: /uploads
|
1 2 3 |
UPLOAD_DIRECTORY=/uploads |
NEXT_PUBLIC_UPLOAD_DIRECTORY
Purpose: Public-facing path for accessing uploaded files.
Format: Path relative to web root
Default: /uploads
|
1 2 3 |
NEXT_PUBLIC_UPLOAD_DIRECTORY=/uploads |
Should match UPLOAD_DIRECTORY for local storage.
OPENAI_API_KEY (Optional)
Purpose: Enables AI-powered content generation features.
Format: OpenAI API key string
|
1 2 3 |
OPENAI_API_KEY=sk-your-openai-api-key |
Required for AI features like post generation and content optimization.
DISABLE_IMAGE_COMPRESSION (Optional)
Purpose: Disables automatic image optimization.
Format: Boolean string
Default: false
|
1 2 3 |
DISABLE_IMAGE_COMPRESSION=true |
Set to true if you want to preserve original image quality.
Volume Mounts Explained
postiz-config
Purpose: Stores Postiz configuration files.
Mount Point: /config/
|
1 2 3 |
- postiz-config:/config/ |
Alternative configuration method: mount a postiz.env file here instead of using docker-compose environment variables.
postiz-uploads
Purpose: Stores uploaded media files (images, videos).
Mount Point: /uploads/
|
1 2 3 |
- postiz-uploads:/uploads/ |
Critical for preserving your media library across container restarts.
postgres-volume
Purpose: PostgreSQL database storage.
Mount Point: /var/lib/postgresql/data
|
1 2 3 |
- postgres-volume:/var/lib/postgresql/data |
Contains all your posts, schedules, accounts, and user data. Back this up regularly.
postiz-redis-data
Purpose: Redis job queue persistence.
Mount Point: /data
|
1 2 3 |
- postiz-redis-data:/data |
Preserves scheduled posts and background jobs during restarts.
Common Use Cases
Personal Brand Management
Schedule posts across all your social channels from one interface. Create content once, publish everywhere. Use AI to optimize post timing and content for maximum engagement.
Small Business Marketing
Manage multiple business accounts without expensive subscriptions. Schedule promotional campaigns, track analytics, and maintain consistent social presence without hiring an agency.
Social Media Agency
The customer separation feature makes Postiz perfect for agencies. Group client accounts, collaborate with team members, and manage dozens of brands from a single installation.
Content Creator Workflows
Plan content calendars weeks in advance. Use the visual editor to create graphics, schedule repeated posts for evergreen content, and leverage webhooks to trigger workflows when posts go live.
Developer Integration
Access the API to integrate Postiz with your custom applications, automate posting through N8N or Make.com, and build custom workflows around your social media strategy.
Configuring Social Media Platforms
To connect social media accounts, you’ll need API credentials from each platform. Add these to your environment variables:
|
1 2 3 4 5 6 7 8 |
X_API_KEY: "your-x-api-key" X_API_SECRET: "your-x-api-secret" LINKEDIN_CLIENT_ID: "your-linkedin-client-id" LINKEDIN_CLIENT_SECRET: "your-linkedin-client-secret" REDDIT_CLIENT_ID: "your-reddit-client-id" REDDIT_CLIENT_SECRET: "your-reddit-client-secret" |
Postiz uses official OAuth flows for all platforms – it never stores API keys or scrapes content. Users authenticate directly with each social network.
Useful Links
- Official Website: https://postiz.com/
- Documentation: https://docs.postiz.com/
- Docker Compose Guide: https://docs.postiz.com/installation/docker-compose
- Configuration Reference: https://docs.postiz.com/configuration/reference
- GitHub Repository: https://github.com/gitroomhq/postiz-app
- Docker Hub:
ghcr.io/gitroomhq/postiz-app:latest
Conclusion
Postiz delivers enterprise-level social media management without the enterprise price tag. By self-hosting, you gain complete control over your data, avoid monthly subscription fees, and get unlimited accounts and team members. The AI-powered features rival commercial platforms, while the open-source nature means you can customize anything you need.
Whether you’re managing a personal brand, running a small business, or operating a full-service agency, Postiz scales to meet your needs. The comprehensive platform support means you can truly manage all your social media from one place, and the automation features free you from the constant grind of manual posting.
Set it up once with Docker Compose, configure your social accounts, and you’re ready to streamline your entire social media workflow.
FAQ
What is Postiz?
Postiz is an open-source, self-hosted social media scheduling and management platform that supports 18 different social networks. It provides AI-powered content creation, team collaboration, analytics, and automation features.
Is Postiz really free?
Yes, Postiz is released under the AGPL-3.0 license and is completely free to use. You only pay for your server hosting and any optional API services you choose to integrate (like OpenAI for AI features).
How does self-hosted Postiz compare to the cloud version?
There is no difference in features between the self-hosted and cloud versions. Both have identical functionality with no paywalls or premium tiers.
What are the system requirements?
Minimum 2GB RAM and 2 vCPUs are recommended. The setup has been tested on Ubuntu 24.04 but should work on any system supporting Docker.
Which social media platforms are supported?
Postiz supports Instagram, Facebook, TikTok, Reddit, LinkedIn, X (Twitter), Threads, BlueSky, Mastodon, YouTube, Pinterest, Dribbble, Slack, Discord, Warpcast, Lemmy, Telegram, and Nostr.
Do I need API keys for every platform?
Yes, to connect accounts from each platform, you’ll need to create OAuth applications and obtain API credentials. Postiz uses official OAuth flows for security.
Can I use Postiz without HTTPS?
For development/testing, you can set NOT_SECURED=true. However, production deployments require HTTPS because Postiz marks login cookies as secure for security reasons.
How do I set up HTTPS?
Use a reverse proxy like Nginx, Caddy, or Traefik in front of Postiz to handle SSL/TLS termination. Configure your proxy to forward requests to Postiz on port 5000.
Why is port 5000 the only exposed port?
Port 5000 is the unified entry point that handles both frontend and backend traffic. The internal services (frontend on 4200, backend on 3000) communicate within the Docker network and don’t need external exposure.
Can I change the PostgreSQL password?
Yes, update both the POSTGRES_PASSWORD environment variable in the postgres service and the password in the DATABASE_URL connection string.
What database does Postiz use?
Postiz uses PostgreSQL by default, but Prisma (the ORM) supports other databases like MariaDB and MySQL. PostgreSQL is recommended for best compatibility.
How do I enable AI features?
Add your OpenAI API key to the OPENAI_API_KEY environment variable. This enables AI-powered content generation and optimization features.
Can I disable user registration?
Yes, set DISABLE_REGISTRATION=true after creating your initial account. This prevents additional users from signing up.
How do I invite team members?
Through the Postiz interface, you can invite team members who can collaborate on posts, leave comments, and manage scheduled content.
What is customer separation?
Customer separation allows you to group social accounts by client/customer. This is particularly useful for agencies managing multiple clients from one installation.
Can I schedule the same post to multiple platforms?
Yes, Postiz supports cross-platform publishing. Create your content once and select multiple platforms to publish simultaneously.
What are repeated posts?
Repeated posts automatically republish at specified intervals. Perfect for evergreen content that should be shared regularly.
How do webhooks work in Postiz?
You can configure webhooks to trigger when posts are published. This allows integration with external systems and automation workflows.
Can I integrate Postiz with automation tools?
Yes, Postiz provides an API that works with N8N, Make.com, Zapier, and other automation platforms.
What storage options are available?
Postiz supports local filesystem storage (default) or Cloudflare R2 object storage for uploaded media files.
How do I switch to Cloudflare R2 storage?
Set STORAGE_PROVIDER=cloudflare and add your Cloudflare R2 credentials (CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_ACCESS_KEY, CLOUDFLARE_SECRET_ACCESS_KEY, CLOUDFLARE_BUCKETNAME, etc.).
Where are uploaded images stored?
By default, uploads are stored in the postiz-uploads Docker volume mounted at /uploads. This persists across container restarts.
Can I use an external PostgreSQL database?
Yes, update the DATABASE_URL to point to your external PostgreSQL instance and remove the postgres service from docker-compose.yml.
Can I use an external Redis instance?
Yes, update REDIS_URL to point to your external Redis server and remove the redis service from docker-compose.yml.
How do I update Postiz?
Pull the latest image and recreate containers: docker compose pull && docker compose up -d
How do I view logs?
View real-time logs with docker compose logs -f postiz or check specific services like docker compose logs -f postiz-postgres
What happens if Redis goes down?
Scheduled posts won’t be processed until Redis is back online. The healthcheck ensures Postiz waits for Redis to be healthy before starting.
How do I back up my data?
Back up the postgres-volume (contains all data), postiz-uploads (media files), and postiz-config (configuration). Use Docker volume backup tools or database dumps.
Does Postiz store my social media passwords?
No, Postiz never stores passwords or API keys. It uses official OAuth flows where users authenticate directly with each social platform.
Can I run Postiz on a Raspberry Pi?
Potentially, but performance may be limited. The Docker images should support ARM architectures, but you’ll need adequate RAM (minimum 2GB).
What license is Postiz under?
Postiz is licensed under AGPL-3.0, which means you can use, modify, and distribute it freely, but any modifications must also be open-sourced.
How do I configure OAuth for social platforms?
Each platform requires creating an OAuth application in their developer portal. Check the Postiz documentation for platform-specific guides.
Can I customize the Postiz interface?
Yes, since it’s open-source, you can modify the frontend code. The project is built with NextJS and SvelteKit.
