# Migrating from Certbot to certctl You have 50 Let's Encrypt certificates across 10 servers, managed by a mix of Certbot cron jobs and manual renewals. Certbot handles issuance, but you lack inventory visibility, centralized alerting, and audit trails. This guide walks you through moving to certctl while keeping your existing certificates and ACME account. ## Why Migrate Certbot renews certs in isolation. If a renewal fails on one server, you don't know until the cert expires. certctl gives you a single pane of glass: see all certs across all servers, get alerts 30/14/7 days before expiry, track who renewed what when, and verify each deployment succeeded via TLS fingerprint validation. ## What You Keep - Your existing Certbot ACME account key and Let's Encrypt account - All issued certificates in `/etc/letsencrypt/live/` - Certbot's renewal history and hooks You will not re-issue any certificates. certctl discovers them and takes over renewal scheduling. ## Step-by-Step Migration ### 1. Deploy certctl Control Plane Option A: Docker Compose (quickest for evaluation) ```bash cd /opt/certctl docker compose up -d # Dashboard & API: https://localhost:8443 (self-signed cert — use --cacert ./deploy/test/certs/ca.crt for the default compose stack) # Default API key in logs (grep CERTCTL_API_KEY docker logs certctl-server) ``` Option B: Kubernetes (Helm) ```bash helm install certctl deploy/helm/certctl/ \ --set auth.apiKey=YOUR_SECURE_KEY ``` ### 2. Deploy Agents to Each Server On each of your 10 servers running Certbot: ```bash # Linux amd64 (adjust for your architecture) curl -sSL https://github.com/shankar0123/certctl/releases/download/v2.1.0/certctl-agent-linux-amd64 \ -o /usr/local/bin/certctl-agent chmod +x /usr/local/bin/certctl-agent # Create config sudo mkdir -p /etc/certctl /var/lib/certctl/keys sudo tee /etc/certctl/agent.env > /dev/null <