Eine Hono-App mit Docker bauen und deployen

Eine Hono-App mit Docker bauen und deployen

Jonas Scholz - Co-Founder von sliplane.ioJonas Scholz
5 min

Hono läuft auf verschiedenen Runtimes. Hier nehmen wir den Node.js-Adapter und starten TypeScript direkt mit tsx. Damit bleibt das Setup klein, und du brauchst keinen eigenen Build-Schritt zum Kompilieren.

App erstellen

Nutzt deine App schon @hono/node-server, kannst du diesen Schritt überspringen. Sonst leg ein neues Projekt an:

npm create hono@latest example-hono
cd example-hono
npm install

Wähle das Template nodejs.

Auswahl des nodejs-Templates im Hono-Projektgenerator

Starte den Dev-Server mit npm run dev und öffne http://localhost:3000. Stopp ihn danach, damit der Port für den nächsten Test frei ist.

Host und Port setzen

Setz diesen Code in src/index.ts ein:

import { serve } from "@hono/node-server";
import { Hono } from "hono";

const app = new Hono();
app.get("/", (c) => c.text("Hello Hono!"));

const port = Number(process.env.PORT ?? 3000);
serve({ fetch: app.fetch, port, hostname: "0.0.0.0" });

process.env.PORT ist ein String. Wandle ihn in eine Zahl um, bevor du den Wert an den Server gibst. Mit dem passenden Host nimmt der Server auch Anfragen über das Container-Netzwerk an.

Prüf, ob tsx installiert ist, und ergänze diese Skripte in deiner package.json. Lass die anderen Einträge stehen:

{
  "scripts": {
    "start": "tsx src/index.ts",
    "dev": "tsx watch src/index.ts"
  }
}

Test den Start mit npm run start. Mit PORT=8888 npm run start prüfst du, ob die App auch auf einem anderen Port startet.

Dockerfile hinzufügen

Dockerfile
FROM node:24-bookworm-slim
WORKDIR /app
COPY --chown=node:node package.json package-lock.json ./
RUN chown node:node /app
USER node
RUN npm ci
COPY --chown=node:node . .
ENV NODE_ENV=production
ENV PORT=3000
EXPOSE 3000
CMD ["npm", "run", "start"]

npm ci installiert die Versionen aus deiner package-lock.json. Committe die Datei mit. Hier bleiben auch die Entwicklungsabhängigkeiten im Image: tsx steht oft in devDependencies, wird bei diesem Setup aber zum Starten gebraucht. Mit --omit=dev würdest du es dann entfernen. Dafür müsstest du die benötigten Pakete zuerst verschieben oder auf einen kompilierten Build wechseln.

Beim Kopieren bekommt der Benutzer node die Dateien. Danach führt er npm ci aus. Gehört das Verzeichnis noch root, kann die Installation beim Anlegen von node_modules scheitern.

Leg eine .dockerignore an:

.git
node_modules
dist
.env
.env.*
npm-debug.log

Bau das Image und starte den Container:

docker build -t hono-app .
docker run --rm --name hono-app -p 3000:3000 hono-app

Die Startseite sollte Hello Hono! zurückgeben. Kompiliert dein Projekt bereits zu JavaScript, behalte diesen Build und starte seine Ausgabe. Du brauchst dann kein zusätzliches tsx für dieses Dockerfile. Mehr zum Adapter steht in der Hono-Anleitung für Node.js.

Aus GitHub deployen

Committe die Dateien. Erstell dann in Sliplane einen Service und wähle dein Repository. Nimm das Dockerfile im Projektverzeichnis und setz den HTTP-Port auf 3000.

Repository- und Deployment-Einstellungen in der damaligen Sliplane-Oberfläche

Der Screenshot stammt aus dem ursprünglichen Tutorial. Die Oberfläche kann heute anders aussehen. Öffne nach dem Deployment die Service-URL und prüf die Antwort und die Logs. Zugangsdaten hinterlegst du als Umgebungsvariablen des Services.

Willkommen auf deiner Cloud-Plattform

Sliplane macht es einfach, deine Apps in der Cloud zu deployen und zu skalieren. Starte mit einem Container oder deinem Lieblings-Framework und wachse von da aus. Probier es jetzt aus!