Limits & Non-Goals

What FrankenDeploy is not designed for, so you can decide before you start

FrankenDeploy targets one common situation: a Symfony application, a VPS, a small team or a single person, and the wish to deploy without a platform in between. Outside that situation, here is what to expect.

By design

FrankenDeployIf you need more
Servers per appOne. No load balancing, no failover, no horizontal scalingKubernetes, a PaaS, or a container orchestrator with a real load balancer
DatabaseOne container on the same VPS, one volume, no replication, no automatic failover. Backups are dumps on the same diskA managed database at your provider, and database.managed: false
Zero downtimeFor the application, through the container swap. Not for the database container itself (a PostgreSQL major upgrade stops it)Plan database upgrades as maintenance
FrameworkSymfony (detection requires symfony/framework-bundle), PHP >= 8.2 as FrankenPHP requiresOther PHP frameworks may work with a hand-written frankendeploy.yaml and Dockerfile, untested
Server OSUbuntu or Debian, apt based, x86_64 or arm64Anything else is refused by server setup on purpose
Client OSmacOS, Linux, Windows (the CLI is a single binary)
IngressHTTP and HTTPS through Caddy. No raw TCP or UDP exposure of your containers (no public database port, no custom TCP service)Publish it yourself with docker run -p outside FrankenDeploy
DomainsOne deploy.domain per app, served with HTTPS. No automatic www redirect, no wildcardAdd a .caddy file by hand in /opt/frankendeploy/caddy/apps/
Apps per serverAs many as the machine handles. Docker’s default address pools cap bridge networks at about 30default-address-pools in /etc/docker/daemon.json, see the error message
SecretsA .env.local file per app on the server, chmod 600Symfony’s secrets vault works on top of it; no Vault or cloud secret manager integration
Scheduled tasksThrough Symfony Scheduler and the Messenger workerA crontab on the host is yours to manage
Assetsnpm (npm ci), AssetMapper. Yarn and pnpm are detected but the Node stage currently runs npm ci and needs a package-lock.jsonnpm install --package-lock-only for now
SQLiteSupported as a file in a shared directory, not as a managed database
Custom DockerfileYou can edit the generated one; it is never overwritten. FrankenDeploy assumes its contract (port 8080, app user, docker-entrypoint)A validation of custom Dockerfiles is in progress
Windows Server, Docker Swarm, PodmanNot supported

Numbers

  • A deploy takes about a minute after the first one on a 2 vCPU VPS (image build with a warm cache, transfer, health check). The first one downloads the base images: several minutes.
  • A Symfony app in worker mode on a 2 vCPU VPS served 53 requests per second at p95 0.83 s in a load test (23 req/s without worker mode). Your numbers depend on your app.
  • 5 releases, 5 images and 5 database dumps are kept by default; each image is 500 MB to 1 GB. keep_releases drives all three.

Stability

FrankenDeploy is in its 0.x versions. The commands and frankendeploy.yaml are stable in practice, but a minor version can change what happens on the server (0.15 moved apps to their own networks, 0.16 changed the environment of the container). Every change of that kind is documented in Upgrading and in the changelog, and is applied transparently at the next deploy.