Installing AcelleMail on DigitalOcean

Short DigitalOcean quickstart for AcelleMail — droplet sizing, image pick, the PTR gotcha, and outbound port 25 caveat. For the full DO-specific install (Cloud Firewall, Reserved IP, monitoring), and for the OS-level steps, follow the canonical guides linked below.

What this is for

A 4-minute version of "spin up an AcelleMail droplet on DigitalOcean" — the minimum decisions you need to make, plus the three gotchas that bite every new sender.

👉 For the full DigitalOcean-specific guide (Cloud Firewall rules, Reserved IP, Monitoring alerts, common-issues table): Install AcelleMail on a DigitalOcean Droplet.

👉 For the OS-level install (PHP, MySQL, nginx, certbot, supervisor, web wizard): Install AcelleMail on Ubuntu 24.04 LTS.

The 4 decisions

Decision Recommended
Droplet shape Premium AMD, 2 vCPU / 4 GB / 80 GB SSD (~$28/mo). Skip Basic — 1 vCPU + 512 MB doesn't fit PHP-FPM + MySQL + Redis.
Image Ubuntu 24.04 (LTS) x64. Maintained until April 2029.
Region Closest to your subscribers (latency is minor for email, but matters for the admin UI). Pick the right country if you have GDPR data-residency needs.
Droplet Name The exact mail FQDN, e.g. mail.example.com — this is what DigitalOcean uses to set your PTR record. See Gotcha #1.

CLI version, if you prefer:

doctl compute droplet create mail.example.com \
  --image ubuntu-24-04-x64 \
  --size s-2vcpu-4gb-amd \
  --region sgp1 \
  --ssh-keys "$(doctl compute ssh-key list --format ID --no-header | tr '\n' ',' | sed 's/,$//')" \
  --enable-monitoring \
  --wait

The 3 gotchas

Gotcha 1 — Droplet name = PTR record

DigitalOcean auto-generates the PTR (reverse-DNS) record for your droplet's primary IPv4 from the droplet's name field (not the in-OS hostname). If you name the droplet acellemail-prod-1, your PTR is acellemail-prod-1 — and Gmail / Outlook will treat your sends as suspect because PTR ≠ HELO hostname.

Fix: name the droplet mail.example.com (the FQDN you'll HELO with). Verify after creation:

dig +short -x <droplet-ip>
# Expect: mail.example.com.

If you got it wrong, Console → Droplet → ... → Rename → wait 5 min → re-check.

Gotcha 2 — Outbound port 25 is blocked by default

DigitalOcean blocks outbound port 25 on every new account. If you try to send mail directly via your droplet (e.g. AcelleMail → Gmail's MX directly), it'll silently time out.

Two options:

  1. Route through a relay (recommended) — Amazon SES, SendGrid, Mailgun, etc. They use ports 587/465 which DO doesn't block. Better deliverability story anyway.
  2. Ask DO support to unblock port 25 — open a ticket. Approval usually within 24h for accounts in good standing.

Gotcha 3 — localhost vs 127.0.0.1 for MySQL

In your AcelleMail .env, use DB_HOST=127.0.0.1, not DB_HOST=localhost. The localhost literal makes PHP's MySQL driver prefer Unix sockets, which can mismatch with how MySQL is bound — you'll see intermittent "Connection refused" from queue workers. Using the IP forces TCP, which is what's actually configured.

After droplet creation

  1. SSH in, create a non-root sudo user, disable root + password SSH.
  2. Create a DigitalOcean Cloud Firewall — inbound 22 (your IP only), 80, 443, 587, 465. Outbound: all. (Full firewall reference in the canonical DO guide.)
  3. Follow the canonical Ubuntu install from Step 1: Install AcelleMail on Ubuntu 24.04 LTS.

Total time, droplet creation to working admin login: ~30 minutes if you've done it before, ~60 if it's your first time.

Related articles

14 comments

7 comments

  1. emma.whitaker
    For anyone using systemd-resolved (Ubuntu 22+): set DNSStubListener=no in /etc/systemd/resolved.conf before installing. Otherwise port 53 conflicts when you eventually run a bounce handler.
  2. m.schmidt78
    Clean walkthrough. The supervisor config copy-paste worked first try.
  3. d.cohen.tlv
    Is the install wizard skipable for automated deploys? Asking because we Terraform our infra and clicking through a wizard is awkward.
    1. admin
      we tested this with up to 1m subscribers on a $40/mo vps. past that you start needing query optimization. below that, the defaults are fine.
  4. v.petrova.ru
    Installed on a $12/mo DigitalOcean droplet for our 30k-subscriber list. Performance has been fine. Memory peaks around 1.6 GB during batch sends; comfortable on 2GB
  5. lequan.saigon
    We use Hetzner instead of DO — same Ubuntu image, identical install. Probably $4/mo cheaper. The PTR record on Hetzner requires opening a support ticket but they respond same-day.
    1. admin (edited)
      Thanks for the breakdown. Saving for our customer-success team's reference library.
    2. admin (edited)
      useful context. the fact that it took 3 weeks end-to-end is realistic; we sometimes get pushed to say 1-week timelines and they're not honest.
  6. tnovak.cz
    any reason to use mariadb over mysql 8? we default to mariadb everywhere but i see most acelle install guides use mysql
    1. admin
      honest answer: it depends on your provider. ses handles it gracefully; mailgun is stricter. we'll add a provider-by-provider table in the next revision.
    2. admin (edited)
      Were aware of the silent-bail-out on deleted customers — there's an open issue for it. Workaround for now: monitor the campaign:rerun log for absence of expected log lines, alert when silent for > 20 min
    3. admin (edited)
      We don't recommend that approach in production. It works in dev but has subtle race conditions under concurrent load. Stick with the documented pattern.
  7. linhvu.dev
    Followed this on Ubuntu 24.04 last week. Zero issues. The php-imap and php-sqlite3 notes saved me a wizard-error round-trip.
    1. admin
      Appreciate it. If anything in this needs updating, ping us — we revisit articles every few months. 👀

More in Installation & Setup