Data Encryption for Self-Hosted AcelleMail

Self-hosting means your subscribers' data lives on your server, not a third party's — which puts encryption in your hands. Here's what actually matters: protecting data in transit, at rest, and in your backups, in plain terms, without a sysadmin wall.

What this is for

When you self-host AcelleMail, your subscribers' personal data lives in your database on your server — not on a third-party SaaS. That's the privacy win of self-hosting, and it puts encryption decisions in your hands. This article explains, in plain terms, the three places encryption matters and what's actually worth doing — without turning into a sysadmin manual.

If you want the hands-on server commands, those live in your platform's install guide; this page is the map so you know which ones matter and why.

The three layers

1. In transit — HTTPS on everything

Every admin login, subscriber export, and API call travels between a browser and your server. Encrypting that path with HTTPS (TLS) is the single most important, lowest-effort layer — without it, anyone on the network can read credentials and subscriber data in the clear.

Your install already sets up a free Let's Encrypt certificate, and AcelleMail can be told to insist on HTTPS (FORCE_HTTPS=true in .env). That's covered as Priority 1 of the Post-Install Hardening Checklist — do it before you put real subscribers on.

2. App secrets — your .env and APP_KEY

AcelleMail keeps its secrets (database password, mail credentials) in the .env file, and a unique APP_KEY encrypts session data and other sensitive values the app stores. Two things follow from that:

  • Protect .env. It should be readable by the web user and nobody else. (Hardening Priority 1.5.)
  • Never regenerate APP_KEY on a running install — anything already encrypted with the old key becomes unreadable. It's set once at install and left alone.

You don't manage application-level field encryption yourself — the framework handles it via APP_KEY. Your job is just to keep that key and the .env file safe.

3. At rest — disk and backups

"At rest" means data sitting on disk: the database files, uploaded assets, and your backups. Two practical options, in order of how often they matter:

  • Encrypted backups (do this). Backups are the copies most likely to leave your server — to S3, Backblaze, another machine. An off-site backup that isn't encrypted is your whole subscriber list sitting in someone else's storage. Encrypt backups before they leave the box. The Automated Database Backups guide covers the backup routine; encrypting the archive is a step within it.
  • Full-disk / volume encryption (for regulated data). If you handle health, financial, or other regulated personal data — or your own policy requires it — encrypting the whole volume the database sits on protects you if the physical disk or a cloud snapshot is ever exposed. Most cloud providers (AWS, DigitalOcean) offer volume encryption as a checkbox when you create the server; turning it on at creation time is far easier than retrofitting it later.

For a typical sender, HTTPS + protected .env + encrypted off-site backups is the right baseline. Full-disk encryption is the next tier up for regulated data.

Where this isn't AcelleMail's job

Encryption at the OS and database level (TLS certificates, encrypted volumes, encrypted backup archives) is configured on the server, not inside AcelleMail's admin panel — there's no "encryption" screen in the app, and you should be wary of any guide that invents one. The app's part is the HTTPS enforcement and the APP_KEY; everything else is your hosting setup, which your install guide walks through.

Common questions

Does AcelleMail encrypt subscriber emails in the database? Email addresses are stored so the app can send to them and de-duplicate — they aren't field-encrypted at rest by default (that would break search and sending). Protect them with disk/volume encryption and access control, not field-level encryption.

Is HTTPS enough on its own? It's the most important layer and the one to never skip, but it only protects data in transit. Pair it with protected secrets and encrypted backups for the full picture.

Do I need this for GDPR? Encryption is one of the "appropriate technical measures" regulators expect, but compliance is broader than encryption — see the GDPR Compliance Guide.

Related articles

15 comments

6 comments

  1. anna.k.pm
    for hipaa — is acellemail considered a business associate? looking at whether we need a baa.
    1. admin
      Good question. The campaign:rerun audit writes to laravel.log only when the audit decides to force-resume — pure noop runs are silent. We'll add an info-level heartbeat in a future Acelle release to make it easier to monitor...
    2. admin (edited)
      Right — for RDS specifically, you can change wait_timeout via the parameter group without a reboot if it's set as 'dynamic'. Most defaults are.
  2. sofia.costa.pt
    Passed a SOC 2 audit last quarter using this as part of our documntation set. Auditors specifically noted the data-flow diagram was helpful.
    1. admin
      thanks for sharing. the pattern you describe is exactly the use case we built that feature for — glad it landed for you.
  3. i.rossi.mil
    the GDPR data-export article is what I sent to our DPO. Saved us meeting.
    1. admin
      Appreciate it. If anything in this needs updating, ping us — we revisit articles every few months. fwiw
  4. y.yamamoto
    Add audit logging for every admin action. We added a small middleware that logs to S3 — invaluable when answering compliance questions retroactively.
  5. emma.whitaker
    The GDPR data-export article is what I sent to our DPO. Saved us a meeting.
    1. admin (edited)
      thanks. pass it along if it helps your team.
  6. femi.adeyemi
    Passed a SOC 2 audit last quarter using this as part of our documentation set. Auditors specifically noted the data-flow diagram was helpful.
    1. admin
      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.
    2. admin (edited)
      Thanks for the numbers. Worth pulling into a follow-up post on volume-tier sizing.
    3. admin (edited)
      Great real-world detail. Your point about stale running_pid > 30 min as an alert is something we should add to the diagnostic flow
    4. admin (edited)
      Confirming your experience matches what we see in support cases. Well cite the cause-#5 'wait it out' guidance more prominently in the next revision.

More in Security & Compliance