Deploy from GitHub to your own server

Zelie is self-hosted app hosting. Connect GitHub once, and every push builds your app, runs its tests and puts it live on your own Linux server, with a domain, HTTPS and the last five versions ready to roll back. It installs with one command and needs no Docker.

An app’s deployments in Zelie: the live version and four earlier ones with a Roll back link

01

What happens on a push

  1. 01Build. The code is built in a temporary container. A repository with a Dockerfile is built with it. Without one, Railpack works out the build for Node, Python, Go, static sites and more, and Zelie shows the build and start commands it chose.
  2. 02Test. The project’s tests run in the new image, in a container of their own, for at most ten minutes. For Node projects Zelie finds the test script itself; any other command can be set. A failing test keeps the old version.
  3. 03Health check. The new version starts next to the old one. An app with a domain must answer on its health path within a minute.
  4. 04Live. Traffic moves over. The commit on GitHub is marked as building, live or failed.

If any step fails, the old version keeps serving and the log shows why. The images of the last five live versions are kept, so a rollback takes a second or two.

02

A GitHub App in your own account

Connecting GitHub creates a GitHub App in your own account or organization, with access only to the repositories you pick. Private repositories work. The App may read code and set commit statuses, nothing else, and its private key is encrypted before it is stored.

  • Each push to the app’s branch deploys it, if you leave that on.
  • A push only deploys the apps set to that repository and branch, so one GitHub App serves many apps without them getting in each other’s way.
  • Every webhook is checked against its secret before anything else, and a delivery that arrives twice is handled once.
  • Public repositories deploy without the App, when you start the deployment yourself.

03

Images and plain files too

A container image
Any public image, such as nginx:1.27, with a domain and HTTPS of its own. Zelie checks the registry once a day and offers the new image when the tag has moved.
Your own files
Pick Node.js, Python, Bun, Deno or Java and upload the files, or send them over SFTP. This suits a Discord bot or a small site. There is no build step here: the files are the app.

04

What every app gets

A domain and HTTPS
Installed with a domain, Zelie gets certificates from Let’s Encrypt. Behind a Cloudflare Tunnel, Cloudflare handles HTTPS and no port is open on the server.
Variables and secrets
Plain and secret ones, or a whole .env file pasted in. A secret is sealed as it is saved, and builds get variables as BuildKit secrets, which stay out of the image.
Databases beside it
PostgreSQL, MariaDB or Redis in a click. Linking one gives the app DATABASE_URL or REDIS_URL, and nothing else can reach it.
Live logs and metrics
Build, deploy and app logs as they happen. Requests, server errors, memory, CPU and traffic, a reading a minute, kept for a day.
Crashes handled
An app that stops by itself comes back, waiting longer after each crash. After five crashes in ten minutes it stays down and the panel says why.
Its own container
Its own network and user namespace, with limits on memory and CPU. Root inside the container is nobody on the server.

05

On your own server

Zelie is one file of about 50 MB, with its own containerd and its state in SQLite. Its own processes stay under 66 MB of memory when idle, so a small VPS has room for the apps. It runs on Debian or Ubuntu, amd64 or arm64, and the same panel can run game servers next to your apps.

Deploying on every push needs GitHub to reach the panel, which it can with a domain or a Cloudflare Tunnel. Each app is one image, one Dockerfile or one folder of files; Docker Compose files are not read.

06

Questions

Can Zelie deploy private GitHub repositories?

Yes. Zelie creates a GitHub App in your own account or organization with access only to the repositories you choose, and private ones work through it.

Do I need a Dockerfile?

No. With a Dockerfile, Zelie builds with it. Without one, Railpack works out the build for Node, Python, Go, static sites and more, and you can replace the build and start commands it chose.

What if a deploy breaks the app?

A new version only takes traffic after it builds, passes its tests and answers its health check. If it fails, the old version keeps serving. Any of the last five live versions can be rolled back to in a click.

Does it need Docker on the server?

No. Zelie brings its own containerd and builds with BuildKit inside an ordinary Zelie container. If Docker is already on the machine, Zelie leaves it alone.

Is it free?

Yes, on a single server, with no limit on apps, databases or game servers. Zelie is open source under the AGPL.

Install Zelie

Run this as root on a Debian or Ubuntu server. It checks the release’s signature, installs Zelie and asks how people will reach the panel.

curl -fsSL https://github.com/Caria-Core/zelie/releases/latest/download/install.sh | sh

Free on a single server. Read how the install works first if you want to know what it changes.

Deploy from GitHub to your own server: self-hosted app hosting · Zelie