How to self-host Mixpost using Docker

Last updated: May 11, 2026Ole Mai2 min read
bashcertbotdockersoftwareupCloud

Mixpost is a social media management tool that allows you to schedule and publish content across multiple platforms. This guide will walk you through installing Mixpost using Docker, which simplifies the setup process.

What you need

Before starting, ensure you meet these requirements:

  • A VPS running Ubuntu 22.04 or 24.04

  • Root sudo SSH access to the server

  • A domain name you control (e.g. example.com)

  • DNS A-record pointed at your VPS IP

  • Ports 80 and 443 reachable from the internet

  • ~1 GB RAM minimum (2 GB recommended)

Need a server? Get $25 free credits on UpCloud — perfect for self-hosting.

Configure your domain

First off, set up the domain you want to use for mixpanel. For example:

Record-Type

Name

IPv4

A

Your domain or subdomain (e.g., mixpost.example.com)

IP address of your server (e.g., 01.234.567.89)

Install Docker and Docker Compose

First, copy and past this command:

Installing Docker and Docker Compose
1# Add Docker's official GPG key: 2sudo apt-get update 3sudo apt-get install ca-certificates curl 4sudo install -m 0755 -d /etc/apt/keyrings 5sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc 6sudo chmod a+r /etc/apt/keyrings/docker.asc 7# Add the repository to Apt sources: 8echo \ 9"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ 10$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ 11sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 12sudo apt-get update

Note: You can also follow our Docker self-hosting guide for more details.

Next, install the required Docker packages, including Docker CE and Docker Compose:

Docker CE and Docker Compose Plugin
1sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 2 3

Create Docker Compose Configuration

Create a docker-compose.yml file in your project directory:

Create Docker Compose file
1nano docker-compose.yml

Copy and paste the following content:

Fill the Docker Compose file
1services: 2 traefik: 3 image: "traefik" 4 restart: unless-stopped 5 command: 6 - "--api=true" 7 - "--api.insecure=true" 8 - "--providers.docker=true" 9 - "--providers.docker.exposedbydefault=false" 10 - "--entrypoints.web.address=:80" 11 - "--entrypoints.web.http.redirections.entryPoint.to=websecure" 12 - "--entrypoints.web.http.redirections.entrypoint.scheme=https" 13 - "--entrypoints.websecure.address=:443" 14 - "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true" 15 - "--certificatesresolvers.mytlschallenge.acme.email=${SSL_EMAIL}" 16 - "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json" 17 ports: 18 - "80:80" 19 - "443:443" 20 volumes: 21 - traefik_data:/letsencrypt 22 - /var/run/docker.sock:/var/run/docker.sock:ro 23 mixpost: 24 image: inovector/mixpost:latest 25 env_file: 26 - .env 27 labels: 28 - traefik.enable=true 29 - traefik.http.routers.mixpost.rule=Host(`${APP_DOMAIN}`) 30 - traefik.http.routers.mixpost.tls=true 31 - traefik.http.routers.mixpost.entrypoints=web,websecure 32 - traefik.http.routers.mixpost.tls.certresolver=mytlschallenge 33 - traefik.http.middlewares.mixpost.headers.SSLRedirect=true 34 - traefik.http.middlewares.mixpost.headers.STSSeconds=315360000 35 - traefik.http.middlewares.mixpost.headers.browserXSSFilter=true 36 - traefik.http.middlewares.mixpost.headers.contentTypeNosniff=true 37 - traefik.http.middlewares.mixpost.headers.forceSTSHeader=true 38 - traefik.http.middlewares.mixpost.headers.SSLHost=`${APP_DOMAIN}` 39 - traefik.http.middlewares.mixpost.headers.STSIncludeSubdomains=true 40 - traefik.http.middlewares.mixpost.headers.STSPreload=true 41 - traefik.http.routers.mixpost.middlewares=mixpost@docker 42 volumes: 43 - storage:/var/www/html/storage/app 44 - logs:/var/www/html/storage/logs 45 depends_on: 46 - mysql 47 - redis 48 restart: unless-stopped 49 mysql: 50 image: 'mysql/mysql-server:8.0' 51 environment: 52 MYSQL_DATABASE: ${DB_DATABASE} 53 MYSQL_USER: ${DB_USERNAME} 54 MYSQL_PASSWORD: ${DB_PASSWORD} 55 volumes: 56 - 'mysql:/var/lib/mysql' 57 healthcheck: 58 test: ["CMD", "mysqladmin", "ping", "-p ${DB_PASSWORD}"] 59 retries: 3 60 timeout: 5s 61 restart: unless-stopped 62 redis: 63 image: 'redis:latest' 64 command: redis-server --appendonly yes --replica-read-only no 65 volumes: 66 - 'redis:/data' 67 healthcheck: 68 test: ["CMD", "redis-cli", "ping"] 69 retries: 3 70 timeout: 5s 71 restart: unless-stopped 72volumes: 73 traefik_data: 74 driver: local 75 mysql: 76 driver: local 77 redis: 78 driver: local 79 storage: 80 driver: local 81 logs: 82 driver: local

Create .env Configuration

Next, create a .env file for all environment variables:

Create env file
1nano .env

Copy and past the following content:

Fill env file
1# The name of your application. 2APP_NAME=Mixpost 3# Key used to encrypt and decrypt sensitive data. Generate this using the following tool: 4# https://mixpost.app/tools/encryption-key-generator 5APP_KEY= 6# Debug mode setting. Set to `false` for production environments. 7APP_DEBUG=false 8# Your app's domain or subdomain, without the 'http://' or 'https://' prefix. 9APP_DOMAIN=example.com 10# Full application URL is automatically configured; no modification required. 11APP_URL=https://${APP_DOMAIN} 12# MySQL connection setup. 13DB_DATABASE=mixpost_db 14DB_USERNAME=mixpost_user 15DB_PASSWORD= 16# Specify the email address to be used for SSL certificate registration and notifications. 17SSL_EMAIL=user@example.com

Note: Adjust the values accordingly. Generate the APP_KEY here: https://mixpost.app/tools/encryption-key-generator

Launch Mixpost

To launch Mixpost, use the following command:

Launch Mixpost
1docker compose up -d