paint-brush
GitHub Actions、Node.js、CouchDB、Aptible を使用してブログ投稿アプリのデプロイメントを自動化する方法@wise4rmgod
3,255 測定値
3,255 測定値

GitHub Actions、Node.js、CouchDB、Aptible を使用してブログ投稿アプリのデプロイメントを自動化する方法

Wisdom Nwokocha19m2023/12/04
Read on Terminal Reader

長すぎる; 読むには

GitHub Actions、Node.js、を使用したブログ投稿アプリのデプロイメントの自動化に関するガイドへようこそ。 CouchDB、および Aptible。 この包括的なチュートリアルでは、上記のツールとテクノロジを使用してブログ投稿アプリケーションを構築、展開、管理する方法を説明します。 その前に、Blogpost アプリの概要、機能、主なコンポーネントについて簡単に説明します。 Blogpost アプリは、ユーザーがブログ投稿を作成して共有できる Web アプリケーションです。 ユーザーは、他のユーザーの投稿を書き込み、編集、削除、表示できます。このアプリは、バックエンドとして Node.js、データベースとして CouchDB、継続的な統合およびデプロイメント ツールとして GitHub Actions を使用します。
featured image - GitHub Actions、Node.js、CouchDB、Aptible を使用してブログ投稿アプリのデプロイメントを自動化する方法
Wisdom Nwokocha HackerNoon profile picture

GitHub Actions、Node.js、を使用したブログ投稿アプリのデプロイメントの自動化に関するガイドへようこそ。

CouchDB、および Aptible。


この包括的なチュートリアルでは、上記のツールとテクノロジを使用してブログ投稿アプリケーションを構築、展開、管理する方法を説明します。


その前に、 Blogpostアプリの概要、機能、主なコンポーネントについて簡単に説明します。 Blogpostアプリは、ユーザーがブログ投稿を作成して共有できる Web アプリケーションです。


ユーザーは、他のユーザーの投稿を書き込み、編集、削除、表示できます。このアプリは、バックエンドとして Node.js、データベースとして CouchDB、継続的な統合およびデプロイメント ツールとして GitHub Actions を使用します。


なぜこれらを選んだのか?まあ、理由はたくさんありますが、主な理由をいくつか挙げます。


  • Node.js は、さまざまなプラットフォームで実行できる、高速でスケーラブルで使いやすい JavaScript ランタイム環境です。これには、このプロジェクトで使用する最小限の柔軟な Web アプリケーション フレームワークである Express など、Web 開発用のライブラリとフレームワークが多数含まれています。


  • CouchDB は、信頼性が高く、安全で、強力なオープンソースの NoSQL データベース システムです。これは、JSONを使用してデータを保存するドキュメント指向のデータベースです。


  • GitHub Actions は、GitHub リポジトリのワークフローを自動化できる、柔軟で便利な統合ツールです。また、Aptible Deploy アクションなど、ニーズに合わせて使用またはカスタマイズできる事前に構築されたアクションも多数あります。このアクションは、このプロジェクトでアプリを Aptible にデプロイするために使用します。


  • Aptibleは、コンテナ化されたアプリケーションをデプロイおよび管理するためのクラウドベースのプラットフォームであり、簡単なプロビジョニング、スケーリング、および監視機能を提供します。

前提条件

開発を開始する前に、必要なツールとテクノロジーをセットアップすることが不可欠です。


  • Node.js: Node.js がマシンにインストールされていることを確認します。


  • CouchDB: CouchDB がシステムにインストールされ、実行されていることを確認します。


  • Node.js と JavaScript の専門知識: Node.js と JavaScript の基礎をしっかりと理解しています。


  • Docker:マシンに Docker をインストールして実行します。


  • Aptible アカウント: Aptible アカウントを作成し、基本的なアプリケーションのデプロイに慣れてください。


  • Docker Cloud アカウント:アプリケーションをホストするための Docker Cloud アカウントを取得します。

ブログ投稿アプリの開発

1: Node.js プロジェクトをセットアップする

  • ブログ投稿アプリのプロジェクト ディレクトリを作成します。


  • npm を使用して Node.js プロジェクトを初期化します。
 npm init -y


  • バックエンドの基盤として機能する Express.js フレームワークをインストールします。
 npm install express nano

ステップ 2: CouchDB をセットアップする

  • CouchDB がインストールされ、実行されていることを確認してください。 http://127.0.0.1:5984/_utils/にあるブラウザを通じて CouchDB にアクセスできます。


CouchDB ダッシュボード

ステップ 3: Node.js アプリケーションを作成する

  • プロジェクト ディレクトリにblog.jsファイルを作成します。


  • Express を初期化し、CouchDB に接続します。
 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");


  • このコードは、CouchDB データベースを使用してブログ投稿を作成、取得、更新、削除するための API エンドポイントを定義します。


 // 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}`); });


ローカルでテストする:

プロジェクトの機能と堅牢性を確認するには、徹底的なテストが不可欠です。テスト プロセスをガイドするサンプル API ドキュメントを次に示します。

APIドキュメント

ベース URL :

サーバーがローカルのポート 3000 で実行されていると仮定すると、API のベース URL は次のようになります。

 http://localhost:3000

API エンドポイント:

新しいブログ投稿を作成する

  • エンドポイント: POST /posts

  • 説明: 新しいブログ投稿を作成します。

  • リクエスト本文:

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

すべてのブログ投稿を取得

  • エンドポイント: GET /posts

  • 説明: すべてのブログ投稿を取得します。

  • 応答

     [ { "id": "String", "key": "String", "value": { "rev": "String" }, "doc": { "_id": "String", "_rev": "String", "title": "String", "description": "String", "author": "String", "createdAt": "Date", "updatedAt": "Date" } } ]
  •  GET http://localhost:3000/posts

特定のブログ投稿を取得する

  • エンドポイント: GET /posts/:id

  • 説明: ID によって特定のブログ投稿を取得します。

  • パラメーター

    • id : ブログ投稿の ID。
  • 応答

     { "_id": "String", "_rev": "String", "title": "String", "description": "String", "author": "String", "createdAt": "Date", "updatedAt": "Date" }
  •  GET http://localhost:3000/posts/your-post-id

ブログ投稿を更新する

  • エンドポイント: PUT /posts/:id

  • 説明: ID に基づいて特定のブログ投稿を更新します。

  • パラメーター

    • id : ブログ投稿の ID。
  • リクエスト本文:

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

ブログ投稿を削除する

  • エンドポイント: DELETE /posts/:id

  • 説明: ID に基づいて特定のブログ投稿を削除します。

  • パラメーター

    • id : ブログ投稿の ID。
  •  DELETE http://localhost:3000/posts/your-post-id


GETPUT 、およびDELETEリクエストをテストするときは、 your-post-idブログ投稿の実際の ID に置き換えてください。

ステップ 4: Node.js アプリケーションを Docker 化する

Docker Hub アカウントが必要です。まだ作成していない場合は、Docker Hub にサインアップしてください。

ローカル マシンに Docker がインストールされ、実行されていることを確認してください。

Docker化されたアプリをDocker Hubにプッシュする手順:

  • Node.js プロジェクトのルート ディレクトリにDockerfileを作成します
 # 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"]
  • Docker イメージにタグを付ける:ターミナル/コマンド プロンプトを開き、Dockerfile がある Node.js アプリケーションのルート ディレクトリに移動します。


次のコマンドを実行して Docker イメージを構築し、Docker Hub ユーザー名と目的のリポジトリ名でタグ付けします。


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

your-docker-username Docker Hub ユーザー名に置き換え、 blogpost-app目的のリポジトリ名に置き換えます。


次のような同様の応答が返されます。

 [+] 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


  • Docker Hub にログインします。次のコマンドを実行して、Docker Hub アカウントで Docker クライアントを認証します。
 docker login


プロンプトが表示されたら、Docker Hub のユーザー名とパスワードを入力します。

 Authenticating with existing credentials... Login Succeeded


  • Docker イメージを Docker Hub にプッシュする:ログインしたら、次のコマンドを使用して、タグ付けされた Docker イメージを Docker Hub リポジトリにプッシュします。
 docker push your-docker-username/blogpost-app:latest

このコマンドは、指定したリポジトリの下にある Docker Hub にローカル イメージをアップロードします。


  • プッシュを確認する: Web 上の Docker Hub アカウントに移動し、リポジトリに移動して、Docker イメージが正常にプッシュされたことを確認します。

    Docker クラウド ダッシュボード



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

ステップ 5: 適切な導入

このチュートリアルは、Aptible プラットフォームでの環境アプリケーションエンドポイント、データベースのセットアップについての基本を理解していることを前提としています。このチュートリアルではデータベースとして CouchDB を利用し、デプロイメントには Direct Docker を使用します。


  • 次のコマンドを使用して、CLI 経由で Aptible にログインします。
 aptible login


電子メールとパスワードの入力を求められます。成功すると、次のような応答が返されます。

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


  • 次に、次のコマンドを使用してアプリをデプロイします。

構文:

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


コマンドの例を次に示します。

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


次のような応答が返されます。

 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.


  • Aptible Dashboard にアクセスして、デプロイが成功したことを確認します。

  • ダッシュボードの「エンドポイント」タブをクリックし、エンドポイントを保存します。これにより、データベースを公共のインターネットに公開できるようになります。

  • 次の画面で[エンドポイントの追加]をクリックして、新しいエンドポイントを作成します。

結論

この包括的なチュートリアルは、Node.js、CouchDB、および Aptible を使用してブログ投稿アプリケーションを構築、デプロイ、管理するのに役立ちます。


重要なツールとテクノロジーのセットアップ、ブログ投稿アプリケーションのバックエンドの作成、アプリケーションの Docker 化、Docker イメージの Docker Hub へのプッシュ、およびアプリケーションの Aptible へのデプロイの基本を理解しました。


この包括的なチュートリアルを完了し、Aptible を使用したクラウドネイティブ アプリケーション開発への取り組みを完了できたこと、おめでとうございます。