# Go, Java, .NET, Ruby, Bun and Deno apps

> Run apps on Go, Java, .NET, Ruby, Bun or Deno as managed services behind the web server, with limits sized from the server.

Apps on other runtimes run like [Node.js and Python apps](/docs/node-python-apps): a managed systemd service of the site's user on a local port, with the web server in front for the domain, HTTPS and static files.

## 1. Install the runtime

In the server's [web stack](/docs/web-stack), under **Other runtimes**, pick the runtime and its versions and **Install**:

| Runtime | Versions | Where it comes from |
| --- | --- | --- |
| Go | 1.27, 1.26 | go.dev release, checksum pinned |
| Java | 25, 21 (LTS) | Eclipse Temurin JDK, checksum pinned |
| .NET | 10, 8 (LTS) | Microsoft SDK, checksum pinned |
| Ruby | the distribution's | Debian/Ubuntu packages, with Bundler and build tools |
| Bun | 1 | Bun release, checksum pinned |
| Deno | 2 | Deno release, checksum pinned |

Security releases arrive with agent updates, and running apps restart on the new version. Remove a version with its chip (**×**); that is refused while a site uses it.

## 2. Add the site

**Add site** and choose the runtime and version under **Type**. Zefily assigns a free local port.

## 3. Deploy the code

Set up a [Git deploy](/docs/deploy-from-github) on the site's **Deploy** pane with build commands and a **Start command**. The start command runs in the live release as the site user and must listen on `127.0.0.1:$PORT`. For example:

| Runtime | Build commands | Start command |
| --- | --- | --- |
| Go | `go build -o app .` | `./app` |
| Java | `./mvnw -q package -DskipTests` | `java -jar target/app.jar` |
| .NET | `dotnet publish -c Release -o out` | `dotnet out/App.dll` |
| Ruby (Rails) | `bundle install`, `bin/rails assets:precompile` | `bundle exec puma -b tcp://127.0.0.1:$PORT` |
| Bun | `bun install --frozen-lockfile` | `bun run start` |
| Deno | `deno install` | `deno task start` |

The process gets limits sized from its share of the server, so the app fits beside the others: Go `GOMAXPROCS` and `GOMEMLIMIT`; Java a heap ceiling (`-Xmx`) and processor count in `JAVA_TOOL_OPTIONS`, plus `SERVER_PORT`; .NET `DOTNET_GCHeapHardLimit`, `DOTNET_PROCESSOR_COUNT` and `ASPNETCORE_URLS`; Ruby `RAILS_ENV=production` and Bundler's deployment settings; Bun and Deno `NODE_ENV=production`. `WEB_CONCURRENCY` (worker processes) is set for every runtime. Builds run without toolchain downloads (`GOTOOLCHAIN=local`) or telemetry.

The app restarts on every deploy; if it does not answer after a deploy, the site switches back to the previous release. Configuration goes into the site's [.env](/docs/logs-and-env), and the app's output is on the **Logs** pane under **App process**.

---
Source: https://zefily.com/docs/other-runtimes
