paint-brush
So automatisieren Sie die Bereitstellung einer Blog-Post-App mit GitHub Actions, Node.js, CouchDB und Aptiblevon@wise4rmgod
3,259 Lesungen
3,259 Lesungen

So automatisieren Sie die Bereitstellung einer Blog-Post-App mit GitHub Actions, Node.js, CouchDB und Aptible

von Wisdom Nwokocha19m2023/12/04
Read on Terminal Reader

Zu lang; Lesen

Willkommen beim Leitfaden zur Automatisierung der Blog-Post-App-Bereitstellung mit GitHub Actions, Node.js, CouchDB und Aptible. Dieses umfassende Tutorial führt Sie durch die Erstellung, Bereitstellung und Verwaltung einer Blog-Post-Anwendung mithilfe der oben genannten Tools und Technologien. Aber zunächst möchte ich Ihnen einen kurzen Überblick über die Blogpost-App, ihre Funktionen und ihre Hauptkomponenten geben. Die Blogpost-App ist eine Webanwendung, mit der Benutzer Blogbeiträge erstellen und teilen können. Benutzer können Beiträge anderer Benutzer schreiben, bearbeiten, löschen und anzeigen. Die App verwendet Node.js als Backend, CouchDB als Datenbank und GitHub Actions als kontinuierliches Integrations- und Bereitstellungstool.
featured image - So automatisieren Sie die Bereitstellung einer Blog-Post-App mit GitHub Actions, Node.js, CouchDB und Aptible
Wisdom Nwokocha HackerNoon profile picture

Willkommen beim Leitfaden zur Automatisierung der Bereitstellung einer Blog-Post-App mithilfe von GitHub Actions, Node.js,

CouchDB und Aptible.


Dieses umfassende Tutorial führt Sie durch die Erstellung, Bereitstellung und Verwaltung einer Blog-Post-Anwendung mithilfe der oben genannten Tools und Technologien.


Aber zunächst möchte ich Ihnen einen kurzen Überblick über die Blogpost- App, ihre Funktionen und ihre Hauptkomponenten geben. Die Blogpost- App ist eine Webanwendung, mit der Benutzer Blogbeiträge erstellen und teilen können.


Benutzer können Beiträge anderer Benutzer schreiben, bearbeiten, löschen und anzeigen. Die App verwendet Node.js als Backend, CouchDB als Datenbank und GitHub Actions als kontinuierliches Integrations- und Bereitstellungstool.


Warum habe ich diese ausgewählt? Nun, es gibt viele Gründe, aber hier sind einige der wichtigsten:


  • Node.js ist eine schnelle, skalierbare und benutzerfreundliche JavaScript-Laufzeitumgebung, die auf verschiedenen Plattformen ausgeführt werden kann. Es verfügt über viele Bibliotheken und Frameworks für die Webentwicklung, wie zum Beispiel Express, ein minimalistisches und flexibles Webanwendungs-Framework, das ich in diesem Projekt verwenden werde.


  • CouchDB ist ein Open-Source-NoSQL-Datenbanksystem, das zuverlässig, sicher und leistungsstark ist. Es handelt sich um eine dokumentenorientierte Datenbank, die JSON zum Speichern von Daten verwendet.


  • GitHub Actions ist ein flexibles, praktisches und integriertes Tool, mit dem Sie Arbeitsabläufe für Ihre GitHub-Repositorys automatisieren können. Es verfügt außerdem über viele vorgefertigte Aktionen, die Sie verwenden oder an Ihre Bedürfnisse anpassen können, z. B. die Aktion „Aptible Deploy“, die ich in diesem Projekt verwenden werde, um die App in Aptible bereitzustellen.


  • Aptible ist eine cloudbasierte Plattform für die Bereitstellung und Verwaltung von Containeranwendungen und bietet einfache Bereitstellungs-, Skalierungs- und Überwachungsfunktionen.

Voraussetzungen

Bevor Sie mit der Entwicklungsreise beginnen, ist die Einrichtung der erforderlichen Tools und Technologien unerlässlich.


  • Node.js: Stellen Sie sicher, dass Node.js auf Ihrem Computer installiert ist.


  • CouchDB: Stellen Sie sicher, dass CouchDB auf Ihrem System installiert ist und ausgeführt wird.


  • Node.js- und JavaScript-Expertise: Besitzen Sie ein solides Verständnis der Node.js- und JavaScript-Grundlagen.


  • Docker: Installieren Sie Docker und führen Sie es auf Ihrem Computer aus.


  • Aptible-Konto: Erstellen Sie ein Aptible-Konto und machen Sie sich mit der Bereitstellung einer Basisanwendung vertraut.


  • Docker Cloud-Konto: Erwerben Sie ein Docker Cloud-Konto zum Hosten Ihrer Anwendungen.

Entwicklung der Blogpost-App

1: Richten Sie Ihr Node.js-Projekt ein

  • Erstellen Sie ein Projektverzeichnis für Ihre Blog-Post-App.


  • Initialisieren Sie ein Node.js-Projekt mit npm:
 npm init -y


  • Installieren Sie das Express.js-Framework, das als Grundlage für das Backend dient:
 npm install express nano

Schritt 2: CouchDB einrichten

  • Stellen Sie sicher, dass CouchDB installiert ist und ausgeführt wird. Sie können über Ihren Browser unter http://127.0.0.1:5984/_utils/ auf CouchDB zugreifen.


CouchDB-Dashboard

Schritt 3: Erstellen Sie Ihre Node.js-Anwendung

  • Erstellen Sie eine blog.js Datei in Ihrem Projektverzeichnis.


  • Express initialisieren und mit CouchDB verbinden:
 const express = require("express"); const nano = require("nano")("http://admin:[email protected]:5984"); const app = express(); const port = 3000; // Middleware to parse JSON data app.use(express.json()); // async function asyncCall() { // // await nano.db.destroy("alice"); // await nano.db.create("blogposts"); // const db = nano.use("blogposts"); // return response; // } // asyncCall(); const db = nano.use("blogposts");


  • Dieser Code definiert API-Endpunkte zum Erstellen, Abrufen, Aktualisieren und Löschen von Blogbeiträgen mithilfe einer CouchDB-Datenbank.


 // Create a new blog post app.post("/posts", async (req, res) => { const { title, description, author } = req.body; try { const doc = await db.insert({ title, description, author, createdAt: new Date(), updatedAt: new Date(), }); res.json({ id: doc.id, rev: doc.rev }); } catch (err) { console.error(err); res.status(500).send("Error creating post"); } }); // Get all blog posts app.get("/posts", async (req, res) => { try { const docs = await db.list({ include_docs: true }); res.json(docs.rows); } catch (err) { console.error(err); res.status(500).send("Error retrieving posts"); } }); // Get a specific blog post app.get("/posts/:id", async (req, res) => { const { id } = req.params; try { const doc = await db.get(id); res.json(doc); } catch (err) { console.error(err); res.status(404).send("Post not found"); } }); // Update a blog post app.put("/posts/:id", async (req, res) => { const { id } = req.params; const { title, description } = req.body; try { await db.insert({ _id: id, title, description, updatedAt: new Date(), }); res.json({ message: "Post updated successfully" }); } catch (err) { console.error(err); res.status(500).send("Error updating post"); } }); // Delete a blog post app.delete("/posts/:id", async (req, res) => { const { id } = req.params; try { await db.destroy(id); res.json({ message: "Post deleted successfully" }); } catch (err) { console.error(err); res.status(500).send("Error deleting post"); } }); app.listen(port, () => { console.log(`Blogpost app listening on port ${port}`); });


Lokal testen:

Gründliche Tests sind entscheidend, um die Funktionalität und Robustheit Ihres Projekts sicherzustellen. Hier ist eine Beispiel-API-Dokumentation als Leitfaden für Ihren Testprozess:

API-Dokumentation

Basis-URL :

Angenommen, Ihr Server läuft lokal auf Port 3000, dann wäre die Basis-URL für Ihre API:

 http://localhost:3000

API-Endpunkte:

Erstellen Sie einen neuen Blogbeitrag

  • Endpunkt : POST /posts

  • Beschreibung : Erstellt einen neuen Blogbeitrag.

  • Anfragetext :

     { "title": "String", "description": "String", "author": "String" }
  • Beispiel :

     POST http://localhost:3000/posts { "title": "Sample Title", "description": "Sample Description", "author": "John Doe" }

Holen Sie sich alle Blog-Beiträge

  • Endpunkt : GET /posts

  • Beschreibung : Ruft alle Blogbeiträge ab.

  • Antwort :

     [ { "id": "String", "key": "String", "value": { "rev": "String" }, "doc": { "_id": "String", "_rev": "String", "title": "String", "description": "String", "author": "String", "createdAt": "Date", "updatedAt": "Date" } } ]
  • Beispiel :

     GET http://localhost:3000/posts

Holen Sie sich einen bestimmten Blog-Beitrag

  • Endpunkt : GET /posts/:id

  • Beschreibung : Ruft einen bestimmten Blog-Beitrag anhand seiner ID ab.

  • Parameter :

    • id : ID des Blogbeitrags.
  • Antwort :

     { "_id": "String", "_rev": "String", "title": "String", "description": "String", "author": "String", "createdAt": "Date", "updatedAt": "Date" }
  • Beispiel :

     GET http://localhost:3000/posts/your-post-id

Aktualisieren Sie einen Blog-Beitrag

  • Endpunkt : PUT /posts/:id

  • Beschreibung : Aktualisiert einen bestimmten Blog-Beitrag anhand seiner ID.

  • Parameter :

    • id : ID des Blogbeitrags.
  • Anfragetext :

     { "title": "String", "description": "String" }
  • Beispiel :

     PUT http://localhost:3000/posts/your-post-id { "title": "Updated Title", "description": "Updated Description" }

Löschen Sie einen Blog-Beitrag

  • Endpunkt : DELETE /posts/:id

  • Beschreibung : Löscht einen bestimmten Blog-Beitrag anhand seiner ID.

  • Parameter :

    • id : ID des Blogbeitrags.
  • Beispiel :

     DELETE http://localhost:3000/posts/your-post-id


Bitte ersetzen Sie your-post-id durch eine tatsächliche ID des Blogbeitrags, wenn Sie die Anforderungen GET , PUT und DELETE testen.

Schritt 4: Dockerisieren Sie Ihre Node.js-Anwendung

Sie benötigen ein Docker Hub-Konto. Wenn Sie noch keins erstellt haben, melden Sie sich bei Docker Hub an.

Stellen Sie sicher, dass Docker auf Ihrem lokalen Computer installiert ist und ausgeführt wird.

Schritte zum Übertragen einer Docker-App auf den Docker Hub:

  • Erstellen Sie eine Dockerfile im Stammverzeichnis Ihres Node.js-Projekts.
 # Use an official Node.js runtime as the base image FROM node:16 # Set the working directory in the container WORKDIR /usr/src/app # Copy package.json and package-lock.json to the working directory COPY package*.json ./ # Install app dependencies RUN npm install # Copy the rest of the application files to the working directory COPY . . # Expose the port the app runs on EXPOSE 3000 # Define the command to run the app CMD ["node", "blog.js"]
  • Kennzeichnen Sie Ihr Docker-Image: Öffnen Sie Ihr Terminal/Ihre Eingabeaufforderung und navigieren Sie zum Stammverzeichnis Ihrer Node.js-Anwendung, in dem sich Ihre Docker-Datei befindet.


Führen Sie den folgenden Befehl aus, um Ihr Docker-Image zu erstellen, und markieren Sie es mit Ihrem Docker Hub-Benutzernamen und dem gewünschten Repository-Namen:


 docker build -t your-docker-username/blogpost-app:latest .

Ersetzen Sie your-docker-username durch Ihren Docker Hub-Benutzernamen und blogpost-app durch Ihren gewünschten Repository-Namen.


Sie erhalten eine ähnliche Antwort wie diese:

 [+] Building 1.1s (10/10) FINISHED docker:desktop-linux => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 489B 0.0s => [internal] load metadata for docker.io/library/node:16 1.0s => [1/5] FROM docker.io/library/node:16@sha256:f77a1aef2da8d83e45ec990f45df50f1a286c5fe8bbfb8c6e4246c6389705c0b 0.0s => [internal] load build context 0.0s => => transferring context: 45.31kB 0.0s => CACHED [2/5] WORKDIR /usr/src/app 0.0s => CACHED [3/5] COPY package*.json ./ 0.0s => CACHED [4/5] RUN npm install 0.0s => CACHED [5/5] COPY . . 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:c5f046a9b99389aea6bf3f503e9b05cce953daf1b3f77ee5fb3f7469dc36c709 0.0s => => naming to docker.io/wise4rmgod/blogpost-app:latest


  • Melden Sie sich bei Docker Hub an: Authentifizieren Sie Ihren Docker-Client mit Ihrem Docker Hub-Konto, indem Sie den folgenden Befehl ausführen:
 docker login


Geben Sie Ihren Docker Hub-Benutzernamen und Ihr Passwort ein, wenn Sie dazu aufgefordert werden.

 Authenticating with existing credentials... Login Succeeded


  • Übertragen Sie das Docker-Image an Docker Hub: Sobald Sie angemeldet sind, übertragen Sie Ihr markiertes Docker-Image mit dem folgenden Befehl in Ihr Docker Hub-Repository:
 docker push your-docker-username/blogpost-app:latest

Dieser Befehl lädt Ihr lokales Image in Docker Hub unter Ihrem angegebenen Repository hoch.


  • Überprüfen Sie den Push: Gehen Sie zu Ihrem Docker Hub-Konto im Web und navigieren Sie zu Ihrem Repository, um zu bestätigen, dass Ihr Docker-Image erfolgreich gepusht wurde.

    Docker-Cloud-Dashboard



 aptible deploy --app reactgame --docker-image wise4rmgod/blogpost-app --private-registry-username wise4rmgod --private-registry-password H$(_tS+W~ZBST63

Schritt 5: Aptible-Bereitstellung

In diesem Tutorial wird davon ausgegangen, dass Sie über grundlegende Kenntnisse zum Einrichten einer Umgebung , Anwendung , eines Endpunkts und einer Datenbank auf der Aptible-Plattform verfügen. Das Tutorial verwendet CouchDB als Datenbank und Direct Docker für die Bereitstellung.


  • Melden Sie sich über die CLI mit dem folgenden Befehl bei Aptible an:
 aptible login


Sie werden aufgefordert, Ihre E-Mail-Adresse und Ihr Passwort einzugeben. Bei Erfolg erhalten Sie eine Antwort ähnlich dieser:

 Token written to /Users/wisdomnwokocha/.aptible/tokens.json This token will expire after 6 days, 23 hrs (use --lifetime to customize)


  • Stellen Sie nun Ihre App mit dem folgenden Befehl bereit:

Syntax:

 aptible deploy --app <app name> --docker-image <docker image in cloud>


Hier ist ein Beispielbefehl:

 aptible deploy --app reactgame --docker-image wise4rmgod/blogpost-app


Sie erhalten eine Antwort ähnlich der folgenden:

 INFO -- : Starting App deploy operation with ID: 61135861 INFO -- : Deploying without git repository INFO -- : Writing .aptible.env file... INFO -- : Fetching app image: wise4rmgod/blogpost-app... INFO -- : Pulling from wise4rmgod/blogpost-app INFO -- : 26ee4ff96582: Pulling fs layer INFO -- : 446eab4103f4: Pulling fs layer INFO -- : 2e3c22a0f840: Pulling fs layer INFO -- : a7ab8ad9b408: Pulling fs layer INFO -- : 3808fdf0c601: Pulling fs layer INFO -- : ab9e4075c671: Pulling fs layer INFO -- : 362360c8cef6: Pulling fs layer INFO -- : 928b5d11ac66: Pulling fs layer INFO -- : dc87e077ac61: Pulling fs layer INFO -- : f108e80f4efc: Pulling fs layer INFO -- : 84ac53840ac8: Pulling fs layer INFO -- : e81f21b79a1f: Pulling fs layer INFO -- : 2e3c22a0f840: Downloading: 523 KB / 49.8 MB INFO -- : 446eab4103f4: Downloading: 173 KB / 16.6 MB INFO -- : 26ee4ff96582: Downloading: 483 KB / 47 MB INFO -- : 2e3c22a0f840: Downloading: 25.7 MB / 49.8 MB INFO -- : a7ab8ad9b408: Downloading: 528 KB / 175 MB INFO -- : ab9e4075c671: Downloading: 355 KB / 33.4 MB INFO -- : a7ab8ad9b408: Downloading: 35.3 MB / 175 MB INFO -- : 26ee4ff96582: Pull complete INFO -- : 446eab4103f4: Pull complete INFO -- : 2e3c22a0f840: Pull complete INFO -- : a7ab8ad9b408: Downloading: 71.2 MB / 175 MB INFO -- : a7ab8ad9b408: Downloading: 106 MB / 175 MB INFO -- : a7ab8ad9b408: Downloading: 142 MB / 175 MB INFO -- : a7ab8ad9b408: Pull complete INFO -- : 3808fdf0c601: Pull complete INFO -- : ab9e4075c671: Pull complete INFO -- : 362360c8cef6: Pull complete INFO -- : 928b5d11ac66: Pull complete INFO -- : dc87e077ac61: Pull complete INFO -- : f108e80f4efc: Pull complete INFO -- : 84ac53840ac8: Pull complete INFO -- : e81f21b79a1f: Pull complete INFO -- : Digest: sha256:de9d04d069ca89ebdb37327365a815c88cd40d90cbc5395cc31c351fff1206dd INFO -- : Status: Downloaded newer image for wise4rmgod/blogpost-app:latest INFO -- : No Procfile found in git directory or /.aptible/Procfile found in Docker image: using Docker image CMD INFO -- : No .aptible.yml found in git directory or /.aptible/.aptible.yml found in Docker image: no before_release commands will run INFO -- : Pushing image dualstack-v2-registry-i-0a5ec8cff8e775b34.aptible.in:46022/app-63213/72184c41-7dc6-4313-b10e-749125f72577:latest to private Docker registry... INFO -- : The push refers to repository [dualstack-v2-registry-i-0a5ec8cff8e775b34.aptible.in:46022/app-63213/72184c41-7dc6-4313-b10e-749125f72577] INFO -- : dd387bc6b362: Pushed INFO -- : 586bd9d5efcf: Pushed INFO -- : 8ae0c889ca84: Pushed INFO -- : c91ec53bcc27: Pushing: 522 KB / 93.6 MB INFO -- : aec897bac4f0: Pushed INFO -- : 0ead224631d3: Pushed INFO -- : ad3b30eb29d3: Pushing: 542 KB / 444 MB INFO -- : 2a7587eb01b6: Pushing: 544 KB / 137 MB INFO -- : be36d2a441aa: Pushed INFO -- : 03f6e3800bbe: Pushed INFO -- : a10e482288d1: Pushing: 338 KB / 30.7 MB INFO -- : f9cfc9f6b603: Pushing: 513 KB / 103 MB INFO -- : c91ec53bcc27: Pushing: 31.3 MB / 93.6 MB INFO -- : c91ec53bcc27: Pushing: 62.7 MB / 93.6 MB INFO -- : ad3b30eb29d3: Pushing: 44.5 MB / 444 MB INFO -- : 2a7587eb01b6: Pushing: 34.4 MB / 137 MB INFO -- : a10e482288d1: Pushed INFO -- : ad3b30eb29d3: Pushing: 88.9 MB / 444 MB INFO -- : f9cfc9f6b603: Pushing: 34.6 MB / 103 MB INFO -- : 2a7587eb01b6: Pushing: 68.9 MB / 137 MB INFO -- : ad3b30eb29d3: Pushing: 133 MB / 444 MB INFO -- : f9cfc9f6b603: Pushing: 70.2 MB / 103 MB INFO -- : c91ec53bcc27: Pushed INFO -- : 2a7587eb01b6: Pushing: 103 MB / 137 MB INFO -- : ad3b30eb29d3: Pushing: 178 MB / 444 MB INFO -- : ad3b30eb29d3: Pushing: 224 MB / 444 MB INFO -- : 2a7587eb01b6: Pushed INFO -- : f9cfc9f6b603: Pushed INFO -- : ad3b30eb29d3: Pushing: 270 MB / 444 MB INFO -- : ad3b30eb29d3: Pushing: 312 MB / 444 MB INFO -- : ad3b30eb29d3: Pushing: 355 MB / 444 MB INFO -- : ad3b30eb29d3: Pushing: 401 MB / 444 MB INFO -- : ad3b30eb29d3: Pushed INFO -- : latest: digest: sha256:de9d04d069ca89ebdb37327365a815c88cd40d90cbc5395cc31c351fff1206dd size: 2841 INFO -- : Pulling from app-63213/72184c41-7dc6-4313-b10e-749125f72577 INFO -- : Digest: sha256:de9d04d069ca89ebdb37327365a815c88cd40d90cbc5395cc31c351fff1206dd INFO -- : Status: Image is up to date for dualstack-v2-registry-i-0a5ec8cff8e775b34.aptible.in:46022/app-63213/72184c41-7dc6-4313-b10e-749125f72577:latest INFO -- : Image app-63213/72184c41-7dc6-4313-b10e-749125f72577 successfully pushed to registry. INFO -- : STARTING: Register service cmd in API INFO -- : COMPLETED (after 0.28s): Register service cmd in API INFO -- : STARTING: Derive placement policy for service cmd INFO -- : COMPLETED (after 0.15s): Derive placement policy for service cmd INFO -- : STARTING: Create new release for service cmd INFO -- : COMPLETED (after 0.24s): Create new release for service cmd INFO -- : STARTING: Schedule service cmd .. INFO -- : COMPLETED (after 13.49s): Schedule service cmd INFO -- : STARTING: Stop old app containers for service cmd INFO -- : COMPLETED (after 0.0s): Stop old app containers for service cmd INFO -- : STARTING: Start app containers for service cmd INFO -- : WAITING FOR: Start app containers for service cmd INFO -- : WAITING FOR: Start app containers for service cmd INFO -- : COMPLETED (after 18.4s): Start app containers for service cmd INFO -- : STARTING: Delete old containers for service cmd in API INFO -- : COMPLETED (after 0.0s): Delete old containers for service cmd in API INFO -- : STARTING: Commit app containers in API for service cmd INFO -- : COMPLETED (after 0.26s): Commit app containers in API for service cmd INFO -- : STARTING: Commit service cmd in API INFO -- : COMPLETED (after 0.13s): Commit service cmd in API INFO -- : STARTING: Cache maintenance page INFO -- : COMPLETED (after 0.28s): Cache maintenance page INFO -- : STARTING: Commit app in API INFO -- : COMPLETED (after 0.19s): Commit app in API INFO -- : App deploy successful.


  • Besuchen Sie das Aptible-Dashboard, um zu bestätigen, dass die Bereitstellung erfolgreich war.

  • Klicken Sie im Dashboard auf die Registerkarte Endpunkt und speichern Sie den Endpunkt. Dadurch können Sie Ihre Datenbank dem öffentlichen Internet zugänglich machen.

  • Klicken Sie im nächsten Bildschirm auf Endpunkt hinzufügen , um einen neuen Endpunkt zu erstellen.

Abschluss

Dieses umfassende Tutorial hilft Ihnen beim Erstellen, Bereitstellen und Verwalten einer Blog-Post-Anwendung mit Node.js, CouchDB und Aptible.


Sie haben die Grundlagen der Einrichtung der wesentlichen Tools und Technologien, der Erstellung des Backends der Blog-Post-Anwendung, der Dockerisierung der Anwendung, der Übertragung des Docker-Images an Docker Hub und der Bereitstellung der Anwendung auf Aptible verstanden.


Herzlichen Glückwunsch zum Abschluss dieses umfassenden Tutorials und zu Ihrem Weg in die cloudnative Anwendungsentwicklung mit Aptible!