This guide provides self-hosted installation instructions for Mixpost v2.4.0 on Linux servers. Choose your preferred deployment method: Docker Compose (recommended), Ansible Automation, or Manual Installation (LAMP/LEMP).
Current Version: v2.4.0 (November 13, 2025)
Estimated Setup Time: 15-30 minutes
Difficulty: Intermediate
| Component | Minimum | Recommended |
|---|---|---|
| CPU | 2 cores | 4 cores |
| RAM | 2 GB | 4 GB |
| Disk | 10 GB | 20+ GB (for media storage) |
| Network | 100 Mbps | 1 Gbps |
| Component | Version | Purpose |
|---|---|---|
| Operating System | Debian 11+, Ubuntu 22.04+, RHEL 9+ | Host OS |
| Docker | 24.0+ | Container runtime (Docker method) |
| Docker Compose | 2.20+ | Container orchestration (Docker method) |
| Ansible | 2.14+ | Automation (Ansible method) |
| PHP | 8.2+ | Application runtime (Manual method) |
| MySQL/MariaDB | 8.0+ / 10.6+ | Database |
| Redis | 7+ | Cache and queue |
| Nginx/Apache | 1.20+ / 2.4+ | Web server (Manual method) |
| Git | 2.30+ | Version control |
| Composer | 2.5+ | PHP dependency manager (Manual method) |
| FFmpeg | 5.0+ | Video processing (optional) |
| Port | Protocol | Purpose |
|---|---|---|
| 80 | TCP/HTTP | Web access (redirect to HTTPS) |
| 443 | TCP/HTTPS | Secure web access |
| 3306 | TCP/MySQL | Database (internal only) |
| 6379 | TCP/Redis | Cache (internal only) |
| Method | Best For | Time | Complexity |
|---|---|---|---|
| Docker Compose | Quick deployment, containerized environments | 15 min | Low |
| Ansible Automation | Repeatable deployments, infrastructure as code | 20 min | Medium |
| Manual Installation | Full control, existing LAMP/LEMP stacks | 30 min | High |
# Update package cache
sudo apt-get update
# Install prerequisites
sudo apt-get install -y ca-certificates curl gnupg lsb-release
# Add Docker's official GPG key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Set up repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Install Docker
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# Verify installation
docker --version
docker compose version
# Add Docker repository
sudo dnf install -y dnf-utils
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# Install Docker
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# Start and enable Docker
sudo systemctl start docker
sudo systemctl enable docker
# Create application directory
sudo mkdir -p /opt/mixpost
cd /opt/mixpost
# Create volume directories
sudo mkdir -p storage/app storage/logs db redis
# Generate secure APP_KEY
docker run --rm php:8.2-cli php -r "echo 'base64:' . base64_encode(random_bytes(32)) . PHP_EOL;"
Save the output for use in environment variables.
Create docker-compose.yml:
services:
mixpost:
image: inovector/mixpost:2.4.0
container_name: mixpost
user: "33:33"
environment:
APP_NAME: Mixpost
APP_ENV: production
APP_KEY: ${APP_KEY}
APP_URL: https://mixpost.example.com
APP_DEBUG: "false"
DB_HOST: mysql
DB_PORT: 3306
DB_DATABASE: mixpost
DB_USERNAME: mixpost
DB_PASSWORD: ${DB_PASSWORD}
REDIS_HOST: redis
REDIS_PASSWORD: ${REDIS_PASSWORD}
QUEUE_CONNECTION: redis
FILESYSTEM_DISK: local
ports:
- "127.0.0.1:8080:80"
volumes:
- ./storage/app:/var/www/html/storage/app:rw
- ./storage/logs:/var/www/html/storage/logs:rw
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
networks:
- mixpost-network
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/api/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
mysql:
image: mysql/mysql-server:8.0
container_name: mixpost-mysql
environment:
MYSQL_DATABASE: mixpost
MYSQL_USER: mixpost
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
volumes:
- ./db:/var/lib/mysql:rw
networks:
- mixpost-network
restart: unless-stopped
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
interval: 20s
timeout: 10s
retries: 5
start_period: 30s
redis:
image: redis:7-alpine
container_name: mixpost-redis
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
volumes:
- ./redis:/data:rw
networks:
- mixpost-network
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
interval: 20s
timeout: 10s
retries: 3
networks:
mixpost-network:
driver: bridge
Create .env file in /opt/mixpost:
# Application
APP_KEY=base64:your-generated-key-here
# Database
DB_PASSWORD=generate-secure-mysql-password
MYSQL_ROOT_PASSWORD=generate-secure-root-password
# Redis
REDIS_PASSWORD=generate-secure-redis-password
β οΈ Important: Generate secure passwords using:
openssl rand -base64 32
# Start all services
docker compose up -d
# Check status
docker compose ps
# View logs
docker compose logs -f mixpost
Create /etc/nginx/sites-available/mixpost:
server {
listen 80;
server_name mixpost.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name mixpost.example.com;
ssl_certificate /etc/letsencrypt/live/mixpost.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mixpost.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
proxy_read_timeout 90s;
}
}
Enable site and obtain SSL certificate:
# Enable site
sudo ln -s /etc/nginx/sites-available/mixpost /etc/nginx/sites-enabled/
# Test configuration
sudo nginx -t
# Reload Nginx
sudo systemctl reload nginx
# Obtain SSL certificate
sudo certbot --nginx -d mixpost.example.com
https://mixpost.example.comadmin@example.comchangeme# Clone playbook (example)
git clone https://github.com/inovector/mixpost-ansible.git
cd mixpost-ansible
# Configure inventory
cp inventory.example inventory
# Edit inventory with your host details
# Run playbook
ansible-playbook -i inventory playbooks/deploy.yml
π See Ansible Setup Guide for detailed playbook.
sudo apt-get update
sudo apt-get install -y nginx mysql-server php8.2 php8.2-fpm php8.2-mysql php8.2-curl php8.2-gd php8.2-mbstring php8.2-xml php8.2-zip php8.2-bcmath php8.2-redis redis-server git unzip curl
sudo dnf install -y nginx mysql php php-fpm php-mysqlnd php-pdo php-gd php-mbstring php-xml php-bcmath php-process php-pecl-redis redis git unzip curl
cd /var/www
sudo git clone https://github.com/inovector/mixpost.git
sudo chown -R www-data:www-data /var/www/mixpost
cd /var/www/mixpost
# Install Composer
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
# Install PHP dependencies
sudo -u www-data composer install --no-dev --optimize-autoloader
# Copy environment file
sudo -u www-data cp .env.example .env
# Generate application key
sudo -u www-data php artisan key:generate
# Edit .env with your settings
sudo nano .env
sudo mysql -u root -p
CREATE DATABASE mixpost CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'mixpost'@'localhost' IDENTIFIED BY 'secure-password';
GRANT ALL PRIVILEGES ON mixpost.* TO 'mixpost'@'localhost';
FLUSH PRIVILEGES;
EXIT;
sudo -u www-data php artisan migrate --force
Create /etc/nginx/sites-available/mixpost:
server {
listen 80;
server_name mixpost.example.com;
root /var/www/mixpost/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
sudo chown -R www-data:www-data /var/www/mixpost
sudo chmod -R 755 /var/www/mixpost/storage
sudo chmod -R 755 /var/www/mixpost/bootstrap/cache
Create /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 --sleep=3 --tries=3 --max-time=3600
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable mixpost-worker
sudo systemctl start mixpost-worker
sudo crontab -u www-data -e
Add:
* * * * * cd /var/www/mixpost && php artisan schedule:run >> /dev/null 2>&1
MAIL_MAILER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_USERNAME=notifications@example.com
MAIL_PASSWORD=secure-password
MAIL_ENCRYPTION=tls
/api/health/var/www/mixpost/storage/logs# Database backup script
#!/bin/bash
mysqldump -u mixpost -p mixpost | gzip > /backup/mixpost-$(date +%Y%m%d).sql.gz
# Schedule daily backup
0 2 * * * /usr/local/bin/backup-mixpost.sh
| Issue | Solution |
|---|---|
| Container wonβt start | Check logs: docker compose logs mixpost; verify APP_KEY format |
| Database connection error | Verify MySQL is healthy: docker compose ps mysql |
| 502 Bad Gateway | Check Nginx config; verify Mixpost container is running |
| Queue not processing | Restart worker: docker compose restart mixpost |
| OAuth connection fails | Verify callback URL matches APP_URL exactly |
Temporarily enable debug mode:
APP_DEBUG=true
LOG_LEVEL=debug
β οΈ Warning: Disable after troubleshooting!
# Docker logs
docker compose logs -f mixpost
docker compose logs -f mysql
docker compose logs -f redis
# Application logs (Docker)
docker compose exec mixpost tail -f /var/www/html/storage/logs/laravel.log
# Application logs (Manual)
sudo tail -f /var/www/mixpost/storage/logs/laravel.log
Any questions?
Feel free to contact us. Find all contact information on our contact page.