Self-host KreateMix on a $2 VPS with CloudPanel
This guide takes you from nothing to a working KreateMix at https://social.yourdomain.com, with free HTTPS, scheduled posting and backups. It takes about 30–45 minutes. You don't need to have run a server before; every command is here to copy and paste.
1. What you need
- A VPS with at least 2 GB of RAM running Ubuntu 24.04. 2 GB is CloudPanel's minimum. See the next step.
- A domain name, or a subdomain of one you own, such as
social.yourdomain.com. Free HTTPS certificates and most social networks' login screens need a real domain, not a bare IP address. - A computer with a terminal. On Windows 10 and 11, PowerShell already includes
ssh. On a Mac, use Terminal.
Throughout this guide, replace these placeholders with your own values:
| Placeholder | Example |
|---|---|
YOUR_SERVER_IP | 203.0.113.25, from your VPS provider's dashboard |
social.yourdomain.com | The address KreateMix will live at |
kreatemix | The site user you'll create in CloudPanel |
2. Pick a VPS
CloudPanel needs 1 CPU core, 2 GB of RAM and 10 GB of disk. KreateMix itself is light: it keeps everything in one SQLite file. These are the cheapest plans that meet CloudPanel's minimum (prices checked October 2026; they change often, so confirm on the provider's site):
| Plan | Specs | Price | Best for |
|---|---|---|---|
| IONOS VPS S+ (recommended to start) | 1 vCore, 2 GB RAM, 60 GB NVMe | $2/month for the first 3 months, then the regular price (listed as $6/month). 1-year term. | The cheapest start, with plenty of disk for media |
| RackNerd KVM 2 GB | 2 vCPU, 2 GB RAM, 35 GB SSD | About $3/month, billed yearly ($35.99/year) | The lowest price over a full year |
Avoid 1 GB plans, even at $1–2 a month. They're below CloudPanel's minimum, and the panel's database server will run out of memory.
When you order:
- Choose Ubuntu 24.04 as the operating system. If you're offered an "app" or "control panel" image, pick plain Ubuntu instead. CloudPanel must go on an empty server.
- Pick the data center closest to you or your audience.
- Set a strong root password, or add your SSH key if the provider offers it.
- After the server is created, copy its IPv4 address from the dashboard.
If your provider has its own firewall in its dashboard (IONOS does), allow incoming TCP ports 22 (SSH), 80 and 443 (web) and 8443 (CloudPanel).
3. Point your domain at the server
At the company you bought your domain from (or wherever your DNS is managed, such as Cloudflare), add a DNS record:
| Type | Name / Host | Value | TTL |
|---|---|---|---|
| A | social (or @ to use the bare domain) | YOUR_SERVER_IP | Auto or 300 |
Do this now. It can take a few minutes to an hour to start working, and you'll need it working before step 8. If you use Cloudflare, set the record to DNS only (grey cloud) until HTTPS is set up.
4. Connect to the server
Open PowerShell (Windows) or Terminal (Mac/Linux) and run:
ssh root@YOUR_SERVER_IP
Type yes when asked whether to trust the server, then enter the root password. Nothing appears on screen while you type the password; that's normal. Your prompt will change to something like root@ubuntu:~#.
Some providers (including RackNerd) email you the root password. Some (including IONOS) show it in the server's dashboard.
5. Install CloudPanel
First, update the server and install the tools the installer needs:
apt update && apt -y upgrade && apt -y install curl wget sudo
If you're asked about keeping a configuration file, press Enter to keep the current one.
Add swap space
Swap is disk space the server uses when RAM runs out. On a 2 GB server it stops occasional memory spikes from crashing anything. Check whether you already have some:
free -h
If the Swap: line shows 0B, add 2 GB of swap:
fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
Run the installer
CloudPanel asks you to choose a database server. KreateMix doesn't use it (it has its own SQLite file), so pick MariaDB 11.4, which uses less memory than MySQL:
curl -sS https://installer.cloudpanel.io/ce/v2/install.sh -o install.sh; \
echo "8146dbe0a488e7088b04071b0c34d59aa0ab1fe9dcec382d395fd155c9e6c476 install.sh" | \
sha256sum -c && sudo DB_ENGINE=MARIADB_11.4 bash install.sh
The checksum line checks that the installer hasn't been tampered with. It takes 5–10 minutes and finishes with a message showing the panel's address.
If you see install.sh: FAILED, CloudPanel has released a new installer and the checksum above is out of date. Copy the current command from CloudPanel's installation docs and change only the DB_ENGINE= part. Don't remove the checksum check.
6. Create your CloudPanel admin and secure the panel
Do this straight after the installer finishes. Until an admin account exists, anyone who finds the address can create one.
- Open
https://YOUR_SERVER_IP:8443in your browser. - Your browser will warn about the certificate, because the panel uses a self-signed one at first. Click Advanced, then Proceed (or Accept the risk).
- Fill in your name, email, a username and a strong password, and create the admin user.
- Click your name (top right) and turn on Two-Factor Authentication with an authenticator app.
- Go to Admin Area → Security → Firewall. Edit the rule for port 8443 and set the source to your own IP address (search "what is my IP" to find it), so only you can reach the panel. Leave 22, 80 and 443 open to everyone.
If your home IP changes often, you can skip restricting 8443 and rely on a strong password and two-factor sign-in instead.
7. Create the site
- Go to Sites → Add Site → Create a PHP Site.
- Application: choose Generic.
- Domain Name:
social.yourdomain.com. - PHP Version: 8.5. KreateMix needs PHP 8.5 or newer and shows a message instead of starting on older versions.
- Site User:
kreatemix. Site User Password: click the generate button and save this password. You'll use it to connect over SSH in step 9. - Click Create.
CloudPanel creates the folder /home/kreatemix/htdocs/social.yourdomain.com for the site.
8. Turn on HTTPS
First check that your domain points at the server. On your own computer, run this. It should print YOUR_SERVER_IP:
nslookup social.yourdomain.com
Then, in CloudPanel:
- Open the site, then the SSL/TLS tab.
- Click Actions → New Let's Encrypt Certificate → Create and Install.
The certificate is free and renews itself automatically. HTTPS is required: social networks won't send logins back to a plain http:// address, and push notifications and the installable app only work over HTTPS.
9. Install KreateMix
Connect as the site user, not root, so the files belong to the right account. Use the password you saved in step 7:
ssh kreatemix@YOUR_SERVER_IP
Go to the site's folder, remove CloudPanel's placeholder page and download KreateMix:
cd ~/htdocs/social.yourdomain.com
rm -f index.html index.php
curl -fsSLO https://raw.githubusercontent.com/kennethyork/KreateMix/main/index.php
ls -l
You should see index.php, owned by kreatemix. Check that PHP has everything KreateMix needs. You should see six names, including pdo_sqlite:
php8.5 -m | grep -iE '^(pdo_sqlite|curl|openssl|mbstring|fileinfo|gd)$'
Prefer clicking to typing? Download index.php to your computer, then upload it with the site's File Manager tab in CloudPanel, or with an SFTP app such as FileZilla or WinSCP (host YOUR_SERVER_IP, port 22, the site user and password).
Create your account
Do this right away: the first person to open the site creates the admin account.
- Open
https://social.yourdomain.com. - Create the admin account.
On that first visit KreateMix creates two files. Both are hidden from the web:
| File | Where | What |
|---|---|---|
.ht.kreatemix-config.php | Next to index.php | Settings and the key that encrypts your accounts' tokens |
.ht.kreatemix-….sqlite | ~/htdocs/, one folder up, out of the web server's reach | The database: posts, accounts, analytics and uploaded media |
10. Check the scheduler
The scheduler wakes KreateMix every minute to publish posts that are due, refresh analytics and fetch comments. Without it, scheduled posts won't go out.
You usually don't need to do anything: when you created your admin account, KreateMix added its own cron job to the site user's crontab. As a backup, it also runs the scheduler right after pages load while you're using the site. Check it under Integrations → Scheduler:
- Running: you're done. Skip to step 11.
- Not running, with a Set it up for me button: click it, then check again in a minute.
- Not running, with a cron command shown instead: your server doesn't let KreateMix edit its own cron jobs. Add it in CloudPanel as below.
Add the cron job by hand
- In CloudPanel, open the site, then the Cron Jobs tab, then Add Cron Job.
- Name:
KreateMix scheduler - Pre-defined settings: Every Minute (all five fields become
*). - Command (Integrations → Scheduler shows the exact command for your server):
/usr/bin/php8.5 /home/kreatemix/htdocs/social.yourdomain.com/index.php cron >/dev/null 2>&1 - Click Add Cron Job.
If you later add or edit other cron jobs in CloudPanel, it may rewrite the list and drop the one KreateMix added. KreateMix notices and puts it back the next time you open the dashboard, or you can add it by hand as above.
To check it works, schedule a test post for two minutes from now. If you only want to test without posting for real, use Mastodon, Pixelfed or Bluesky, which need no API keys.
11. PHP settings for video uploads
PHP's default upload limit is too small for video. Open the site's Settings tab, scroll to PHP Settings, set these and click Save:
| Setting | Value |
|---|---|
| Memory Limit | 256M |
| Max Execution Time | 300 |
| Post Max Size | 256M |
| Upload Max Filesize | 256M |
If large uploads still fail with "413 Request Entity Too Large", open the site's Vhost tab, find client_max_body_size, set it to 256M and save.
12. Connect your social networks
Each network needs a free developer app that you create on its website, apart from Mastodon, Pixelfed, PeerTube and Bluesky.
- In KreateMix, open Platform API keys (instance admins only).
- Each network's panel shows a callback URL starting with
https://social.yourdomain.com/. Copy it exactly into the developer app you create on that network's site. - Paste the app's ID and secret back into KreateMix and save.
- Go to Accounts and connect.
| Network | What you need |
|---|---|
| Mastodon, Pixelfed, Bluesky | Nothing. Connect straight away (Bluesky uses an app password). |
| PeerTube | Just an account on any public PeerTube server (find one at joinpeertube.org). You don't run a video server yourself. |
| Facebook, Instagram, Threads | A Meta developer app |
| A LinkedIn developer app | |
| YouTube, Google Business | A Google Cloud OAuth client |
| X | An X developer app on an API plan with write access (paid) |
| TikTok, Pinterest | A developer app on their sites. TikTok posts privately until your app passes its audit. |
Meta, Google and TikTok ask for a privacy policy and terms page when you submit your app for review. KreateMix already serves them at /privacy, /terms and /data-deletion; edit them under Legal pages.
Optional extras, under Integrations: a mail server for emailed reports, an AI key, Canva, Google Drive and ad accounts. The README has notes for each.
13. Backups
Always back up the settings file and the database together. The key in .ht.kreatemix-config.php decrypts the tokens stored in the database. Lose the key, and every account has to be reconnected.
Automatic (recommended)
In CloudPanel, go to Admin Area → Backups. Choose a storage provider (Amazon S3, Backblaze B2, Wasabi, Dropbox, Google Drive and others), connect it and turn on daily backups. CloudPanel backs up everything in /home, which includes both KreateMix files. Backblaze B2 costs well under $1 a month for a site this size.
Manual
From your own computer, download both files into the current folder:
scp "kreatemix@YOUR_SERVER_IP:htdocs/.ht.kreatemix-*.sqlite" .
scp "kreatemix@YOUR_SERVER_IP:htdocs/social.yourdomain.com/.ht.kreatemix-config.php" .
To restore, upload both files to the same places on a new server.
14. Updating KreateMix
Connect as the site user and download the new version over the old one. The database upgrades itself on the next visit.
ssh kreatemix@YOUR_SERVER_IP
cd ~/htdocs/social.yourdomain.com
cp index.php index.php.bak
curl -fsSLO https://raw.githubusercontent.com/kennethyork/KreateMix/main/index.php
If anything goes wrong, put the old file back with mv index.php.bak index.php. Watch the GitHub repository (Watch → Custom → Releases) to hear about new versions.
15. Extra security (recommended)
These steps make the server much harder to break into. Do them once everything works.
Sign in with an SSH key instead of a password
On your own computer, create a key (press Enter at each question) and copy it to the server:
ssh-keygen -t ed25519
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh root@YOUR_SERVER_IP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
That second line is for Windows PowerShell. On Mac or Linux, use ssh-copy-id root@YOUR_SERVER_IP instead.
Check that ssh root@YOUR_SERVER_IP now logs in without asking for a password. Then turn off password logins for root:
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
systemctl restart ssh
The site user can still sign in with its password for uploads and updates. You can add your key for it the same way in the site's SSH/FTP tab in CloudPanel.
Use a strong KreateMix password
Your KreateMix admin account can post to every connected social account, so give it a long, unique password from a password manager.
Install updates monthly
As root, run apt update && apt -y upgrade about once a month, and reboot with reboot if it says a restart is required.
16. Troubleshooting
| Problem | Fix |
|---|---|
| Scheduled posts stay "scheduled" and never go out | The scheduler isn't running. Open Integrations → Scheduler: it shows when it last ran and offers Set it up for me. If you added the cron job by hand (step 10), check that its PHP version matches the site's and the path matches your domain. Test it by connecting as the site user and running the command without >/dev/null 2>&1 to see any errors. |
| "Redirect URI mismatch" or similar when connecting an account | The callback URL registered with the network must match the one KreateMix shows exactly, including https://. If KreateMix shows the wrong address, open .ht.kreatemix-config.php in the File Manager and set 'app_url' => 'https://social.yourdomain.com' (no trailing slash). |
| Instagram, Facebook or TikTok can't fetch your images | These networks download media from your server, so the site must be reachable from the internet over HTTPS. Check step 8, and that your provider's firewall allows ports 80 and 443. |
| "413 Request Entity Too Large", or uploads fail | Raise the limits in step 11, including client_max_body_size in the Vhost tab. |
| "500" or "502" error page | Look at the site's Logs tab in CloudPanel. If index.php was uploaded as root, fix the owner as root: chown kreatemix:kreatemix /home/kreatemix/htdocs/social.yourdomain.com/index.php. |
| Let's Encrypt certificate fails | Your domain doesn't point to the server yet. Wait for DNS (step 3), make sure Cloudflare is set to "DNS only", and try again. |
| Can't reach CloudPanel on port 8443 | Your IP probably changed since you restricted the port. SSH is still open, so tunnel through it: run ssh -L 8443:localhost:8443 root@YOUR_SERVER_IP, open https://localhost:8443, and update the firewall rule from step 6 with your new IP. |
Still stuck? Open an issue on GitHub with what you tried and any error from the Logs tab.