Self-host anything in one click.
Push a repository or pick one of 510 templates. LogiStack builds it, gives it a domain with HTTPS, backs it up and shows you what every server is doing.
curl -fsSL get.logistack.dev | sudo bashUbuntu 22.04+ or Debian 12+, 2 GB of RAM. Free and open source, Apache 2.0.
14 of 14 services match their desired state
Checked 2 seconds ago on 3 servers
510 apps, one click each.
Pick an app from the catalog. LogiStack creates its services, volumes, domain and secrets, then asks only for what it can't generate, such as an admin email.
- Databases in one click: Postgres, MySQL, MariaDB, MongoDB, Redis, libSQL
- Passwords generated and stored encrypted, never shown in a log
- Each template is a plain manifest you can open and edit
- PostgreSQLRelational database
- libSQLSQLite over HTTP
- MongoDBDocument store
- RedisCache and queues
Your data, in the same dashboard.
No other self-hosted PaaS ships a table editor and an S3 browser. Edit a row in Postgres, run a query, upload a file to a bucket or hand out an access key, without installing pgAdmin or opening another login.

Buckets
media / productsUpload- 2025
- chair-oak.webp184 KB2 min ago
- chair-walnut.webpShare link201 KB2 min ago
- catalog-2026.pdf4.2 MByesterday
- lamp-brass.webp96 KB3 days ago
- showroom.mp448.1 MBlast week
Database editor
- Edit cells, add rows and filter, with types shown on every column
- Run SQL, read the schema as a diagram, dump and restore
- Postgres, MySQL, MariaDB, MongoDB, Redis and libSQL
- Roles with per-table permissions, created in a wizard
Storage browser
- Buckets and folders, upload and bulk delete
- Share links for single objects, without making the bucket public
- Access keys you create and revoke per bucket
- Connection details for any S3 client, copied in one click
Every server on one screen.
An agent runs on each node and dials the server over one outbound WebSocket. Logs, CPU, memory, disk and container health arrive from every machine, with no ports to open on the workers.
Control planeon node-1
apiREST, MCP, WebSocketworkerreconciler, builds, cronpostgresdesired stateredisqueuescaddyingress :443
wss :443 outboundagent dials in, nothing listens
node-1
10.0.0.2 · managerCPU42%Memory61%11 containers · agent connected
node-2
10.0.0.7 · workerCPU68%Memory74%9 containers · agent connected
node-3
10.0.0.9 · workerCPU91%Memory52%6 containers · agent connected
14:32:07node-1GET /v1/orders 200 18ms14:32:07node-2GET /v1/orders 200 21ms14:32:08node-3POST /v1/pay 502 3012ms14:32:08node-3upstream timeout, retry 114:32:09node-3POST /v1/pay 200 140ms14:32:10node-1GET /healthz 200 2ms14:32:11node-2GET /v1/me 200 9ms
Change it by hand. It changes back.
Postgres holds what should be running. A reconciler compares it with what Docker and Caddy report and fixes the difference. A container scaled from a shell at 3 a.m. goes back to the size you set.
$ docker service scale api=503:12, run by hand on node-2
Desired state
postgresapi replicas 2api memory 512Mapi.acme.dev → apiReconciler
diff desired, actualapply the smallest fixwrite it to the audit logDocker Engine API
unix socket, no shellservice api replicas 5 → 2Caddy admin API
PATCH /config/apps/httproute unchanged, no reload| Situation | Most self-hosted PaaS tools | LogiStack |
|---|---|---|
| Someone edits a container by hand | Most tools: It stays edited until the next deploy | LogiStack: Reverted to the desired state |
| You add a domain | Most tools: The proxy reloads or the app redeploys | LogiStack: One admin API call, nothing restarts |
| A backup or cron job runs | Most tools: On the control node, over SSH | LogiStack: On the node that holds the data |
| You need SSO, roles and an audit log | Most tools: Often a paid plan | LogiStack: In the open-source build, free |
git push, then nothing else.
A push to main builds an image tagged with the deployment ID and starts the new tasks next to the old ones. Traffic moves when /healthz answers. If it never does, the old version keeps serving and you get a notification.
4f2c91a · main- Build0:00buildkit, linux/amd64 and arm64registry/acme/api:4f2c91a
- Push0:213 new layers, 41 MB82% of layers from cache
- Start0:262 new tasks next to the old 2waiting for /healthz
- Switch0:37Caddy points api.acme.dev at the new tasksold tasks drain for 10 s
- Settle0:38desired state matches actual statenothing left to fix
logistack.yamlApply with logistack applyproject: acmeservices: api: source: github.com/acme/api # builds on every push replicas: 2 domains: [api.acme.dev] env: DATABASE_URL: ${{ db.url }} db: template: postgres backups: { cron: "0 3 * * *", keep: 14, to: r2 }The whole project in one file.
Export any project to YAML, keep it in Git and apply it to another server. The API, the CLI and the built-in MCP server read the same schema, so an AI agent can deploy for you and still has to show the diff first.
Included in every install.
Domains and HTTPS
Bring a wildcard domain and a DNS token. LogiStack creates the records and requests one certificate over DNS-01, so new services get HTTPS without waiting.
Cloudflare, Route 53, Hetzner
Backups
Encrypted with your key, sent to any S3-compatible bucket, restored into a fresh service in one step.
R2, B2, MinIO, AWS
Preview environments
Every pull request gets its own copy of the project and a URL, removed when the branch merges.
Commit status on GitHub
Schedules
Cron jobs that run inside the service's container, on the node where it lives, with logs for every run.
Timezone aware
Access
Organisations, custom roles, SSO over OIDC or SAML, passkeys and an audit log you can export.
Every write audited
Move over one service at a time.
Already running another self-hosted PaaS? The importer reads its projects, env vars and domains. It freezes the old setup, then moves services across when you say so. The old platform keeps serving until you switch it off.
- ImportProjects, env vars and domains, checked before anything changes
- Cut overOne service at a time, both platforms on the same network
- Roll backAny single service, until you switch the old setup off
Free, with every feature.
There is no enterprise edition and no license key. Audit log, SSO, custom roles and multi-node are in the same build you install. Sponsors pay for the hours behind releases, security fixes and the template catalog.
Questions people ask first.
What is a self-hosted PaaS?
A platform as a service you run on your own servers. You push code or pick an app, and it handles the build, the container, the domain, HTTPS, backups and logs, the way a hosted platform does, but on machines you control and pay for directly.
Is LogiStack free?
Yes. LogiStack is open source under the Apache 2.0 license, and every feature is in the build you install: SSO, custom roles, the audit log and multi-node clusters included. There is no paid edition. Sponsors fund development.
What do I need to run it?
One Linux server with Ubuntu 22.04 or later or Debian 12 or later, amd64 or arm64, 2 GB of RAM, 10 GB of free disk and ports 80 and 443 open. The installer sets up Docker and Swarm if they are missing.
Can it run my apps across more than one server?
Yes. LogiStack runs on Docker Swarm. Add a node from the dashboard and its agent connects back over one outbound WebSocket, so metrics, logs, backups and schedules work on every machine.
Which databases can I deploy?
Postgres, MySQL, MariaDB, MongoDB, Redis and libSQL in one click, each with a built-in editor for tables, keys and documents, scheduled encrypted backups and restore.
Can I move from another self-hosted PaaS?
Yes. The importer reads existing projects, env vars and domains, freezes the old setup and moves services one at a time. Each service can be rolled back until you switch the old platform off.
Does it work with AI coding agents?
LogiStack ships an MCP server that mirrors its REST API, so an agent such as Claude can create services, read logs and deploy with your permissions. Destructive tools ask for confirmation first.
One command, then a browser.
Runs on Ubuntu 22.04 or Debian 12 with 2 GB of RAM. The setup wizard asks for a domain and an email, then you deploy.
curl -fsSL get.logistack.dev | sudo bash