Deploying with A Good Year For The Roses
I ran into this when a colleague recommended it for our staging environment back in early 2024. At the time I was burned out on Kubernetes-heavy workflows and something lighter sounded good. A Good Year For The Roses is a lightweight container orchestration layer built on top of Docker Compose. It handles service discovery, health checks, and rolling deployments without making you write a three-hundred-line Helm chart. The basic setup takes about ten minutes if you already have Docker installed. You install the CLI with pip or download the binary, then create a rosefile at the root of your project. That is the main config file. It looks similar to docker-compose.yml but with extra fields for health checks, deployment order, and rollback hooks. Here is what a minimal rosefile looks like:
services: web: image: nginx:latest health_check: http://localhost:80/health interval: 10s timeout: 5s ports: - 8080:80 deploy: strategy: rolling max_unavailable: 1 update_delay: 5s The tricky part nobody mentions in the readme is how the health check interacts with the deploy strategy. If your health endpoint returns a 200 too quickly during startup, the orchestrator marks the container as healthy before it is actually ready to serve traffic. You will see brief 502 errors every deployment. The workaround I settled on is adding a second readiness gate that checks for a specific file or environment variable instead of just the HTTP status code. Something like a /ready endpoint that only responds after your app finishes initialization. That usually takes an extra three to five seconds at startup but saves you from chasing intermittent production errors at 2 AM.
Common pitfalls
One thing that tripped me up early is the default network behavior. A Good Year For The Roses creates an isolated bridge network by default. That is fine until you need your containers to talk to a local database running on your machine for development. The fix is adding the host_gateway directive to your rosefile so your services can reach localhost. Without it you spend hours wondering why your app cannot connect to the DB that is clearly running. Another issue is log rotation. The tool captures stdout and stderr from every container and stores them locally. If you do not set a log_size limit in your rosefile, you will run out of disk space on a busy week. I recommend setting log_size to 500m per service. That keeps things manageable without losing useful debug info.
Get the Full Details

When it does not work
This tool is not meant for anything above medium complexity. If your architecture requires stateful sets, GPU passthrough, or multi-region failover, you are better off sticking with Kubernetes or Terraform. A Good Year For The Roses also does not support ARM-based nodes in the same way x86 does. I tried running it on a Raspberry Pi cluster and the container image resolution failed silently. You end up with healthy containers that never start because the wrong architecture image was pulled. For small teams or solo projects managing a handful of services, it is solid. The rolling deploy feature alone saves me about twenty minutes per release compared to manual docker-compose up procedures. The rollback command is equally useful. I have used it three times already when a bad config pushed to staging broke things unexpectedly.
Where to get it
The project lives on GitHub under the handle agyutr/roses-orchestrator. The latest release is v0.8.3 and it supports Python 3.9 and above. There is also a prebuilt binary for Linux, macOS, and Windows. The documentation covers basic setup well enough but the advanced section on custom lifecycle hooks needs more examples. I found myself reading the source code to figure out how to run a script before the first container starts. That is fine for people comfortable digging through code but not ideal for everyone. If you are still using plain docker-compose for local and staging deployments, giving this a try might save you some headaches. Just remember to set those health check timeouts properly and watch your log sizes. Those two things will save you more trouble than anything else in the docs.