eustasy / bubbly Star on GitHub
BASH · MIT · v3.0 · beta

Better SSL in Nginx,
in ten minutes.

Drop-in configuration files and setup scripts for Certbot. An A+ on SSL Labs and an A on SecurityHeaders.io — the same day you ship.

https://

We'll template example.com through every command below.

Why

SSL is fiddly. This isn't.

Compare

vs. doing it by hand.

Certbot and acme.sh are great. They just don't ship the Nginx config you actually want. Bubbly does — plus the headers, plus the ticket rotation, plus the renewal hook.

Bubbly Certbot, raw acme.sh Caddy
Issues Let's Encrypt certs
Auto-renews on a timer systemd cron
Nginx config that scores A+ bring your own bring your own own server
Persistent ticket key
Security headers pack optional manual
Stays vanilla — no daemon replaces Nginx
Read the source in 5 min bash + conf Python Go binary

Bubbly composes with Certbot — it doesn't replace it. The scripts wrap certbot certonly --webroot and rsync battle-tested config blocks into /etc/nginx/.

Setup · ~10 min

From cold server to A+, in six steps.

You'll need basic Nginx familiarity. You won't need to know Certbot, Let's Encrypt, the ACME spec, or how SSL works underneath.

  1. Step 1

    Install Certbot. Clone Bubbly.

    Drop into $HOME, grab the dependencies, pull the repo.

    bash
    Pick a distro above to swap the package manager.
  2. Step 2

    Generate session tickets.

    One-time per server. It is slow on purpose — the entropy is the point.

    bash
    Go make a coffee. Or two.
  3. Step 3

    Copy the config blocks.

    Mirrors the repo's nginx-config/ into /etc/nginx/conf.d/, directive/, location/, groups/, and sites-available/ all land in place.

    bash
  4. Step 4

    Configure verification.

    Place the ACME challenge site so Let's Encrypt can find you.

    bash
    In nano: Ctrl + \ to search-and-replace example.com with your domain.
  5. Symlink it live, lint, reload.

    bash
  6. Step 5

    Fetch certificates.

    It will ask for the root password and an email. Then it's done in a few seconds.

    bash
    Certbot installs a systemd timer running certbot renew twice daily. The deploy hook reloads Nginx after every successful renewal. No cron, no babysitting.
  7. Step 6

    Swap in the live config.

    Add the HTTPS site alongside the HTTP one you already have. Keep example.com_http.conf symlinked — it answers ACME renewal challenges forever. Read the [OPTION]s and [WARNING]s; point the cert paths at your domain.

    bash

That's it. The next time Let's Encrypt rotates your cert, Nginx will reload itself. The next time you run nginx -t, it will pass. Go test it ↓

Results

Goes straight to the top of the class.

Tested against SSL Labs and SecurityHeaders.io with the defaults shipped in the repo — no extra tuning.

A+
Qualys SSL Labs
ssllabs.com/ssltest
  • Certificate100
  • Protocol Support100
  • Key Exchange90
  • Cipher Strength90
Qualys SSL Labs · screenshot
A
SecurityHeaders.io
securityheaders.io
  • Strict-Transport-Security
  • Content-Security-Policy
  • X-Frame-Options
  • X-Content-Type-Options
  • Referrer-Policy
  • Permissions-Policy
SecurityHeaders.io · screenshot