How to self-host Mixpost using Docker
Table of Contents
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)
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:
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 updateNote: You can also follow our Docker self-hosting guide for more details.
Next, install the required Docker packages, including Docker CE and Docker Compose:
1sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
2
3Create Docker Compose Configuration
Create a docker-compose.yml file in your project directory:
1nano docker-compose.ymlCopy and paste the following content:
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: localCreate .env Configuration
Next, create a .env file for all environment variables:
1nano .envCopy and past the following content:
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.comNote: 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:
1docker compose up -d
