Ubuntu 24.04 LTS ("Noble Numbat") is the recommended host for a 2026 AcelleMail install. It ships PHP 8.3 in the universe repo, MySQL 8.0 from the official PPA, and is supported until April 2029 — long enough to outlive a typical AcelleMail major-version cycle. This guide walks the install end-to-end, from a freshly-provisioned droplet to a working https://mail.example.com admin login.
Tested against a $9 Hetzner CPX21 (3 vCPU AMD, 4 GB RAM, 80 GB SSD) and a DigitalOcean $24 Premium AMD 2vCPU/4GB droplet — both pass the Server Requirements "Small tier" bar comfortably. If you're targeting > 500k sends/month, scale RAM to 8 GB and split the database to a managed instance (see scaling guide).
Step 0 — Pre-flight checklist#
Before the SSH session, line up:
- A 2 vCPU / 4 GB / 50 GB Ubuntu 24.04 droplet with a public IPv4. Cheaper hosts like Hetzner CX22 work for hobby tier; production should use 4 GB or more.
- A domain name (e.g.
mail.example.com) with the A record pointing at the droplet IP. Wait for DNS propagation (dig +short mail.example.com should return your IP) before requesting an SSL certificate.
- A non-root sudo user — every command below assumes you've already done
adduser acelle, usermod -aG sudo acelle, and ssh-copy-id acelle@host. Never run AcelleMail as root.
- An AcelleMail purchase code from CodeCanyon. You'll paste it during the web installer at the end.
The acellemail-latest.zip (full install bundle, ~270 MB per the Acelle support handbook) is what you'll use — not the patch .bin file. Patches only apply to existing installs.
Step 1 — System packages#
sudo apt-get update -y && sudo apt-get upgrade -y
sudo apt-get install -y software-properties-common ca-certificates lsb-release \
curl wget unzip gnupg2 dirmngr
software-properties-common is needed for the add-apt-repository command in the next step. The other packages are belt-and-suspenders — unzip for the install bundle, curl/wget for fetching it, gnupg + dirmngr for the PPA signing key.
Step 2 — PHP 8.3 (the engine)#
AcelleMail 4.2+ requires PHP 8.2 or newer. Ubuntu 24.04 ships PHP 8.3 in universe, but the Ondrej PPA gives faster security updates and the same package layout the Acelle support team uses across hundreds of installs (see the support handbook's PHP 8.2 Install & Switch section). Install via the PPA:
sudo add-apt-repository -y ppa:ondrej/php
sudo apt-get update -y
sudo apt-get install -y php8.3 php8.3-fpm php8.3-mysql php8.3-mbstring \
php8.3-xml php8.3-curl php8.3-zip php8.3-gd php8.3-intl \
php8.3-imap php8.3-gmp php8.3-sqlite3 php8.3-mailparse php8.3-bcmath \
php8.3-redis php8.3-soap
Bump the php.ini knobs that AcelleMail will hit on real campaigns:
sudo sed -i 's/^memory_limit = .*/memory_limit = 512M/' /etc/php/8.3/fpm/php.ini
sudo sed -i 's/^upload_max_filesize = .*/upload_max_filesize = 300M/' /etc/php/8.3/fpm/php.ini
sudo sed -i 's/^post_max_size = .*/post_max_size = 300M/' /etc/php/8.3/fpm/php.ini
sudo sed -i 's/^max_execution_time = .*/max_execution_time = 300/' /etc/php/8.3/fpm/php.ini
# Apply the same to CLI ini for artisan / queue workers
sudo sed -i 's/^memory_limit = .*/memory_limit = 512M/' /etc/php/8.3/cli/php.ini
Why those numbers? upload_max_filesize and post_max_size of 300 MB give headroom for the patch upgrade flow (the .bin file is 100-150 MB and the full zip is 270 MB) — picking the larger value avoids a mid-upgrade failure where nginx accepts the body but php-fpm rejects it. memory_limit of 512 MB covers list imports of 250k+ subscribers in a single CSV.
sudo systemctl enable --now php8.3-fpm
Step 3 — MySQL 8.0#
Ubuntu 24.04's universe ships MySQL 8.0:
sudo apt-get install -y mysql-server
sudo mysql_secure_installation
# Answer: VALIDATE PASSWORD = no (you control AcelleMail's password yourself);
# remove anonymous users = yes; disallow root remotely = yes;
# remove test database = yes; reload privileges = yes.
Create the AcelleMail database and a dedicated DB user:
sudo mysql <<SQL
CREATE DATABASE acellemail
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'acellemail'@'localhost' IDENTIFIED BY '$(openssl rand -base64 24)';
GRANT ALL PRIVILEGES ON acellemail.* TO 'acellemail'@'localhost';
FLUSH PRIVILEGES;
SQL
utf8mb4 is non-negotiable. Old AcelleMail installs (pre-2022) shipped utf8_unicode_ci — that's a 3-byte charset that chokes on emoji subject lines and certain Asian characters. The support handbook's troubleshooting section ("DB charset utf8 vs utf8mb4") records repeated incidents where the template seeder fails because of this — always use utf8mb4 on a fresh install.
Step 4 — Redis 7#
Optional but strongly recommended — Redis backs the queue + cache and yields meaningful throughput gains over the default file-driver queue:
sudo apt-get install -y redis-server
sudo sed -i 's/^supervised .*/supervised systemd/' /etc/redis/redis.conf
sudo systemctl restart redis-server
sudo systemctl enable redis-server
The supervised systemd line is what lets systemctl correctly track Redis health for restart-on-failure semantics.
Step 5 — Nginx 1.24#
sudo apt-get install -y nginx
sudo systemctl enable --now nginx
sudo ufw allow 'Nginx Full' # opens 80 + 443 if ufw is active
Drop the AcelleMail vhost at /etc/nginx/sites-available/acellemail:
server {
listen 80;
server_name mail.example.com;
root /var/www/acellemail/public;
index index.php index.html;
client_max_body_size 300M;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 300;
}
location ~ /\.(?!well-known).* {
deny all;
}
access_log /var/log/nginx/acellemail.access.log;
error_log /var/log/nginx/acellemail.error.log warn;
}
sudo ln -sf /etc/nginx/sites-available/acellemail /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl reload nginx
client_max_body_size 300M matches the PHP post_max_size from Step 2 — they must be equal or larger or the patch-upgrade flow will return a 413 Request Entity Too Large from nginx before php-fpm even sees the request.
Step 6 — Drop in the AcelleMail bundle#
sudo mkdir -p /var/www/acellemail
sudo chown -R $USER:$USER /var/www/acellemail
cd /var/www/acellemail
# Place acellemail-latest.zip in /var/www/acellemail (scp from your laptop)
unzip -q acellemail-latest.zip -d .
sudo chown -R www-data:www-data /var/www/acellemail
sudo chmod -R 0755 /var/www/acellemail
sudo chmod -R 0775 /var/www/acellemail/storage /var/www/acellemail/bootstrap/cache
The 0775 on storage/ and bootstrap/cache/ lets both the web user (php-fpm) and your sudo user write logs, cached views, and the failover storage path during admin tasks.
Step 7 — TLS with certbot#
sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d mail.example.com \
--non-interactive --agree-tos --email you@example.com --redirect
The --redirect flag rewrites the nginx HTTP block to redirect to HTTPS — important because the AcelleMail installer hard-fails with "mixed content" if it loads over HTTP after admin URLs have been generated as HTTPS.
Certbot's auto-renewal cron is installed by default at /etc/cron.d/certbot. Verify it's there:
cat /etc/cron.d/certbot
# Expect: 0 */12 * * * root test -x /usr/bin/certbot && perl -e 'sleep int(rand(43200))' && certbot -q renew
Step 8 — Supervisor for the queue worker#
sudo apt-get install -y supervisor
sudo tee /etc/supervisor/conf.d/acellemail-worker.conf <<CONF
[program:acellemail-worker]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /var/www/acellemail/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/log/acellemail-worker.log
CONF
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start acellemail-worker:*
Two workers is the right starting point at the Small tier (50k - 500k sends/month). Add numprocs=4 at Medium tier; see the queue workers cookbook for tuning.
Step 9 — Cron#
sudo crontab -u www-data -e
# Add:
* * * * * cd /var/www/acellemail && php artisan schedule:run >> /dev/null 2>&1
The Laravel scheduler runs once per minute and fans out into AcelleMail's recurring jobs — bounce-handler poll, FBL fetch, retention cleanup, scheduled-campaign dispatch.
Step 10 — Run the web installer#
Browse to https://mail.example.com/install. The wizard walks through:
- Environment check — should be all green; if anything is red, the missing PHP extension is named explicitly. Re-install it with
apt-get install php8.3-<ext>.
- Database connection — fill in
acellemail / acellemail / the password you generated in Step 3.
- License — paste your CodeCanyon purchase code. Verifies against
verify.acellemail.com:5755.
- Admin user — first admin email + password.
- Done — login at
https://mail.example.com/admin.
After login, the first thing to configure is a sending server — see configuring Amazon SES or configuring Mailgun. Without a sending server, AcelleMail can collect subscribers but can't send.
Post-install verification#
Run these from the server:
# 1. PHP 8.3 active
php -v | head -1 # PHP 8.3.x
# 2. Worker is running
sudo supervisorctl status acellemail-worker:*
# 3. Cron will fire
sudo -u www-data crontab -l | grep schedule:run
# 4. Database is reachable from the app
cd /var/www/acellemail && sudo -u www-data php artisan migrate:status | head -5
# 5. Storage is writable
sudo -u www-data touch /var/www/acellemail/storage/test && rm /var/www/acellemail/storage/test
If any of these fail, do not proceed to sending — every one of them is a hard prerequisite. The post-install hardening checklist covers the security wave that should follow next.
Related reading#
FAQ#
Do I need PHP 8.3 specifically, or will 8.2 / 8.4 work?#
PHP 8.2 is the minimum. PHP 8.3 is the recommended target as of 2026 — it ships in Ubuntu 24.04's repos, has long support, and matches what the Acelle support team tests. PHP 8.4 also works (verified by support tickets) but isn't the default in Ubuntu 24.04.
Can I use MariaDB instead of MySQL?#
Yes — MariaDB 11.x is supported. Install with apt-get install mariadb-server instead of mysql-server, then run the same CREATE DATABASE / CREATE USER commands. Connection settings are identical because the MySQL client driver speaks both.
What if I don't have a domain yet?#
You can run AcelleMail on http://your-server-ip/ for testing, but you cannot send transactional or marketing email without a from-domain that has SPF/DKIM/DMARC pointed at your sending server. Buy a domain before configuring sending — see DNS setup deep dive.
How do I upgrade later?#
The Acelle upgrade flow uses a patch-x.x.x-pNN.bin file applied via the /upgrade/run-file API or via SSH. The full zip is only used for fresh installs. See the AcelleMail upgrade guide for the operations sequence.