Bereitstellung einer TypeScript-Anwendung auf einem VPS: Schritt-für-Schritt-Anleitung von A bis Z
\n\nDie Entwicklung mit TypeScript ist der moderne Standard für die Erstellung zuverlässiger und skalierbarer Webanwendungen. Nachdem der Code geschrieben ist, stellt sich jedoch die Frage: Wie stellt man ihn richtig auf einem echten Server bereit? In diesem Artikel werden wir den gesamten Bereitstellungszyklus einer TypeScript-Anwendung auf einem VPS (Virtual Private Server) durchgehen. Sie erfahren, wie Sie die Umgebung einrichten, TypeScript in JavaScript kompilieren, den automatischen Start mit PM2 organisieren und einen Reverse Proxy über Nginx konfigurieren. Das Material richtet sich an Entwickler, die bereits grundlegende Kenntnisse in TypeScript und Linux haben.
\n\n1. Vorbereitung des VPS und Installation der erforderlichen Software
\n\nDer erste Schritt ist die Vorbereitung des Servers. Wir verwenden Ubuntu 22.04 LTS, da es eines der stabilsten und beliebtesten Betriebssysteme für VPS ist. Stellen Sie eine SSH-Verbindung zum Server her:
\n\nssh root@ihre-server-ip\n\nAktualisieren Sie den Paketmanager und installieren Sie Node.js (empfohlen wird die LTS-Version) zusammen mit dem Paketmanager npm:
\n\napt update && apt upgrade -y\ncurl -fsSL https://deb.nodesource.com/setup_20.x | bash -\napt install -y nodejs git nginx\n\nÜberprüfen Sie die Installation:
\n\nnode -v # v20.x.x\nnpm -v # 10.x.x\n\nInstallieren Sie nun global TypeScript und PM2 (Prozess-Manager für Node.js):
\n\nnpm install -g typescript pm2\n\nWichtig: TypeScript wird in JavaScript kompiliert, daher muss TypeScript auf dem Server nicht zwingend zur Laufzeit vorhanden sein – es reicht, den Code lokal oder auf dem Server vor dem Start zu kompilieren. Die globale Installation von ts-node kann jedoch zum Debuggen nützlich sein.
\n\n2. Kompilierung von TypeScript und Konfiguration der package.json
\n\nAngenommen, Ihre Anwendung hat die folgende Struktur:
\n\nmy-ts-app/\n├── src/\n│ ├── index.ts\n│ ├── routes.ts\n│ └── utils.ts\n├── package.json\n├── tsconfig.json\n└── .gitignore\n\nDie Datei tsconfig.json sollte für den Production-Build konfiguriert sein. Beispielkonfiguration:
{\n "compilerOptions": {\n "target": "ES2020",\n "module": "commonjs",\n "outDir": "./dist",\n "rootDir": "./src",\n "strict": true,\n "esModuleInterop": true,\n "skipLibCheck": true,\n "forceConsistentCasingInFileNames": true,\n "resolveJsonModule": true\n },\n "include": ["src/**/*"],\n "exclude": ["node_modules", "dist", "tests"]\n}\n\nFügen Sie in der package.json Skripte zum Bauen und Starten hinzu:
{\n "name": "my-ts-app",\n "version": "1.0.0",\n "scripts": {\n "build": "tsc",\n "start": "node dist/index.js",\n "dev": "ts-node src/index.ts"\n },\n "dependencies": {\n "express": "^4.18.2"\n },\n "devDependencies": {\n "typescript": "^5.3.3",\n "@types/express": "^4.17.21",\n "ts-node": "^10.9.2"\n }\n}\n\nWenn Sie nun npm run build ausführen, kompiliert TypeScript die Dateien aus dem Ordner src in den Ordner dist. Beispiel eines einfachen Servers mit Express (Datei src/index.ts):
import express, { Request, Response } from 'express';\n\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\napp.get('/', (req: Request, res: Response) => {\n res.send('TypeScript-Anwendung läuft auf dem VPS!');\n});\n\napp.listen(PORT, () => {\n console.log(`Server läuft auf Port ${PORT}`);\n});\n\n3. Repository klonen und auf dem Server bauen
\n\nKopieren Sie Ihre Anwendung auf den Server. Der bequemste Weg ist über Git. Wenn Ihr Code auf GitHub/GitLab gehostet wird, führen Sie auf dem Server aus:
\n\ncd /var/www\ngit clone https://github.com/ihr-benutzername/my-ts-app.git\ncd my-ts-app\n\nInstallieren Sie die Abhängigkeiten und führen Sie den Build aus:
\n\nnpm install\nnpm run build\n\nDanach erscheinen im Ordner dist die kompilierten .js
Blogs
Buchempfehlungen
Lesen Sie auch
Logging in Rust-Anwendungen: Best Practices für Anfänger
Fehlerbehandlung in JavaScript: try/catch und fortgeschrittene Techniken in Node.js
10 Anfängerfehler in C++: Wie man den Code nicht kaputt macht
Logging in Swift-Anwendungen: Best Practices für Anfänger
Sicherheit von Go-Anwendungen: Top-10 Schwachstellen