Deployment guide

Certimate on a VPS: automate SSL certificates with ACME

Deploy on a VPS Cloud →

Tutorial

Certimate on a VPS: automate SSL certificates with ACME

Self-hosting6 min read3 steps

An expired certificate means a site that shows a red warning to every visitor, an API no client calls any more, and a Monday morning lost working out why certbot did not run on that particular server. Certimate, an open-source certificate manager under the MIT licence, centralises the whole cycle: it obtains certificates through ACME, deploys them to your servers, renews them before they expire and warns you when something fails. This guide installs it with Docker Compose on a VPS, replaces its factory password, publishes it over HTTPS behind nginx, then builds a first DNS-01 workflow and an SSH deployment.

Contents· Why centralise your certificates1/12
  1. 01Why centralise your certificates
  2. 02What Certimate brings
  3. 03Certimate, certbot and Nginx Proxy Manager
  4. 04Prerequisites
  5. 05Install Certimate with Docker Compose
  6. 06Never leave the factory password active
  7. 07Publish the console over HTTPS behind nginx
  8. 08First workflow: a wildcard certificate through DNS-01
  9. 09Deploy over SSH to your nginx servers
  10. 10Scheduled renewal and alerts
  11. 11Security and backup
  12. 12One-click Certimate on ServOrbit

Why centralise your certificates

certbot does one thing very well: renewing the certificate of the server it runs on. As soon as you manage several servers, a shared wildcard certificate or client sites, each machine becomes a deadline to watch separately, and a silent failure is only discovered when the browser shows its warning.

On top of that, the lifetime of public certificates is getting shorter year after year, which multiplies renewals. Centralising issuance, deployment and monitoring in one place, with a history and alerts, is the safest way to never let a certificate expire again.

What Certimate brings

  • Visual workflows — request, deployment and notification chained in one workflow, scheduled for renewal.
  • DNS-01 and HTTP-01 — wildcard and multi-domain certificates through DNS-01 at more than 70 providers, including Cloudflare, OVHcloud and Hetzner.
  • Several authorities — Let's Encrypt, ZeroSSL, Google Trust Services, SSL.com; RSA or ECC keys.
  • More than 160 deployment targets — SSH, cPanel, Nginx Proxy Manager, Proxmox VE, Kubernetes, CDNs and cloud services.
  • PEM, PFX and JKS formats — for nginx, Apache, IIS or a Java application.
  • Alerts — email, Telegram, Slack, Discord, Matrix or webhook on every failure and before expiry.

Certimate, certbot and Nginx Proxy Manager

Scroll the table

CertimatecertbotNginx Proxy Manager
Web interfaceYes, visual workflowsNo, command lineYes
Several serversYes, SSH and API deploymentNo, one per serverNo, its own hosts
Wildcard through DNS-01Yes, more than 70 providersYes, through pluginsYes
Failure alertsYes, multi-channelNo, to be scriptedNo
Reverse proxyNoNoYes, that is its job
Run historyYesLocal logPartial

Prerequisites

An Ubuntu 24.04 VPS with 512 MB of RAM and Docker installed is enough: Certimate uses about twenty megabytes. Plan a subdomain for the console (for example certs.example.com) pointing to the VPS, and nginx as a reverse proxy. For the workflows, keep at hand an API token from your DNS provider and SSH access to the servers that will receive certificates.

Install Certimate with Docker Compose

  1. Prepare the directory and the password

    Create the application directory and a .env file holding a randomly drawn administrator password.

    mkdir -p /opt/certimate && cd /opt/certimate
    printf 'ADMIN_PASSWORD=%s\n' "$(openssl rand -hex 16)" > .env
    chmod 600 .env
  2. Write the compose file

    Create compose.yaml. On the first start only, the command applies ADMIN_PASSWORD to the factory account before starting the server; the marker prevents it from later overwriting a password changed in the interface. The port is published on the loopback only: only nginx reaches it.

    services:
      certimate:
        image: certimate/certimate:v0.4.36
        restart: unless-stopped
        ports:
          - "127.0.0.1:8109:8090"
        environment:
          ADMIN_PASSWORD: ${ADMIN_PASSWORD:?ADMIN_PASSWORD requis}
        entrypoint: ["sh", "-c"]
        command:
          - >-
            if [ ! -f /app/pb_data/.admin-seeded ]; then
            ./certimate superuser upsert [email protected] "$$ADMIN_PASSWORD" && touch /app/pb_data/.admin-seeded || exit 1;
            fi;
            exec ./certimate serve --http 0.0.0.0:8090
        volumes:
          - certimate-data:/app/pb_data
    volumes:
      certimate-data: {}
  3. Start and check

    Start the stack. Certimate applies its migrations at startup, then the health probe must answer.

    docker compose up -d
    docker compose ps
    curl -fsS http://127.0.0.1:8109/api/health

Never leave the factory password active

The image ships an [email protected] account with the password 1234567890, documented in the project README. A console exposed with these credentials hands anyone your DNS tokens and SSH keys. The command above replaces it before the server even listens; if you run the image another way, change it before publishing the domain.

Publish the console over HTTPS behind nginx

Add a server block that proxies to the loopback. To bootstrap, use a certificate obtained once with certbot; Certimate can then renew its own like the others.

server {
    listen 443 ssl;
    server_name certs.example.com;
    # ssl_certificate / ssl_certificate_key: your current certificate
    location / {
        proxy_pass http://127.0.0.1:8109;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}

Open https://certs.example.com, log in with [email protected] and the password from the .env file, then change the email and password in the account settings.

First workflow: a wildcard certificate through DNS-01

Under Access, create a Cloudflare access (or OVHcloud, Hetzner…) with an API token limited to DNS edit permission on the zone concerned. Under Workflows, create a workflow: a request node with example.com and *.example.com, DNS-01 challenge, Let's Encrypt authority and ECC key.

Run the workflow by hand: Certimate creates the TXT record, waits for it to propagate, obtains the certificate and stores it under Certificates with its expiry date. The DNS-01 challenge needs no open port on target servers, and it is the only one that allows a wildcard.

Deploy over SSH to your nginx servers

On each target server, create a dedicated account that can only write to the certificate directory and reload nginx:

useradd -m -s /bin/bash certdeploy
install -d -o certdeploy -m 750 /etc/ssl/certimate
echo 'certdeploy ALL=(root) NOPASSWD: /usr/sbin/nginx -t, /usr/bin/systemctl reload nginx' > /etc/sudoers.d/certdeploy

In Certimate, add key-based SSH access to this account, then an SSH deployment node after the request: paths /etc/ssl/certimate/example.com.pem and .key, command sudo nginx -t && sudo systemctl reload nginx. Point the ssl_certificate and ssl_certificate_key of your vhosts to these files.

Scheduled renewal and alerts

Enable the workflow's scheduled trigger (one run a day is enough: Certimate only renews when expiry gets close) and add a notification node to Telegram, Slack or email. Every run keeps its log: when something fails, you know whether the DNS challenge, the authority or the deployment broke, and you know it before expiry.

Security and backup

Certimate's database holds your DNS tokens, SSH keys and private keys: treat the console like a vault. Strong password, HTTPS only, tokens and SSH accounts with the strict minimum of rights. Back up the volume regularly, and encrypt the archive before copying it off the VPS:

cd /opt/certimate
docker compose stop
docker run --rm -v certimate_certimate-data:/data -v "$PWD":/backup alpine \
  tar czf /backup/certimate-$(date +%F).tar.gz -C /data .
docker compose start

One-click Certimate on ServOrbit

From the Marketplace in your client area, Certimate installs on an Ubuntu 24.04 VPS in one click: official container, administrator password generated and applied before the first start, data volume and nginx reverse proxy over HTTPS on your domain or on the VPS's free subdomain. The password is shown in your client area, on the application's page.

Your certificates, renewed without a thought

A ServOrbit Ubuntu 24.04 VPS with 512 MB of RAM is enough for Certimate. One-click install from the Marketplace, administrator password generated for you, HTTPS on your domain or on the VPS's free subdomain.

Need help?

Browse our help center and FAQ, or reach our team — callback, WhatsApp or email. Support in French, English and Arabic.

Message us on WhatsAppopens in a new tab