How to Install Froxlor on Ubuntu 24.04 VPS: Lightweight Free Hosting Control Panel
If you want to run a small web hosting business, host client sites for a web design agency, or simply manage a handful of domains on a single server without the monthly cost of cPanel or Plesk, Froxlor is one of the most efficient open-source control panels available. It was born as a fork of SysCP back in 2009, has been actively maintained by a German-led community since, and targets exactly the workloads that commercial panels have priced out of reach: lean VPS hardware, multi-tenant hosting, and technical operators who prefer transparent configuration over black-box automation.
This guide walks you through installing Froxlor on Ubuntu 24.04 LTS from a fresh SSH login all the way to issuing a Let's Encrypt certificate for your first customer's domain. By the end, you will have a working shared-hosting style stack with Apache (or Nginx), MariaDB, PHP-FPM pools per customer, Postfix + Dovecot mail, Bind DNS, and ProFTPd for file transfer.
Prefer a panel with one-click apps and a graphical file manager? See our guides for HestiaCP, ISPConfig, and CyberPanel. If you want the absolute lowest overhead, keep reading -- Froxlor is the right call.
Table of Contents
What is Froxlor?
Froxlor is a free, open-source web hosting control panel written in PHP. It manages the full lifecycle of a shared or reseller hosting environment: customer accounts, domains and subdomains, web server virtual hosts, PHP-FPM pools, mail accounts, FTP users, MySQL databases, and DNS zones. Administrators define hosting plans with quotas (disk, traffic, mailboxes, databases, domains) and assign them to customers. Customers then log in with their own credentials and self-serve within those limits.
Under the hood, Froxlor does not replace standard Linux services -- it generates and rewrites their configuration files. When you add a domain in the UI, Froxlor writes a new Apache or Nginx vhost file, a dedicated PHP-FPM pool if configured, a Postfix virtual mailbox entry, a Bind zone, and a ProFTPd user block. A cron job runs every minute and reloads any service whose configuration has changed. This architecture keeps the panel itself stateless in a useful way: if Froxlor stops running, your sites keep serving, because all of the actual config is standard Debian/Ubuntu-style files on disk.
Supported services include:
- Web servers: Apache 2.4, Nginx, LiteSpeed, OpenLiteSpeed
- PHP: Multiple PHP-FPM versions side by side (e.g. 7.4, 8.1, 8.2, 8.3) with per-customer pool configuration
- Database: MariaDB or MySQL with per-customer database quotas
- Mail: Postfix SMTP + Dovecot IMAP/POP3 with virtual mailboxes, spam filtering via rspamd, DKIM
- DNS: Bind9 or PowerDNS with auto-generated zones for every customer domain
- FTP: ProFTPd with per-customer chrooted users
- SSL: Native Let's Encrypt ACME v2 client with HTTP-01 and optional DNS-01 challenges
Why Self-Host a Free Control Panel?
The control panel market has consolidated hard since 2020. cPanel moved to per-account pricing that now costs USD 15-30 per month for a single-server license, and each additional account raises the bill. Plesk followed with similar structures. For a web agency hosting 20 client sites or a freelancer running a side hustle on a single VPS, the panel license can easily cost more than the hardware it runs on.
Self-hosting a free panel like Froxlor flips the economics:
- Zero license cost, forever -- Froxlor is GPL v2. No trial, no paid unlock, no "professional edition." Every feature ships with the base install.
- Low hardware overhead -- The entire Froxlor stack (Apache + MariaDB + PHP-FPM + Postfix + Dovecot + Bind + ProFTPd) runs happily in 2 GB of RAM. That is half of what cPanel needs idle.
- Standard Linux under the hood -- You are running vanilla Apache, MariaDB, and Postfix. Every configuration file is auditable, editable, and recoverable. There is no proprietary daemon holding your data hostage.
- Transparent upgrades -- Froxlor ships through Debian/Ubuntu apt repositories.
apt upgradehandles the panel the same way it handles any other system package. - Multi-tenant from day one -- Unlike single-site panels, Froxlor is built for resellers. You get customers, plans, quotas, and per-customer isolation out of the box.
- GDPR-aligned -- Runs on your own VPS in whatever jurisdiction you choose. No vendor telemetry, no mandatory cloud sync.
When Froxlor is the Right Pick
| Use case | Froxlor fit | Alternative |
|---|---|---|
| Freelancer hosting 5-30 client sites | Excellent | HestiaCP if you want a GUI file manager |
| Small hosting reseller business | Excellent | ISPConfig for more granular multi-server setups |
| Single developer with a handful of personal domains | Overkill but fine | Caddy + Docker is lighter |
| Hosting WordPress at scale with one-click installs | Weak | CyberPanel (LiteSpeed) or HestiaCP |
| Enterprise mail hosting | Weak | Mailcow or iRedMail |
Prerequisites
Before you begin, you will need:
- A VPS running Ubuntu 24.04 LTS with root or sudo access
- SSH access to your server (PuTTY on Windows, or the built-in terminal on macOS/Linux)
- At least 2 GB of RAM (4 GB strongly recommended for production)
- At least 20 GB of free disk space (more if you will host customer files and mail)
- A domain or subdomain with DNS
Arecords pointing to your VPS IP (for examplepanel.yourdomain.com) - Ports open: 22 (SSH), 25/465/587 (SMTP), 110/143/993/995 (POP3/IMAP), 21/21000-21010 (FTP), 53 (DNS), 80/443 (HTTP/HTTPS)
Recommended Plan: CloudCore Starter>
Froxlor shines on modest hardware. We recommend the CloudCore Starter plan for a first panel deployment:>
- 2 vCPU cores
- 4 GB RAM
- 50 GB NVMe SSD
- Unmetered bandwidth
- EUR 7.99/month>
That is enough to comfortably host 10-20 low-traffic customer sites with email, DNS, and FTP. When you outgrow it, scale to CloudCore Professional without migrating the disk.
Connect to your server via SSH to get started:
ssh root@your-server-ipStep 1: Update System Packages
Always begin a panel install on a fully patched base. This prevents dependency mismatches and closes known security holes before services start listening on the public network.
sudo apt update && sudo apt upgrade -yExpected output (abbreviated):
Reading package lists... Done
Building dependency tree... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.If the kernel was updated, reboot:
sudo rebootInstall a couple of utilities Froxlor and its dependencies rely on:
sudo apt install -y curl wget gnupg ca-certificates lsb-release software-properties-commonStep 2: Set Hostname and DNS
Froxlor expects a fully qualified domain name (FQDN) as the server hostname. Mail delivery, reverse DNS checks, and Let's Encrypt all depend on this being correct.
Set the hostname (replace with your panel subdomain):
sudo hostnamectl set-hostname panel.yourdomain.comAdd the hostname to /etc/hosts so local lookups resolve immediately:
sudo tee -a /etc/hosts > /dev/null <<EOF
127.0.1.1 panel.yourdomain.com panel
EOFAt your DNS provider (Cloudflare, your registrar, or a dedicated DNS service), create an A record:
panel.yourdomain.com A <your-vps-ip>Verify DNS resolution from the server:
dig +short panel.yourdomain.comThe command should return your VPS IP. Wait for propagation if it does not -- Let's Encrypt will fail later without it.
Step 3: Add the Froxlor APT Repository
Froxlor ships an official APT repository with signed packages. This is the supported install method for Ubuntu 24.04.
Import the signing key:
sudo install -d -m 0755 /etc/apt/keyrings
wget -qO- https://deb.froxlor.org/froxlor.gpg | sudo tee /etc/apt/keyrings/froxlor.asc > /dev/nullAdd the repository:
echo "deb [signed-by=/etc/apt/keyrings/froxlor.asc] https://deb.froxlor.org/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/froxlor.listRefresh the package index so apt sees the new repo:
sudo apt updateExpected output should include a line referencing deb.froxlor.org:
Hit:5 https://deb.froxlor.org/ubuntu noble InReleaseStep 4: Install the Froxlor Stack
The froxlor meta-package pulls in every service Froxlor manages. You can also cherry-pick, but for a first install, the meta-package is the fastest path.
sudo apt install -y froxlorThis installs, in a single transaction:
- Apache 2.4 (web server -- swap to Nginx in Step 5 if preferred)
- MariaDB server (database backend for Froxlor and customer databases)
- PHP-FPM (default 8.3 on Ubuntu 24.04) with common extensions
- Postfix (SMTP mail transfer agent)
- Dovecot (IMAP/POP3 server with virtual mailbox support)
- Bind9 (authoritative DNS server -- swap to PowerDNS later if preferred)
- ProFTPd (FTP server, with
mod_sqlfor virtual users against MariaDB) - Certbot (for Let's Encrypt, used as a fallback -- Froxlor has its own ACME client too)
panel.yourdomain.com).Secure MariaDB with the interactive hardening script:
sudo mysql_secure_installationAnswer the prompts as follows:
- Enter current password: press Enter (none set)
- Switch to unix_socket authentication: n
- Change the root password: y, then set a strong one
- Remove anonymous users: y
- Disallow root login remotely: y
- Remove test database: y
- Reload privilege tables: y
Enable the Apache modules Froxlor expects:
sudo a2enmod rewrite ssl headers proxy proxy_fcgi setenvif http2
sudo systemctl restart apache2Open the necessary ports in UFW (adjust if you use another firewall):
sudo ufw allow OpenSSH
sudo ufw allow 'Apache Full'
sudo ufw allow 25/tcp
sudo ufw allow 465/tcp
sudo ufw allow 587/tcp
sudo ufw allow 110/tcp
sudo ufw allow 143/tcp
sudo ufw allow 993/tcp
sudo ufw allow 995/tcp
sudo ufw allow 21/tcp
sudo ufw allow 21000:21010/tcp
sudo ufw allow 53
sudo ufw --force enableStep 5: Run the Web Install Wizard
With the packages installed, the rest of setup happens in the browser. Open:
https://panel.yourdomain.com/froxlorYour browser will warn about the self-signed default certificate -- click through. You will replace it with Let's Encrypt once the panel is up.
The wizard walks through five screens:
php-mysql (already pulled by the meta-package on 24.04, but confirm).localhost
- Root user: root
- Root password: the one you set in mysql_secure_installation
- New database name: froxlor
- New database user: froxlor
- New database user password: click "generate" or supply your own
admin (or anything memorable -- avoid root)
- Password: a strong, unique password
panel.yourdomain.com
- Server IP: your public IPv4 (auto-detected)
- Web server: choose Apache (or Nginx if you removed apache2 and installed nginx instead)
- Language: your preference
/var/www/html/froxlor/lib/userdata.inc.php and redirects you to the login page.Log in with the admin credentials you just set. You should land on the Froxlor dashboard.
Optional: Switch to Nginx
If you prefer Nginx over Apache, do this before creating any domains:
sudo systemctl stop apache2 && sudo systemctl disable apache2
sudo apt install -y nginxIn the Froxlor UI go to System > Settings > Webserver, change the webserver to nginx, save, then rebuild configs from System > Configuration (select your OS + nginx + PHP-FPM, follow the generated command list).
Step 6: Install the Cron Master Job
Froxlor does almost all of its work through a master cron that runs every minute. It rewrites vhost files, reloads services when something changed, renews Let's Encrypt certs, and processes the internal task queue. Without it, nothing you click in the UI will take effect.
In Froxlor, navigate to System > Configuration, select:
- Distribution:
Ubuntu 24.04 LTS (Noble Numbat) - Service:
Cronjobs
sudo cp /var/www/html/froxlor/install/froxlor.conf /etc/cron.d/froxlor
sudo chmod 644 /etc/cron.d/froxlor
sudo systemctl restart cronVerify the master cron is firing:
sudo tail -f /var/log/syslog | grep froxlorWithin a minute you should see a Froxlor cron tick logged. Press Ctrl+C to exit.
Run the task queue manually once to flush any initial tasks:
sudo -u www-data php /var/www/html/froxlor/bin/froxlor-cli froxlor:cron --run-task=1
sudo -u www-data php /var/www/html/froxlor/bin/froxlor-cli froxlor:cron --run-task=99Step 7: Create Your First Hosting Plan
Hosting plans are templates. Instead of setting 12 quota fields every time you onboard a customer, define a plan once and assign it.
In the Froxlor admin UI:
Starter -- 5 GB disk, 5 domains, 10 mailboxes
- Diskspace: 5120 MB
- Traffic: 50000 MB/month
- Subdomains: 10
- Emails: 10
- Email accounts: 10
- Email forwarders: 20
- MySQL databases: 3
- FTP accounts: 2
Repeat for "Pro" and "Business" tiers if you plan to sell multiple packages. Plans become selectable in the customer creation form next.
Step 8: Add a Customer and Domain
Every hosted site in Froxlor belongs to a customer. The customer login scope is sandboxed to their own domains, databases, mailboxes, and FTP users.
Create the customer
customer1 (Froxlor prefixes it internally -- e.g. web1)
- Password: generated or supplied
- Name, email, company fields
- Language, timezone
/var/customers/webs/web1/ and their mail directory under /var/customers/mail/web1/.Add the customer's domain
customer1) in a private window, or stay as admin and use the "switch user" link.customer1domain.com./var/customers/webs/web1/customer1domain.com/).Froxlor writes an Apache/Nginx vhost file, queues a service reload, and the cron master picks it up within a minute. Within 60 seconds, http://customer1domain.com/ will serve the default Froxlor placeholder page.
Step 9: FTP, Email, and MySQL for the Customer
All three live under the customer login, so switch to the customer account (or use "switch user" from admin).
FTP account
web1ftp1).Test from your workstation:
ftp -p customer1domain.com
Or sftp if you prefer -- ProFTPd also supports FTPS on 21 with AUTH TLS
Email accounts
customer1domain.com.info.[email protected], choose Create account, set a quota and password.Postfix picks up the new virtual mailbox from MariaDB (no reload needed), and Dovecot starts accepting IMAP/POP3 on the usual ports.
MySQL database
wordpress.web1sql1).The customer can now install WordPress, a PHP framework, or any app. Credentials shown on screen once -- they must save them immediately.
Step 10: Enable Let's Encrypt SSL
Froxlor has a built-in ACME v2 client. No certbot juggling required.
Global setup
As admin:
Per-domain
Edit customer1domain.com:
Within one to two cron cycles (1-2 minutes), the Froxlor cron task 99 (Let's Encrypt) runs:
sudo -u www-data php /var/www/html/froxlor/bin/froxlor-cli froxlor:cron --run-task=99You can force it manually to avoid waiting. When it succeeds, the domain has a real cert under /etc/ssl/froxlor-custom/customer1domain.com.pem and the Apache/Nginx vhost is rewritten to include the HTTPS server block.
Repeat for the panel itself: add panel.yourdomain.com as an admin-owned domain with Let's Encrypt enabled, then point the panel SSL to that cert in System > Settings > SSL.
Step 11: Mail, DNS, and ProFTPd Sanity Checks
A quick round of checks before you declare victory.
SMTP
From any machine with swaks:
swaks --to [email protected] --server panel.yourdomain.com --tlsYou should see a 250 Ok at the end and the message should appear in the webmail or IMAP inbox of [email protected].
IMAP
openssl s_client -connect panel.yourdomain.com:993 -quietThe Dovecot banner starts with * OK.
DNS (Bind)
Froxlor generates Bind zones under /etc/bind/domains/. Verify one is live:
dig @panel.yourdomain.com customer1domain.comThe answer section should include the configured A record. If you prefer PowerDNS over Bind, stop and disable bind9, install pdns-server and pdns-backend-mysql, then switch the nameserver driver in System > Settings > System > Nameserver. Froxlor writes directly to the PowerDNS MariaDB backend.
ProFTPd
ftp -p panel.yourdomain.comLogin with the FTP credentials from Step 9 -- you should land inside the customer's chrooted webroot.
Hardening and Backups
A control panel is a privileged surface. Treat it accordingly.
SSH -- Disable password login once you have keys in place: PasswordAuthentication no in /etc/ssh/sshd_config.
Fail2ban -- Protects SSH, Postfix, Dovecot, and ProFTPd out of the box:
sudo apt install -y fail2ban
sudo systemctl enable --now fail2banPanel 2FA -- Froxlor supports TOTP. In the admin profile, enable 2FA and scan the QR in Aegis/Authy/1Password.
Automatic updates -- For a hosting panel, restrict unattended-upgrades to security only (the defaults), and monitor the Froxlor blog for panel releases.
Daily backups -- Use the Froxlor Extras > Customer-Backups plugin for per-customer dumps, plus a server-level nightly rsync/Restic to off-site storage. At minimum, back up:
/var/customers/(webroots + mail)/var/lib/mysql/(or nightlymysqldump --all-databases)/etc/bind/,/etc/postfix/,/etc/dovecot/,/etc/apache2/(or nginx),/etc/proftpd//var/www/html/froxlor/lib/userdata.inc.php(DB credentials)
Troubleshooting
| Problem | Cause | Solution |
|---|---|---|
apache2: AH00558: Could not reliably determine the server's fully qualified domain name | Hostname not in /etc/hosts | Add 127.0.1.1 panel.yourdomain.com panel and restart Apache |
Wizard stuck at "Database setup" with SQLSTATE[HY000] [1698] | MariaDB root uses unix_socket auth | Run sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<pwd>';" |
| Customer domain serves Apache "It works!" page instead of placeholder | Cron master has not run yet, or vhost conflict | sudo -u www-data php /var/www/html/froxlor/bin/froxlor-cli froxlor:cron --run-task=1 then sudo systemctl reload apache2 |
Let's Encrypt fails with Invalid response from ... | DNS A record not propagated or port 80 blocked | dig +short yourdomain.com must return VPS IP. Check UFW and hosting provider firewall for port 80. |
Postfix rejects with relay access denied | SMTP AUTH not enabled for the mailbox | In customer UI, open the email account and set a password. Use submission port 587 with STARTTLS. |
ProFTPd: Fatal: unable to open source file | PAM/MySQL config regenerated but ProFTPd not reloaded | sudo systemctl reload proftpd; verify /etc/proftpd/sql.conf references MariaDB correctly |
| PHP-FPM pool fails to start after adding customer | PHP version mismatch in plan | In System > Settings > PHP-FPM, ensure the default version matches an installed php8.X-fpm package |
| Froxlor UI slow or times out | froxlor:cron task 99 (LE) running with many domains | Split LE renewals across a different cron schedule or temporarily disable HSTS preload on new domains |
Logs to check first
sudo tail -n 100 /var/log/froxlor/crons.log
sudo tail -n 100 /var/log/apache2/error.log
sudo journalctl -u postfix -n 100
sudo journalctl -u dovecot -n 100
sudo journalctl -u proftpd -n 100FAQ
Is Froxlor really free?
Yes. Froxlor is fully open-source under the GPL v2 license with no paid tiers, license keys, or user limits. You can install it on as many servers as you want and host unlimited customers and domains at no charge. Development is funded through voluntary donations and sponsorships, and the project is maintained on GitHub under an active community of contributors.
How does Froxlor compare to cPanel or Plesk?
Froxlor is much lighter than cPanel or Plesk and runs comfortably on a 2 GB VPS, while cPanel typically needs 4 GB+ and costs USD 15-30 per month. Froxlor focuses on the essentials: customers, domains, email, FTP, MySQL, and DNS. It does not ship a graphical file manager or one-click app installer, but everything you need to run a shared hosting or reseller setup is covered. If you need WordPress one-click, Softaculous integration, or a polished file manager, consider HestiaCP or CyberPanel instead.
Can I use Nginx instead of Apache with Froxlor?
Yes. Froxlor supports Apache, Nginx, LiteSpeed, and OpenLiteSpeed. You choose the web server during the install wizard, and you can switch later in System > Settings. Nginx pairs well with PHP-FPM for high-traffic static and PHP sites on modest hardware. If your workload is WordPress-heavy and you want LiteSpeed's LSCache, CyberPanel is a better fit; for everything else, Nginx + Froxlor is an excellent combination.
Does Froxlor support Let's Encrypt SSL?
Yes. Froxlor has built-in Let's Encrypt integration. Enable it globally in System > Settings > SSL, then toggle it per domain or subdomain. Certificates are requested through the HTTP-01 challenge, stored centrally under /etc/ssl/froxlor-custom/, and renewed automatically by the Froxlor cron master job (task 99) every day. Wildcard certificates via DNS-01 are supported if you configure a compatible DNS provider plugin.
What is the minimum VPS size needed to run Froxlor?
Froxlor runs on 1 GB of RAM in theory, but once Apache/Nginx, MariaDB, PHP-FPM, Postfix, Dovecot, Bind, and ProFTPd are all active, 2 GB is the realistic floor. For production shared hosting serving a handful of customers, we recommend 4 GB RAM and 2 vCPU. The CloudCore Starter plan at EUR 7.99/month matches this profile exactly and gives you room to grow to 10-20 active customer sites before you need to scale up.
Can Froxlor manage multiple servers?
Partially. Froxlor's primary design is single-server. There is support for a limited form of split setups -- for instance, a dedicated DNS server or a separate mail server receiving configurations from the main panel via SSH. True multi-server clustering with load balancing across web nodes is not a first-class feature. If you need that, ISPConfig or a Kubernetes-based approach is a better fit.
How do I migrate away from Froxlor later?
Because Froxlor uses standard Linux services, migration is straightforward. Customer webroots live under /var/customers/webs/ -- rsync them. MySQL databases export with mysqldump. Postfix virtual mailboxes sit in /var/customers/mail/ as Maildir. DNS zones are plain Bind or PowerDNS. You can move to any other panel or a plain unmanaged stack without vendor lock-in.
Next Steps
Now that Froxlor is installed and your first customer is provisioned, here are recommended next steps:
- Automate customer provisioning via the API -- Froxlor ships a JSON API you can call from your billing platform (WHMCS, Invoice Ninja, custom app). See the API Guide in the Froxlor docs to generate an API key under Resources > API and POST to
/api.phpfor customer, domain, and email creation. - Add a webmail client -- Install Roundcube or Rainloop on a subdomain and point it at Dovecot. Customers get a branded webmail URL.
- Set up rspamd and DKIM -- Froxlor integrates with rspamd out of the box; enabling it dramatically improves mail deliverability. Generate DKIM keys from the panel and publish the
TXTrecord at your DNS provider. - Compare panels side by side -- If Froxlor feels too minimal, read our guides on HestiaCP for a more GUI-heavy experience, ISPConfig for multi-server deployments, and CyberPanel for LiteSpeed and WordPress-first workflows.
- Read the official docs -- The Froxlor documentation covers advanced topics like custom PHP-FPM pools, OpenBaseDir hardening, quota enforcement, and the cron task reference.
Deploy Your Froxlor VPS in Minutes>
Our CloudCore Starter plan is tuned for lightweight control panels like Froxlor:>
- 2 vCPU, 4 GB RAM, 50 GB NVMe SSD
- Ubuntu 24.04 LTS image ready to go
- Root access and full port control
- EUR 7.99/month with unmetered bandwidth>
Launch your VPS now and have Froxlor running inside 30 minutes.