<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>SimpleDeploy | Blog</title><description>Single binary that deploys Docker Compose apps with HTTPS, backups, alerts, metrics.</description><link>https://vazra.github.io/</link><language>en</language><item><title>SimpleDeploy 1.3.0</title><link>https://vazra.github.io/simpledeploy/blog/2026-04-30-v1-3-0/</link><guid isPermaLink="true">https://vazra.github.io/simpledeploy/blog/2026-04-30-v1-3-0/</guid><description>Big release. Backups v2, multi-endpoint routing, local TLS, realtime UI, and a sweeping security pass.

</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;1.3.0 is the first release since 1.2.0 and it’s a large one. Hundreds of commits, much of it focused on making SimpleDeploy safer to put on a public IP, plus three feature areas worth calling out.&lt;/p&gt;
&lt;p&gt;Full notes: &lt;a href=&quot;https://github.com/vazra/simpledeploy/blob/main/CHANGELOG.md&quot;&gt;CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;backups-v2&quot;&gt;Backups v2&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The backup subsystem was rewritten end to end.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Six built-in strategies (sqlite, postgres, mysql, files, docker volumes, custom command), each behind the same interface.&lt;/li&gt;
&lt;li&gt;New scheduler with hot-reload, retention rules, pre/post lifecycle hooks, and a pipeline processor.&lt;/li&gt;
&lt;li&gt;Target detection so the dashboard can suggest the right strategy for each app.&lt;/li&gt;
&lt;li&gt;Per-backup checksum verification.&lt;/li&gt;
&lt;li&gt;A &lt;code dir=&quot;auto&quot;&gt;BackupWizard&lt;/code&gt; in the UI walks non-technical users through configuration in four steps.&lt;/li&gt;
&lt;li&gt;Per-app &lt;code dir=&quot;auto&quot;&gt;Backups&lt;/code&gt; tab and a &lt;code dir=&quot;auto&quot;&gt;BackupHealthCard&lt;/code&gt; on the dashboard.&lt;/li&gt;
&lt;li&gt;Backup events flow through the alert system, so a failed nightly snapshot can page you the same way a downed app does.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Existing backups are migrated automatically.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;multi-endpoint-routing-and-local-tls&quot;&gt;Multi-endpoint routing and local TLS&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The reverse proxy gained two long-requested capabilities.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi-endpoint apps.&lt;/strong&gt; A single app can publish more than one domain, each routed to a different service. No more splitting an app across compose stacks just to expose two hostnames.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local TLS mode.&lt;/strong&gt; Caddy’s internal issuer can now sign certs for local development or air-gapped installs. The dashboard exposes a trust page with a one-click CA download so a fresh laptop trusts the install in under a minute.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shared &lt;code dir=&quot;auto&quot;&gt;simpledeploy-public&lt;/code&gt; network&lt;/strong&gt; with container-IP upstreams, removing the host-port hop for proxied traffic.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;realtime-ui&quot;&gt;Realtime UI&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The dashboard is now event-driven.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A notify-only WebSocket bus (&lt;code dir=&quot;auto&quot;&gt;GET /api/events&lt;/code&gt;) streams state changes; REST stays the source of truth.&lt;/li&gt;
&lt;li&gt;Live terminal output for deploys, restores, and other long-running actions through a new &lt;code dir=&quot;auto&quot;&gt;ActionModal&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Inline scale controls, activity feed, alert history with active-only toggle, deploy-version delete, and a degraded-app status badge.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;security-hardening&quot;&gt;Security hardening&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A coordinated pass closed a long list of issues found during a security review. Highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JWT signing key derived per install via HKDF from &lt;code dir=&quot;auto&quot;&gt;master_secret&lt;/code&gt;, plus server-side invalidation via token version.&lt;/li&gt;
&lt;li&gt;Login lockout rekeyed to &lt;code dir=&quot;auto&quot;&gt;(user, ip)&lt;/code&gt; and CIDR-aware trusted-proxy handling.&lt;/li&gt;
&lt;li&gt;Management dashboard binds to &lt;code dir=&quot;auto&quot;&gt;127.0.0.1&lt;/code&gt; by default; published app ports pin to &lt;code dir=&quot;auto&quot;&gt;127.0.0.1&lt;/code&gt; unless explicitly public.&lt;/li&gt;
&lt;li&gt;WebSocket Origin checks, periodic re-auth on long-lived streams, capped frame sizes on log/deploy streams.&lt;/li&gt;
&lt;li&gt;Per-handler request body limits, panic-recovery middleware, slowloris defenses (&lt;code dir=&quot;auto&quot;&gt;ReadHeaderTimeout&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;IdleTimeout&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;CSP on the SPA, default security headers injected by Caddy.&lt;/li&gt;
&lt;li&gt;Backup restore validates the tar stream and caps gzip decompression to block compression bombs.&lt;/li&gt;
&lt;li&gt;Compose validation expanded to cover container-escape vectors, applied in both deploy and reconciler scan paths.&lt;/li&gt;
&lt;li&gt;Webhook SSRF DNS-rebinding window closed; reserved-IP filter expanded.&lt;/li&gt;
&lt;li&gt;Audit rows recorded for rollback, profile self-update, and gitsync config changes; preserved across app purge.&lt;/li&gt;
&lt;li&gt;Tighter file modes for secrets and app config; hardened &lt;code dir=&quot;auto&quot;&gt;simpledeploy.service&lt;/code&gt; systemd unit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A full security architecture and threat model now live in &lt;a href=&quot;https://github.com/vazra/simpledeploy/blob/main/SECURITY.md&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;SECURITY.md&lt;/code&gt;&lt;/a&gt; and the contributor docs.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Homebrew:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;brew&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt; &amp;#x26;&amp;#x26; &lt;/span&gt;&lt;span&gt;brew&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upgrade&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;simpledeploy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;APT:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt; &amp;#x26;&amp;#x26; &lt;/span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--only-upgrade&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;simpledeploy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Binary tarball: &lt;a href=&quot;https://github.com/vazra/simpledeploy/releases/tag/v1.3.0&quot;&gt;GitHub Releases&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;No manual migration steps. Backup v2 migrates on first start; existing schedules keep running.&lt;/p&gt;</content:encoded><category>release</category></item><item><title>Introducing SimpleDeploy</title><link>https://vazra.github.io/simpledeploy/blog/2026-04-08-introducing-simpledeploy/</link><guid isPermaLink="true">https://vazra.github.io/simpledeploy/blog/2026-04-08-introducing-simpledeploy/</guid><description>A single binary that turns any VPS into a production-grade Docker Compose host. HTTPS, backups, alerts, metrics. No Kubernetes.

</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We have been quietly building SimpleDeploy: a single Go binary that runs Docker Compose apps on a VPS the way you actually want them to run in production.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-problem&quot;&gt;The problem&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;You write a &lt;code dir=&quot;auto&quot;&gt;docker-compose.yml&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;scp&lt;/code&gt; it to a VPS, run &lt;code dir=&quot;auto&quot;&gt;docker compose up -d&lt;/code&gt;, then start gluing on the missing pieces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nginx or Caddy for TLS.&lt;/li&gt;
&lt;li&gt;certbot or some script for renewals.&lt;/li&gt;
&lt;li&gt;A cron for &lt;code dir=&quot;auto&quot;&gt;pg_dump&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;aws s3 cp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A second cron for log rotation.&lt;/li&gt;
&lt;li&gt;Some monitoring (Prometheus? Netdata?) and an alert webhook.&lt;/li&gt;
&lt;li&gt;A dashboard for the team.&lt;/li&gt;
&lt;li&gt;A way to do this from your laptop.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It works, but every step is its own decision. Now repeat for every project.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-simpledeploy-gives-you&quot;&gt;What SimpleDeploy gives you&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;One binary that ships all of the above as defaults you can override:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Docker Compose deploys&lt;/strong&gt; with safety: every change is versioned, every deploy is auditable, every app can roll back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatic HTTPS&lt;/strong&gt; via embedded Caddy. Let’s Encrypt out of the box. Custom certs supported.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Built-in backups&lt;/strong&gt; for Postgres, MySQL, MongoDB, Redis, SQLite, and raw volumes. Local or S3 targets. Retention and scheduling per app.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alerts&lt;/strong&gt; with rules like “CPU above 80% for 5 minutes” and webhook delivery to Slack, Discord, PagerDuty.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metrics and request stats&lt;/strong&gt; with tiered rollups so the database stays small forever.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-user RBAC&lt;/strong&gt; with per-app access. API keys for CI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remote CLI&lt;/strong&gt; with kubectl-style contexts. Deploy from your laptop or a GitHub Actions job.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A dashboard&lt;/strong&gt; for everything above.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of it ships in one process. About 60 MB resident for a small fleet. SQLite for state. No external dependencies beyond Docker.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;who-it-is-for&quot;&gt;Who it is for&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Solo developers who want production-quality deployments without spending Saturdays on YAML.&lt;/li&gt;
&lt;li&gt;Small teams running a handful of services on one or two VPSes.&lt;/li&gt;
&lt;li&gt;Agencies hosting client apps cheaply.&lt;/li&gt;
&lt;li&gt;Anyone who looked at Kubernetes for a side project and thought “no thanks”.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you need multi-host orchestration, GPU scheduling, or an autoscaler, you want something else. SimpleDeploy is for the long tail of “this app needs to run reliably on a $20 VPS”.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;whats-in-the-10-box&quot;&gt;What’s in the 1.0 box&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CLI + API server.&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;simpledeploy serve&lt;/code&gt; runs the daemon; the CLI talks to it locally or remotely with context switching (&lt;code dir=&quot;auto&quot;&gt;simpledeploy context&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reconciler.&lt;/strong&gt; Drop a &lt;code dir=&quot;auto&quot;&gt;compose.yml&lt;/code&gt; in the apps directory and SimpleDeploy applies it. A directory watcher with debounce handles edits.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Embedded Caddy.&lt;/strong&gt; Programmatic config (no Caddyfile), with custom modules for per-domain rate limiting and request metrics.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQLite + WAL store.&lt;/strong&gt; Apps, deploys, users, API keys, app access, metrics, request stats, alerts, webhooks, backups, all in one local file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auth.&lt;/strong&gt; Passwords (bcrypt), JWT sessions, API keys with scopes, per-app access middleware, login rate limiting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metrics.&lt;/strong&gt; System and container stats collector, buffered batch writer, tiered rollup and pruning, query API.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Request stats.&lt;/strong&gt; Caddy module records every request; tiered rollup powers the dashboard charts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backups.&lt;/strong&gt; Strategies and targets with a scheduler, configs and run history in the store, CLI commands.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alerts.&lt;/strong&gt; Rule evaluator, webhook dispatch with built-in templates, history.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Svelte dashboard.&lt;/strong&gt; Embedded in the Go binary. Login, app list, app detail with charts and live logs, deploy/remove flows, backups page, alerts page, user management.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log streaming.&lt;/strong&gt; Process stdout/stderr through a ring buffer, exposed live over WebSocket and the CLI.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1.0.0 also shipped two same-day patch releases (1.1.0, 1.2.0) tightening the goreleaser pipeline so Linux ARM64 and macOS binaries publish cleanly. 1.2.0 is the recommended 1.x baseline until &lt;a href=&quot;https://vazra.github.io/simpledeploy/blog/2026-04-30-v1-3-0/&quot;&gt;1.3.0&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;try-it&quot;&gt;Try it&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Five minutes from zero to a HTTPS-served app:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;brew&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vazra/tap/simpledeploy&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# or apt, or curl&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;simpledeploy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/simpledeploy/config.yaml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--now&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;simpledeploy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;simpledeploy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;users&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--username&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;admin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--role&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;super_admin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# drop a docker-compose.yml with simpledeploy.endpoints.0.domain label&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;simpledeploy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apply&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docker-compose.yml&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;myapp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The full walk-through is in the &lt;a href=&quot;https://vazra.github.io/simpledeploy/start/quickstart/&quot;&gt;quickstart&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;whats-next&quot;&gt;What’s next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;A growing library of &lt;a href=&quot;https://vazra.github.io/simpledeploy/guides/backups/overview/&quot;&gt;backup strategies&lt;/a&gt; and &lt;a href=&quot;https://vazra.github.io/simpledeploy/guides/backups/s3-target/&quot;&gt;target backends&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Multi-host federation for unified visibility across instances.&lt;/li&gt;
&lt;li&gt;SSO via OIDC.&lt;/li&gt;
&lt;li&gt;A community marketplace of compose templates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The full direction is on the &lt;a href=&quot;https://vazra.github.io/simpledeploy/community/roadmap/&quot;&gt;roadmap&lt;/a&gt;. The repo is at &lt;a href=&quot;https://github.com/vazra/simpledeploy&quot;&gt;github.com/vazra/simpledeploy&lt;/a&gt;. Issues and discussions are open.&lt;/p&gt;
&lt;p&gt;If you build something on SimpleDeploy, tell us. We will list it on the &lt;a href=&quot;https://vazra.github.io/simpledeploy/community/showcase/&quot;&gt;showcase&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>announcement</category><category>release</category></item></channel></rss>