Comprehensive configuration guide for Mixpost v2.4.0. This document covers environment variables, production settings, queue management, social provider integration, and operational best practices for Linux DevOps teams.
Current Version: v2.4.0
Last Updated: February 2026
# Application Identity
APP_NAME=Mixpost
APP_ENV=production
APP_KEY=base64:your-32-character-base64-encoded-key
APP_URL=https://mixpost.example.com
APP_DEBUG=false
# Timezone
APP_TIMEZONE=UTC
# Locale
APP_LOCALE=en
APP_FALLBACK_LOCALE=en
| Variable | Required | Description | Example |
|---|---|---|---|
APP_NAME |
✅ | Application name displayed in UI | Mixpost |
APP_ENV |
✅ | Environment mode | production, local, staging |
APP_KEY |
✅ | 32-byte encryption key (base64 encoded) | base64:abc123... |
APP_URL |
✅ | Public URL for the application | https://mixpost.example.com |
APP_DEBUG |
✅ | Debug mode (disable in production) | false |
APP_TIMEZONE |
⚠️ | Default timezone for scheduling | UTC, America/New_York |
APP_LOCALE |
⚠️ | Default language | en, de, fr |
APP_FALLBACK_LOCALE |
⚠️ | Fallback language | en |
# Using Docker
docker run --rm php:8.2-cli php -r "echo 'base64:' . base64_encode(random_bytes(32)) . PHP_EOL;"
# Using OpenSSL
echo "base64:$(openssl rand -base64 32)"
# Using Laravel Artisan (manual installation)
php artisan key:generate --show
⚠️ Important: Store APP_KEY securely. Losing it will break encrypted data!
# Database Connection
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=mixpost
DB_USERNAME=mixpost
DB_PASSWORD=your-secure-database-password
# MySQL Specific
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_unicode_ci
DB_PREFIX=
DB_STRICT_MODE=true
| Variable | Required | Description | Default |
|---|---|---|---|
DB_CONNECTION |
✅ | Database driver | mysql |
DB_HOST |
✅ | Database host | mysql (Docker) or 127.0.0.1 |
DB_PORT |
✅ | Database port | 3306 |
DB_DATABASE |
✅ | Database name | mixpost |
DB_USERNAME |
✅ | Database username | mixpost |
DB_PASSWORD |
✅ | Database password | (generate secure password) |
DB_CHARSET |
✅ | Character set | utf8mb4 |
DB_COLLATION |
✅ | Collation | utf8mb4_unicode_ci |
DB_PREFIX |
⚠️ | Table prefix (optional) | `` |
DB_STRICT_MODE |
⚠️ | Enable strict mode | true |
# /etc/mysql/mysql.conf.d/mixpost.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
innodb_buffer_pool_size = 512M
innodb_log_file_size = 128M
innodb_flush_log_at_trx_commit = 2
max_connections = 100
wait_timeout = 600
# /etc/mysql/mariadb.conf.d/mixpost.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
innodb_buffer_pool_size = 512M
innodb_log_file_size = 128M
max_connections = 100
#!/bin/bash
# /usr/local/bin/backup-mixpost-db.sh
BACKUP_DIR="/backup/mixpost"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="mixpost"
DB_USER="mixpost"
DB_PASS="your-password"
mkdir -p $BACKUP_DIR
mysqldump -u $DB_USER -p$DB_PASS \
--single-transaction \
--quick \
--lock-tables=false \
$DB_NAME | gzip > $BACKUP_DIR/db-$DATE.sql.gz
# Keep 30 days of backups
find $BACKUP_DIR -name "db-*.sql.gz" -mtime +30 -delete
# Redis Connection
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=your-secure-redis-password
REDIS_DB=0
# Queue Configuration
QUEUE_CONNECTION=redis
QUEUE_RETRY_AFTER=900
QUEUE_MAX_ATTEMPTS=3
| Variable | Required | Description | Default |
|---|---|---|---|
REDIS_HOST |
✅ | Redis host | redis (Docker) or 127.0.0.1 |
REDIS_PORT |
✅ | Redis port | 6379 |
REDIS_PASSWORD |
✅ | Redis password | (generate secure password) |
REDIS_DB |
⚠️ | Database number | 0 |
QUEUE_CONNECTION |
✅ | Queue driver | redis |
QUEUE_RETRY_AFTER |
⚠️ | Seconds before retry | 900 (15 min) |
QUEUE_MAX_ATTEMPTS |
⚠️ | Max retry attempts | 3 |
# /etc/systemd/system/mixpost-worker.service
[Unit]
Description=Mixpost Queue Worker
After=network.target mysql.service redis.service
[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/mixpost
ExecStart=/usr/bin/php /var/www/mixpost/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
Restart=always
RestartSec=5
Nice=10
# Resource limits
MemoryLimit=512M
CPUQuota=50%
[Install]
WantedBy=multi-user.target
services:
mixpost-worker:
image: inovector/mixpost:2.4.0
command: php artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
deploy:
replicas: 2
resources:
limits:
cpus: '0.5'
memory: 256M
# Check queue status
docker compose exec mixpost php artisan queue:status
# View failed jobs
docker compose exec mixpost php artisan queue:failed
# Retry failed jobs
docker compose exec mixpost php artisan queue:retry all
# Flush failed jobs
docker compose exec mixpost php artisan queue:flush
# Monitor queue size
docker compose exec redis redis-cli -a password LLEN queues:default
Each social platform requires API credentials. Configure these in the Mixpost UI after installation.
| Platform | Credential Type | Required Permissions |
|---|---|---|
| App ID, App Secret | pages_manage_posts, pages_read_engagement | |
| X (Twitter) | API Key, API Secret, Bearer Token | tweet.read, tweet.write, users.read |
| Client ID, Client Secret | w_member_social, r_basicprofile | |
| Facebook App (Business) | instagram_basic, instagram_content_publish | |
| YouTube | OAuth Client ID | youtube.upload, youtube.readonly |
| TikTok | App Key, App Secret | video.upload, user.info.basic |
| App ID, App Secret | boards:read, pins:read, pins:write | |
| Client ID, Client Secret | submit, read | |
| Mastodon | Instance URL, App Token | write:statuses, read:accounts |
| Bluesky | Handle, App Password | write, read |
| Threads | Facebook App | threads_content_publish, threads_basic |
Create Dedicated API Apps
Scope Minimization
Token Management
Callback URL Configuration
https://mixpost.example.com/callbackRate Limit Awareness
FILESYSTEM_DISK=local
# Local Storage Paths
STORAGE_PATH=/var/www/html/storage
TEMPORARY_PATH=/var/www/html/storage/temp
MEDIA_PATH=/var/www/html/storage/app
volumes:
- ./storage/app:/var/www/html/storage/app:rw
- ./storage/logs:/var/www/html/storage/logs:rw
- ./storage/temp:/var/www/html/storage/temp:rw
# Docker
docker compose exec mixpost chown -R 33:33 /var/www/html/storage
docker compose exec mixpost chmod -R 755 /var/www/html/storage
# Manual installation
sudo chown -R www-data:www-data /var/www/mixpost/storage
sudo chmod -R 755 /var/www/mixpost/storage
FFMPEG_PATH=/usr/bin/ffmpeg
FFPROBE_PATH=/usr/bin/ffprobe
Install FFmpeg:
# Debian/Ubuntu
sudo apt-get install -y ffmpeg
# RHEL/Rocky
sudo dnf install -y ffmpeg
MAIL_MAILER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_USERNAME=notifications@example.com
MAIL_PASSWORD=your-smtp-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=noreply@example.com
MAIL_FROM_NAME="${APP_NAME}"
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=your-account@gmail.com
MAIL_PASSWORD=your-app-password
MAIL_ENCRYPTION=tls
⚠️ Note: Use App Password, not account password. Enable 2FA first.
MAIL_MAILER=smtp
MAIL_HOST=smtp.sendgrid.net
MAIL_PORT=587
MAIL_USERNAME=apikey
MAIL_PASSWORD=your-sendgrid-api-key
MAIL_ENCRYPTION=tls
MAIL_MAILER=mailgun
MAILGUN_DOMAIN=mg.example.com
MAILGUN_SECRET=key-your-mailgun-key
MAILGUN_ENDPOINT=api.mailgun.net
# /etc/php/8.2/fpm/pool.d/mixpost.conf
[mixpost]
user = www-data
group = www-data
listen = /var/run/php/php8.2-fpm-mixpost.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 5
pm.max_requests = 500
php_admin_value[open_basedir] = /var/www/mixpost:/tmp
php_admin_value[upload_max_filesize] = 50M
php_admin_value[post_max_size] = 50M
php_admin_value[memory_limit] = 256M
php_admin_value[max_execution_time] = 60
# /etc/php/8.2/fpm/conf.d/10-opcache.ini
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
# /etc/nginx/sites-available/mixpost
# Add to server block:
client_max_body_size 50M;
client_body_buffer_size 128k;
client_body_timeout 60s;
# Gzip compression
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;
# Cache static assets
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
-- Analyze tables periodically
OPTIMIZE TABLE posts;
OPTIMIZE TABLE social_accounts;
OPTIMIZE TABLE workspaces;
-- Create indexes for common queries
CREATE INDEX idx_posts_scheduled_at ON posts(scheduled_at);
CREATE INDEX idx_posts_status ON posts(status);
| Metric | Threshold | Alert |
|---|---|---|
| Queue Lag | > 100 jobs | Warning |
| Failed Jobs | > 10 in 24h | Warning |
| Disk Usage | > 80% | Warning |
| Memory Usage | > 90% | Critical |
| Response Time | > 2s | Warning |
| Error Rate | > 1% | Warning |
# =============================================================================
# APPLICATION SETTINGS
# =============================================================================
APP_NAME=Mixpost
APP_ENV=production
APP_KEY=base64:generate-with-php-or-openssl
APP_URL=https://mixpost.example.com
APP_DEBUG=false
APP_TIMEZONE=UTC
APP_LOCALE=en
APP_FALLBACK_LOCALE=en
# =============================================================================
# DATABASE CONFIGURATION
# =============================================================================
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=mixpost
DB_USERNAME=mixpost
DB_PASSWORD=generate-secure-password
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_unicode_ci
DB_PREFIX=
DB_STRICT_MODE=true
# =============================================================================
# REDIS CONFIGURATION
# =============================================================================
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=generate-secure-password
REDIS_DB=0
# =============================================================================
# QUEUE CONFIGURATION
# =============================================================================
QUEUE_CONNECTION=redis
QUEUE_RETRY_AFTER=900
QUEUE_MAX_ATTEMPTS=3
# =============================================================================
# FILE STORAGE
# =============================================================================
FILESYSTEM_DISK=local
MAX_UPLOAD_SIZE=52428800
# =============================================================================
# EMAIL CONFIGURATION
# =============================================================================
MAIL_MAILER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_USERNAME=notifications@example.com
MAIL_PASSWORD=generate-secure-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=noreply@example.com
MAIL_FROM_NAME="${APP_NAME}"
# =============================================================================
# SESSION CONFIGURATION
# =============================================================================
SESSION_DRIVER=database
SESSION_LIFETIME=120
SESSION_ENCRYPT=true
# =============================================================================
# CACHE CONFIGURATION
# =============================================================================
CACHE_DRIVER=redis
CACHE_PREFIX=mixpost
# =============================================================================
# LOGGING CONFIGURATION
# =============================================================================
LOG_CHANNEL=stack
LOG_LEVEL=info
LOG_DAILY_DAYS=7
# =============================================================================
# MISC
# =============================================================================
TRUSTED_PROXIES=*
Any questions?
Feel free to contact us. Find all contact information on our contact page.