1. Who this guide is for
You’re self-hosting Bizuno on a Linux server — an Ubuntu/Debian VPS, an RHEL/Rocky/Alma host, or a bare-metal box at the office. You have shell access as root or a sudoer. You want Apache (or nginx), PHP, and MariaDB directly on the OS, not in a container.
This is the standard path for production self-hosting. If your control panel is ISPConfig, use the ISPConfig guide instead; if you’re evaluating, use Docker.
2. Prerequisites
- Ubuntu 22.04/24.04, Debian 12, RHEL/Rocky/Alma 9, or equivalent.
- A public DNS name pointing at the server, e.g.
bizuno.example.com. Not strictly required for local testing — required for Let’s Encrypt. - Root or sudo.
- Open inbound 80 and 443 (only 80 during initial cert issuance if you’re strict).
- ~2 GB disk, 1 GB RAM minimum. More is better for anything beyond a small shop.
The commands below are the Debian/Ubuntu (apt) flavor first, then the RHEL (dnf) equivalent. Pick your family and run that block.
3. Step-by-step install
3.1 Update the system
Debian / Ubuntu:
sudo apt update && sudo apt -y upgrade
RHEL / Rocky / Alma:
sudo dnf -y update
3.2 Install Apache, PHP 8.2, MariaDB
Debian / Ubuntu:
sudo apt -y install apache2 mariadb-server \
php8.2 php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml \
php8.2-gd php8.2-curl php8.2-zip php8.2-intl php8.2-bcmath \
libapache2-mod-php8.2
RHEL / Rocky / Alma (enable Remi first for current PHP):
sudo dnf -y install epel-release
sudo dnf -y install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
sudo dnf -y module reset php
sudo dnf -y module enable php:remi-8.2
sudo dnf -y install httpd mariadb-server \
php php-fpm php-mysqlnd php-mbstring php-xml \
php-gd php-curl php-zip php-intl php-bcmath
Start and enable services:
sudo systemctl enable --now apache2 mariadb # Debian/Ubuntu
sudo systemctl enable --now httpd mariadb # RHEL/Rocky/Alma
(If you prefer nginx: replace the Apache package with nginx and skip libapache2-mod-php8.2. See 3.6 for an nginx server block.)
3.3 Harden MariaDB and create the database
sudo mysql_secure_installation
Say yes to everything except “remove anonymous users” if you need remote access (you usually don’t).
Create the database and user:
sudo mariadb
CREATE DATABASE bizuno CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'bizuno'@'localhost' IDENTIFIED BY 'CHANGE-THIS-PASSWORD';
GRANT ALL PRIVILEGES ON bizuno.* TO 'bizuno'@'localhost';
FLUSH PRIVILEGES;
EXIT;
3.4 Put Bizuno in place
sudo mkdir -p /var/www/bizuno
cd /tmp
curl -LO https://github.com/bizuno/bizuno/releases/latest/download/bizuno.tar.gz
sudo tar xzf bizuno.tar.gz -C /var/www/bizuno --strip-components=1
Set ownership. Debian/Ubuntu’s web user is www-data; RHEL/Rocky/Alma’s is apache:
# Debian / Ubuntu
sudo chown -R www-data:www-data /var/www/bizuno
# RHEL / Rocky / Alma
sudo chown -R apache:apache /var/www/bizuno
sudo find /var/www/bizuno -type d -exec chmod 755 {} \;
sudo find /var/www/bizuno -type f -exec chmod 644 {} \;
3.5 Apache virtual host
Create /etc/apache2/sites-available/bizuno.conf (Debian/Ubuntu) or /etc/httpd/conf.d/bizuno.conf (RHEL):
<VirtualHost *:80>
ServerName bizuno.example.com
DocumentRoot /var/www/bizuno
<Directory /var/www/bizuno>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/bizuno-error.log
CustomLog ${APACHE_LOG_DIR}/bizuno-access.log combined
</VirtualHost>
(On RHEL, the log path is /var/log/httpd/.)
Enable and reload (Debian/Ubuntu):
sudo a2ensite bizuno.conf
sudo a2enmod rewrite
sudo systemctl reload apache2
RHEL:
sudo systemctl reload httpd
3.6 nginx alternative
If you picked nginx instead of Apache, create /etc/nginx/sites-available/bizuno:
server {
listen 80;
server_name bizuno.example.com;
root /var/www/bizuno;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
location ~ /\.(ht|git) { deny all; }
location ~ ^/data/ { deny all; }
}
sudo ln -s /etc/nginx/sites-available/bizuno /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
3.7 Issue a TLS certificate with Let’s Encrypt
sudo apt -y install certbot python3-certbot-apache # or python3-certbot-nginx
sudo certbot --apache -d bizuno.example.com # or --nginx
RHEL:
sudo dnf -y install certbot python3-certbot-apache
sudo certbot --apache -d bizuno.example.com
Certbot edits your vhost in place and sets up auto-renewal via a systemd timer. Confirm with sudo systemctl list-timers | grep certbot.
3.8 Open Bizuno
Navigate to https://bizuno.example.com/. The install wizard runs. Database host localhost, database bizuno, user bizuno, password as set in 3.3. Finish the wizard.
4. First-login walkthrough
- Install wizard creates the admin account.
- Choose demo data or empty install.
- Confirm Tools → System Info shows PHP 8.2 and MariaDB 10.6+.
- Walk through the Getting Started doc category.
5. Upgrade path
cd /var/www/bizuno
sudo -u www-data php bin/backup.php # creates data/backups/YYYY-MM-DD.sql.gz
# Debian/Ubuntu; on RHEL use -u apache
cd /tmp
curl -LO https://github.com/bizuno/bizuno/releases/latest/download/bizuno.tar.gz
sudo tar xzf bizuno.tar.gz -C /var/www/bizuno --strip-components=1 \
--exclude='data' --exclude='myConfig.php'
sudo chown -R www-data:www-data /var/www/bizuno # or apache:apache on RHEL
The next browser hit runs migrations. Watch the error log as it does.
Always take a DB snapshot first. If you skipped the bin/backup.php line, mysqldump -u root -p bizuno > /root/bizuno-pre-upgrade.sql does the job.
6. Uninstall / teardown
sudo rm -rf /var/www/bizuno
sudo mariadb -e "DROP DATABASE bizuno; DROP USER 'bizuno'@'localhost';"
sudo a2dissite bizuno.conf && sudo systemctl reload apache2 # or remove the nginx site
sudo rm /etc/apache2/sites-available/bizuno.conf # adjust path for RHEL/nginx
To remove the LAMP stack entirely:
# Debian / Ubuntu
sudo apt -y purge apache2 mariadb-server 'php8.2*' && sudo apt -y autoremove
# RHEL
sudo dnf -y remove httpd mariadb-server 'php*'
7. Troubleshooting
“502 Bad Gateway” from nginx. PHP-FPM isn’t running, or the socket path is wrong. sudo systemctl status php8.2-fpm and confirm the fastcgi_pass path matches listen = in /etc/php/8.2/fpm/pool.d/www.conf.
“403 Forbidden” at the root. index.php isn’t being served. On Apache, confirm mod_php or mod_proxy_fcgi is enabled and the <Directory> block’s AllowOverride All is there. On nginx, confirm the try_files line.
“Cannot write to data/.” Ownership or SELinux. ls -ld /var/www/bizuno/data. If the owner is wrong, chown it to www-data or apache. On RHEL, SELinux may be blocking writes — sudo setsebool -P httpd_unified 1 is usually enough, or label the directory: sudo chcon -R -t httpd_sys_rw_content_t /var/www/bizuno/data.
“Could not connect to database: Access denied.” The DB user’s password in myConfig.php doesn’t match what MariaDB has. sudo mariadb and reset it.
“The upgrade left me stuck on the migration screen.” Don’t reload. Read the full message in the browser, then check data/logs/migrate.log — the exact failing SQL is there. Restore from your backup, file a GitHub issue with the log, and ask on the forum.
“Let’s Encrypt issued, but Chrome says certificate is for the wrong name.” Apache/nginx served the default vhost instead of the Bizuno vhost. On Apache, sudo a2dissite 000-default; on nginx, remove the default server block.
8. Where to go next
- Getting Started doc category.
- Set up off-site backups:
cron+mysqldump+rcloneto S3/B2/Dropbox. A template script ships in/var/www/bizuno/contrib/backup.sh. - Enable a firewall.
sudo ufw allow OpenSSH && sudo ufw allow 'Apache Full' && sudo ufw enable(Debian/Ubuntu).firewalldon RHEL. - Ask in Install & Setup → LAMP.
This guide is mirrored at bizuno/bizuno-docs/install-lamp.md on GitHub. The Markdown file is the source of truth.