paint-brush
GitHub Eylemleri, Node.js, CouchDB ve Aptible ile Blog Gönderisi Uygulama Dağıtımını Otomatikleştirmeile@wise4rmgod
3,259 okumalar
3,259 okumalar

GitHub Eylemleri, Node.js, CouchDB ve Aptible ile Blog Gönderisi Uygulama Dağıtımını Otomatikleştirme

ile Wisdom Nwokocha19m2023/12/04
Read on Terminal Reader

Çok uzun; Okumak

GitHub Actions, Node.js'yi kullanarak blog yazısı uygulama dağıtımını otomatikleştirmeye ilişkin kılavuza hoş geldiniz. CouchDB ve Aptible. Bu kapsamlı eğitim, yukarıdaki araçları ve teknolojileri kullanarak bir blog yazısı uygulaması oluşturma, dağıtma ve yönetme konusunda size rehberlik edecektir. Ancak önce size Blogpost uygulaması, ne yaptığı ve ana bileşenleri hakkında kısa bir genel bakış sunayım. Blogpost uygulaması, kullanıcıların blog gönderileri oluşturmasına ve paylaşmasına olanak tanıyan bir web uygulamasıdır. Kullanıcılar diğer kullanıcıların gönderilerini yazabilir, düzenleyebilir, silebilir ve görüntüleyebilir. Uygulama, arka uç olarak Node.js'yi, veritabanı olarak CouchDB'yi ve sürekli entegrasyon ve dağıtım aracı olarak GitHub Actions'ı kullanıyor.
featured image - GitHub Eylemleri, Node.js, CouchDB ve Aptible ile Blog Gönderisi Uygulama Dağıtımını Otomatikleştirme
Wisdom Nwokocha HackerNoon profile picture

GitHub Actions, Node.js'yi kullanarak blog yazısı uygulaması dağıtımını otomatikleştirmeye ilişkin kılavuza hoş geldiniz.

CouchDB ve Aptible.


Bu kapsamlı eğitim, yukarıdaki araçları ve teknolojileri kullanarak bir blog yazısı uygulaması oluşturma, dağıtma ve yönetme konusunda size rehberlik edecektir.


Ancak önce size Blogpost uygulaması, ne yaptığı ve ana bileşenleri hakkında kısa bir genel bakış sunayım. Blogpost uygulaması, kullanıcıların blog gönderileri oluşturmasına ve paylaşmasına olanak tanıyan bir web uygulamasıdır.


Kullanıcılar diğer kullanıcıların gönderilerini yazabilir, düzenleyebilir, silebilir ve görüntüleyebilir. Uygulama, arka uç olarak Node.js'yi, veritabanı olarak CouchDB'yi ve sürekli entegrasyon ve dağıtım aracı olarak GitHub Actions'ı kullanıyor.


Neden bunları seçtim? Aslında pek çok neden var, ama işte en önemlilerinden bazıları:


  • Node.js, çeşitli platformlarda çalışabilen hızlı, ölçeklenebilir ve kullanımı kolay bir JavaScript çalışma zamanı ortamıdır. Bu projede kullanacağım minimalist ve esnek bir web uygulama çerçevesi olan Express gibi web geliştirme için birçok kütüphane ve çerçeveye sahiptir.


  • CouchDB güvenilir, emniyetli ve güçlü, açık kaynaklı bir NoSQL veritabanı sistemidir. Verileri depolamak için JSON kullanan belge odaklı bir veritabanıdır.


  • GitHub Actions, GitHub depolarınız için iş akışlarını otomatikleştirmenize olanak tanıyan esnek, kullanışlı ve entegre bir araçtır. Ayrıca, uygulamayı Aptible'a dağıtmak için bu projede kullanacağım Aptible Deploy eylemi gibi, ihtiyaçlarınıza göre kullanabileceğiniz veya özelleştirebileceğiniz önceden oluşturulmuş birçok eylem de vardır.


  • Aptible , konteynerli uygulamaları dağıtmak ve yönetmek için kolay provizyon, ölçeklendirme ve izleme yetenekleri sağlayan bulut tabanlı bir platformdur.

Önkoşullar

Geliştirme yolculuğuna başlamadan önce gerekli araç ve teknolojilerin kurulması çok önemlidir.


  • Node.js: Makinenizde Node.js'nin kurulu olduğundan emin olun.


  • CouchDB: CouchDB'nin sisteminizde kurulu ve çalıştığını doğrulayın.


  • Node.js ve JavaScript Uzmanlığı: Node.js ve JavaScript temelleri hakkında sağlam bir anlayışa sahip olun.


  • Docker: Makinenize Docker'ı kurun ve çalıştırın.


  • Uygun Hesap: Uygun bir hesap oluşturun ve temel bir uygulamayı dağıtmaya alışın.


  • Docker Bulut Hesabı: Uygulamalarınızı barındırmak için bir Docker Bulut hesabı edinin.

Blogpost Uygulamasını Geliştirme

1: Node.js Projenizi Kurun

  • Blog yazısı uygulamanız için bir proje dizini oluşturun.


  • Npm kullanarak bir Node.js projesini başlatın:
 npm init -y


  • Arka ucun temelini oluşturacak Express.js çerçevesini yükleyin:
 npm install express nano

Adım 2: CouchDB'yi Kurun

  • CouchDB'nin kurulu ve çalışır durumda olduğundan emin olun. CouchDB'ye tarayıcınız aracılığıyla http://127.0.0.1:5984/_utils/ adresinden erişebilirsiniz.


CouchDB kontrol paneli

3. Adım: Node.js Uygulamanızı Oluşturun

  • Proje dizininizde bir blog.js dosyası oluşturun.


  • Express'i başlatın ve CouchDB'ye bağlayın:
 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");


  • Bu kod, bir CouchDB veritabanını kullanarak blog gönderilerini oluşturmaya, almaya, güncellemeye ve silmeye yönelik API uç noktalarını tanımlar.


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


Yerel Olarak Test Ediyoruz:

Projenizin işlevselliğini ve sağlamlığını sağlamak için kapsamlı testler çok önemlidir. Test sürecinize rehberlik edecek örnek bir API belgesini burada bulabilirsiniz:

API Dokümantasyonu

Temel URL :

Sunucunuzun yerel olarak 3000 numaralı bağlantı noktasında çalıştığını varsayarsak, API'nizin temel URL'si şöyle olacaktır:

 http://localhost:3000

API Uç Noktaları:

Yeni Bir Blog Yazısı Oluşturun

  • Bitiş noktası : POST /posts

  • Açıklama : Yeni bir blog yazısı oluşturur.

  • Talep Gövdesi :

     { "title": "String", "description": "String", "author": "String" }
  • Örnek :

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

Tüm Blog Yazılarını Al

  • Uç nokta : GET /posts

  • Açıklama : Tüm blog gönderilerini alır.

  • Cevap :

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

     GET http://localhost:3000/posts

Belirli bir Blog Gönderisi Alın

  • Uç nokta : GET /posts/:id

  • Açıklama : Belirli bir blog gönderisini kimliğine göre alır.

  • Parametreler :

    • id : Blog yazısının kimliği.
  • Cevap :

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

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

Blog Gönderisini Güncelleme

  • Uç nokta : PUT /posts/:id

  • Açıklama : Belirli bir blog gönderisini kimliğine göre günceller.

  • Parametreler :

    • id : Blog yazısının kimliği.
  • Talep Gövdesi :

     { "title": "String", "description": "String" }
  • Örnek :

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

Blog Gönderisini Silme

  • Bitiş noktası : DELETE /posts/:id

  • Açıklama : Belirli bir blog gönderisini kimliğine göre siler.

  • Parametreler :

    • id : Blog yazısının kimliği.
  • Örnek :

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


GET , PUT ve DELETE isteklerini test ederken lütfen your-post-id blog gönderisinin gerçek kimliğiyle değiştirin.

Adım 4: Node.js Uygulamanızı Dockerleştirin

Bir Docker Hub hesabınızın olması gerekir. Henüz bir tane oluşturmadıysanız Docker Hub'a kaydolun.

Yerel makinenizde Docker'ın yüklü olduğundan ve çalıştığından emin olun.

Dockerlaştırılmış Uygulamayı Docker Hub'a Gönderme Adımları:

  • Node.js projenizin kök dizininde bir Dockerfile oluşturun .
 # 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 görüntünüzü etiketleyin: Terminal/komut isteminizi açın ve Docker dosyanızın bulunduğu Node.js uygulamanızın kök dizinine gidin.


Docker görüntünüzü oluşturmak için aşağıdaki komutu çalıştırın ve onu Docker Hub kullanıcı adınız ve istediğiniz depo adı ile etiketleyin:


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

your-docker-username Docker Hub kullanıcı adınız ile ve blogpost-app istediğiniz depo adı ile değiştirin.


Buna benzer bir yanıt alacaksınız:

 [+] 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'da oturum açın: Aşağıdaki komutu yürüterek Docker istemcinizin kimliğini Docker Hub hesabınızla doğrulayın:
 docker login


İstendiğinde Docker Hub kullanıcı adınızı ve şifrenizi girin.

 Authenticating with existing credentials... Login Succeeded


  • Docker görüntüsünü Docker Hub'a gönderin: Oturum açtıktan sonra, aşağıdaki komutu kullanarak etiketli Docker görüntünüzü Docker Hub deponuza gönderin:
 docker push your-docker-username/blogpost-app:latest

Bu komut, yerel görüntünüzü belirttiğiniz deponun altındaki Docker Hub'a yükler.


  • Push'u Doğrulayın: Web'deki Docker Hub hesabınıza gidin ve Docker görüntünüzün başarıyla aktarıldığını doğrulamak için deponuza gidin.

    Docker bulut kontrol paneli



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

Adım 5: Uygun Dağıtım

Bu eğitimde, Aptible platformunda bir ortam , uygulama , uç nokta ve veritabanı kurma konusunda temel bilgilere sahip olduğunuz varsayılmaktadır. Eğitimde veritabanı olarak CouchDB kullanılır ve dağıtım için Direct Docker kullanılır.


  • Aşağıdaki komutu kullanarak CLI aracılığıyla Aptible'da oturum açın:
 aptible login


E-postanızı ve şifrenizi girmeniz istenecektir. Başarılı olursanız, buna benzer bir yanıt alacaksınız:

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


  • Şimdi aşağıdaki komutu kullanarak uygulamanızı dağıtın:

Sözdizimi:

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


İşte bir örnek komut:

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


Aşağıdakine benzer bir yanıt alacaksınız:

 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.


  • Dağıtımın başarılı olduğunu doğrulamak için Uygun Kontrol Panelini ziyaret edin.

  • Kontrol panelindeki Nokta sekmesine tıklayın ve uç noktayı kaydedin. Bu, veritabanınızı genel internete açmanıza olanak tanır.

  • Yeni bir uç nokta oluşturmak için sonraki ekranda Uç Nokta Ekle'ye tıklayın.

Çözüm

Bu kapsamlı eğitim, Node.js, CouchDB ve Aptible ile bir blog yazısı uygulaması oluşturmanıza, dağıtmanıza ve yönetmenize yardımcı olacaktır.


Temel araçları ve teknolojileri kurmanın, blog yazısı uygulamasının arka ucunu oluşturmanın, uygulamayı yerleştirmenin, Docker görüntüsünü Docker Hub'a göndermenin ve uygulamayı Aptible'a dağıtmanın temellerini anladınız.


Bu kapsamlı eğitimi tamamladığınız ve Aptible'ı kullanarak bulutta yerel uygulama geliştirme yolculuğunuzu tamamladığınız için tebrikler!