Self-hosted deployment
Run SimplyFill in your own infrastructure on the ENTERPRISE tier.
Self-hosted deployment
Self-hosting SimplyFill is available on the ENTERPRISE tier and ships as a Helm chart for Kubernetes. The chart deploys the API, the dashboard, async workers, Postgres, Redis, and an S3-compatible object store interface — everything the SaaS version runs minus the multi-tenant routing layer.
This guide is a high-level overview. For the full runbook (network requirements, IAM policies, secrets management, upgrade procedures), ENTERPRISE customers receive a private deployment guide as part of onboarding.
When to self-host
Common reasons:
- Data residency — your compliance posture requires PHI to remain inside a specific country / region not yet served by SimplyFill's managed cloud.
- Air-gapped environments — defense, certain regulated finance, or regulated pharma environments where outbound internet access is restricted.
- Custom KMS — you want to bring your own HSM and don't want to manage a CMK boundary across your provider and ours.
- Predictable pricing at extreme volume — you generate more than ~5M PDFs/month and your infra cost beats our managed cost.
If none of those apply, the managed SaaS is almost certainly the right answer. Self-hosting adds an operations burden you carry.
Architecture
A self-hosted SimplyFill cluster includes:
| Component | Role | Default replicas |
|---|---|---|
api | FastAPI app — REST endpoints | 3 |
dashboard | Vue 3 SPA — /app UI | 2 |
worker | Celery worker — async PDF generation, batch jobs | 4 (scale to load) |
scheduler | Celery beat — quota windowing, cleanup tasks | 1 |
postgres | Primary database | Managed (RDS / CloudSQL) or in-cluster |
redis | Celery broker + cache | Managed (ElastiCache) or in-cluster |
object-store | PDF storage | S3-compatible (S3, GCS, MinIO, R2) |
The chart pins versions for every component and runs through a published integration test before each release.
Minimum sizing
For up to 100,000 PDFs/month:
| Resource | Minimum |
|---|---|
| Kubernetes | 1.27+ |
| Postgres | 14+, 4 vCPU, 16 GB RAM, 100 GB storage |
| Redis | 6+, 2 vCPU, 4 GB RAM |
| Object store | S3-compatible; no minimum |
| API replicas | 3, each 1 vCPU + 1 GB RAM |
| Worker replicas | 4, each 1 vCPU + 2 GB RAM (PDF rendering is RAM-bound) |
| Dashboard | 2, each 0.25 vCPU + 256 MB RAM |
For higher volumes, scale workers horizontally — they are stateless and queue-driven.
Install (sketch)
# Add the chart repo
helm repo add simplyfill https://charts.simplyfill.app
helm repo update
# Render a starter values.yaml
helm show values simplyfill/simplyfill > values.yaml
$EDITOR values.yaml
# Install
helm install simplyfill simplyfill/simplyfill \
--namespace simplyfill --create-namespace \
--values values.yaml
# Wait for everything healthy
kubectl -n simplyfill get pods --watchvalues.yaml requires (at minimum): a Postgres connection string, a Redis connection string, an S3-compatible bucket + IAM credentials, the SimplyFill license key (issued at onboarding), and a domain to serve the API and dashboard from.
Licensing
Self-hosted clusters phone home once per day to validate the license key against the SimplyFill license server. In air-gapped environments, the license can be activated via offline activation tokens issued monthly — ask for the air-gapped license workflow during onboarding.
License validation never transmits PHI, PDFs, mappings, or user data — it sends only the license key and a deployment fingerprint.
Upgrades
The Helm chart follows semver. Upgrades within a minor version are zero-downtime; major version upgrades may require manual migration steps documented in the release notes. SimplyFill commits to at least 12 months of security patches on every minor version.
helm repo update
helm upgrade simplyfill simplyfill/simplyfill --values values.yamlObservability
The chart ships with Prometheus metrics endpoints, structured JSON logs (compatible with Loki, Datadog, Splunk, etc.), and OpenTelemetry trace exporters. Dashboards for Grafana ship in the dashboards/ directory of the chart repo.
Backup and disaster recovery
You own backup. The chart does not include database backup automation — wire up pg_dump cron, managed snapshots, or your preferred tool against the Postgres instance. Object-store data is automatically versioned by SimplyFill (every generated PDF carries a 30-day default retention), but you should also enable bucket-level versioning at the object-store layer.
A documented restore drill is part of the onboarding checklist.
Support
ENTERPRISE customers get a dedicated Slack channel and 1-business-hour first-response SLA for self-hosted issues. See Support and your master agreement for the binding terms.