paint-brush
Cách tự động triển khai ứng dụng bài đăng trên blog bằng các hành động GitHub, Node.js, CouchDB và Aptibletừ tác giả@wise4rmgod
3,255 lượt đọc
3,255 lượt đọc

Cách tự động triển khai ứng dụng bài đăng trên blog bằng các hành động GitHub, Node.js, CouchDB và Aptible

từ tác giả Wisdom Nwokocha19m2023/12/04
Read on Terminal Reader

dài quá đọc không nổi

Chào mừng bạn đến với hướng dẫn về tự động triển khai ứng dụng bài đăng trên blog bằng GitHub Actions, Node.js, CouchDB và Thích ứng. Hướng dẫn toàn diện này sẽ hướng dẫn bạn xây dựng, triển khai và quản lý ứng dụng bài đăng trên blog bằng các công cụ và công nghệ ở trên. Nhưng trước tiên, hãy để tôi cung cấp cho bạn tổng quan ngắn gọn về ứng dụng Blogpost, chức năng của nó và các thành phần chính của nó. Ứng dụng Blogpost là một ứng dụng web cho phép người dùng tạo và chia sẻ các bài đăng trên blog. Người dùng có thể viết, chỉnh sửa, xóa và xem bài đăng của người dùng khác. Ứng dụng sử dụng Node.js làm phụ trợ, CouchDB làm cơ sở dữ liệu và GitHub Actions làm công cụ triển khai và tích hợp liên tục.
featured image - Cách tự động triển khai ứng dụng bài đăng trên blog bằng các hành động GitHub, Node.js, CouchDB và Aptible
Wisdom Nwokocha HackerNoon profile picture

Chào mừng bạn đến với hướng dẫn về cách tự động triển khai ứng dụng bài đăng trên blog bằng GitHub Actions, Node.js,

CouchDB và Thích ứng.


Hướng dẫn toàn diện này sẽ hướng dẫn bạn xây dựng, triển khai và quản lý ứng dụng bài đăng trên blog bằng các công cụ và công nghệ ở trên.


Nhưng trước tiên, hãy để tôi cung cấp cho bạn tổng quan ngắn gọn về ứng dụng Blogpost , chức năng của nó và các thành phần chính của nó. Ứng dụng Blogpost là một ứng dụng web cho phép người dùng tạo và chia sẻ các bài đăng trên blog.


Người dùng có thể viết, chỉnh sửa, xóa và xem bài đăng của người dùng khác. Ứng dụng sử dụng Node.js làm phụ trợ, CouchDB làm cơ sở dữ liệu và GitHub Actions làm công cụ triển khai và tích hợp liên tục.


Tại sao tôi chọn những điều này? Vâng, có nhiều lý do, nhưng đây là một số lý do chính:


  • Node.js là môi trường thời gian chạy JavaScript nhanh, có thể mở rộng và dễ sử dụng, có thể chạy trên nhiều nền tảng khác nhau. Nó có nhiều thư viện và framework để phát triển web, chẳng hạn như Express, một framework ứng dụng web tối giản và linh hoạt mà tôi sẽ sử dụng trong dự án này.


  • CouchDB là một hệ thống cơ sở dữ liệu NoSQL mã nguồn mở đáng tin cậy, an toàn và mạnh mẽ. Đây là cơ sở dữ liệu hướng tài liệu sử dụng JSON để lưu trữ dữ liệu.


  • GitHub Actions là một công cụ linh hoạt, tiện lợi và tích hợp cho phép bạn tự động hóa quy trình làm việc cho kho GitHub của mình. Nó cũng có nhiều hành động dựng sẵn mà bạn có thể sử dụng hoặc tùy chỉnh theo nhu cầu của mình, chẳng hạn như hành động Triển khai Aptible mà tôi sẽ sử dụng trong dự án này để triển khai ứng dụng lên Aptible.


  • Apible là một nền tảng dựa trên đám mây để triển khai và quản lý các ứng dụng được đóng gói, cung cấp khả năng cung cấp, mở rộng quy mô và giám sát dễ dàng.

Điều kiện tiên quyết

Trước khi bắt đầu hành trình phát triển, việc thiết lập các công cụ và công nghệ cần thiết là điều cần thiết.


  • Node.js: Đảm bảo Node.js được cài đặt trên máy của bạn.


  • CouchDB: Xác minh rằng CouchDB đã được cài đặt và chạy trên hệ thống của bạn.


  • Chuyên môn về Node.js và JavaScript: Có hiểu biết vững chắc về các nguyên tắc cơ bản của Node.js và JavaScript.


  • Docker: Cài đặt và chạy Docker trên máy của bạn.


  • Tài khoản Aptible: Tạo tài khoản Aptible và làm quen với việc triển khai một ứng dụng cơ bản.


  • Tài khoản Docker Cloud: Nhận tài khoản Docker Cloud để lưu trữ ứng dụng của bạn.

Phát triển ứng dụng Blogpost

1: Thiết lập dự án Node.js của bạn

  • Tạo một thư mục dự án cho ứng dụng bài đăng trên blog của bạn.


  • Khởi tạo dự án Node.js bằng npm:
 npm init -y


  • Cài đặt khung Express.js, khung này sẽ làm nền tảng cho phần phụ trợ:
 npm install express nano

Bước 2: Thiết lập CouchDB

  • Đảm bảo CouchDB đã được cài đặt và chạy. Bạn có thể truy cập CouchDB thông qua trình duyệt của mình tại http://127.0.0.1:5984/_utils/ .


Bảng điều khiển CouchDB

Bước 3: Tạo ứng dụng Node.js của bạn

  • Tạo tệp blog.js trong thư mục dự án của bạn.


  • Khởi tạo Express và kết nối nó với 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");


  • Mã này xác định các điểm cuối API để tạo, truy xuất, cập nhật và xóa các bài đăng trên blog bằng cơ sở dữ liệu CouchDB.


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


Kiểm tra nó cục bộ:

Kiểm tra kỹ lưỡng là rất quan trọng để đảm bảo chức năng và tính mạnh mẽ của dự án của bạn. Đây là tài liệu API mẫu để hướng dẫn quá trình thử nghiệm của bạn:

Tài liệu API

URL cơ sở :

Giả sử máy chủ của bạn đang chạy cục bộ tại cổng 3000, URL cơ sở cho API của bạn sẽ là:

 http://localhost:3000

Điểm cuối API:

Tạo một bài đăng blog mới

  • Điểm cuối : POST /posts

  • Mô tả : Tạo một bài đăng blog mới.

  • Nội dung yêu cầu :

     { "title": "String", "description": "String", "author": "String" }
  • Ví dụ :

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

Nhận tất cả bài viết trên blog

  • Điểm cuối : GET /posts

  • Mô tả : Truy xuất tất cả các bài viết trên blog.

  • Phản ứng :

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

     GET http://localhost:3000/posts

Nhận một bài đăng blog cụ thể

  • Điểm cuối : GET /posts/:id

  • Mô tả : Truy xuất một bài đăng blog cụ thể theo ID của nó.

  • Thông số :

    • id : ID của bài đăng trên blog.
  • Phản ứng :

     { "_id": "String", "_rev": "String", "title": "String", "description": "String", "author": "String", "createdAt": "Date", "updatedAt": "Date" }
  • Ví dụ :

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

Cập nhật một bài viết trên blog

  • Điểm cuối : PUT /posts/:id

  • Mô tả : Cập nhật một bài đăng blog cụ thể theo ID của nó.

  • Thông số :

    • id : ID của bài đăng trên blog.
  • Nội dung yêu cầu :

     { "title": "String", "description": "String" }
  • Ví dụ :

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

Xóa một bài đăng trên blog

  • Điểm cuối : DELETE /posts/:id

  • Mô tả : Xóa một bài đăng blog cụ thể theo ID của nó.

  • Thông số :

    • id : ID của bài đăng trên blog.
  • Ví dụ :

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


Vui lòng thay thế your-post-id bằng ID thực của bài đăng trên blog khi kiểm tra các yêu cầu GET , PUTDELETE .

Bước 4: Dockerize ứng dụng Node.js của bạn

Bạn cần có tài khoản Docker Hub. Nếu bạn chưa tạo tài khoản, hãy đăng ký tại Docker Hub.

Đảm bảo bạn đã cài đặt và chạy Docker trên máy cục bộ của mình.

Các bước để đẩy ứng dụng Dockerized lên Docker Hub:

  • Tạo Dockerfile trong thư mục gốc của dự án Node.js của bạn.
 # 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"]
  • Gắn thẻ hình ảnh Docker của bạn: Mở terminal/dấu nhắc lệnh và điều hướng đến thư mục gốc của ứng dụng Node.js, nơi chứa Dockerfile của bạn.


Chạy lệnh sau để xây dựng hình ảnh Docker của bạn và gắn thẻ nó với tên người dùng Docker Hub và tên kho lưu trữ mong muốn:


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

Thay thế your-docker-username bằng tên người dùng Docker Hub và blogpost-app bằng tên kho lưu trữ mà bạn mong muốn.


Bạn sẽ nhận được phản hồi tương tự như thế này:

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


  • Đăng nhập vào Docker Hub: Xác thực ứng dụng khách Docker bằng tài khoản Docker Hub của bạn bằng cách thực hiện lệnh sau:
 docker login


Nhập tên người dùng và mật khẩu Docker Hub của bạn khi được nhắc.

 Authenticating with existing credentials... Login Succeeded


  • Đẩy hình ảnh Docker vào Docker Hub: Sau khi đăng nhập, hãy đẩy hình ảnh Docker được gắn thẻ của bạn vào kho lưu trữ Docker Hub bằng lệnh sau:
 docker push your-docker-username/blogpost-app:latest

Lệnh này tải hình ảnh cục bộ của bạn lên Docker Hub trong kho lưu trữ được chỉ định của bạn.


  • Xác minh Đẩy: Truy cập tài khoản Docker Hub của bạn trên web và điều hướng đến kho lưu trữ của bạn để xác nhận rằng hình ảnh Docker của bạn đã được đẩy thành công.

    Bảng điều khiển đám mây Docker



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

Bước 5: Triển khai thích hợp

Hướng dẫn này giả định rằng bạn có hiểu biết cơ bản về việc thiết lập môi trường , ứng dụng , điểm cuốicơ sở dữ liệu trên nền tảng Apible. Hướng dẫn sử dụng CouchDB làm cơ sở dữ liệu và sử dụng Direct Docker để triển khai.


  • Đăng nhập vào Aptible qua CLI bằng lệnh sau:
 aptible login


Bạn sẽ được nhắc nhập email và mật khẩu của bạn. Nếu thành công, bạn sẽ nhận được phản hồi tương tự như sau:

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


  • Bây giờ, hãy triển khai ứng dụng của bạn bằng lệnh sau:

Cú pháp:

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


Đây là một lệnh ví dụ:

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


Bạn sẽ nhận được phản hồi tương tự như sau:

 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.


  • Truy cập Bảng thông tin thích hợp để xác nhận rằng quá trình triển khai đã thành công.

  • Nhấp vào tab Điểm cuối trong bảng điều khiển và lưu điểm cuối. Điều này sẽ cho phép bạn hiển thị cơ sở dữ liệu của mình với internet công cộng.

  • Nhấp vào Thêm điểm cuối trong màn hình tiếp theo để tạo điểm cuối mới.

Phần kết luận

Hướng dẫn toàn diện này sẽ giúp bạn xây dựng, triển khai và quản lý ứng dụng đăng bài blog bằng Node.js, CouchDB và Aptible.


Bạn đã nắm được các nguyên tắc cơ bản về thiết lập các công cụ và công nghệ thiết yếu, tạo phần phụ trợ của ứng dụng bài đăng trên blog, cập nhật ứng dụng, đẩy hình ảnh Docker lên Docker Hub và triển khai ứng dụng lên Aptible.


Chúc mừng bạn đã hoàn thành hướng dẫn toàn diện này và hành trình phát triển ứng dụng gốc trên nền tảng đám mây bằng Aptible!