Bun Uygulaması Nasıl Dağıtılır?

How to Deploy an Bun Application_
How to Deploy an Bun Application_

Bun, hızlı, hafif ve kullanımı kolay olacak şekilde tasarlanmış bir JavaScript çalışma zamanıdır. Zig dilinde yazılmıştır ve Safari’ye güç veren JavaScript motoru JavaScriptCore tarafından desteklenmektedir.

Bun, Node.js uyumlu yerleşik bir paket yöneticisi, test çalıştırıcısı ve paketleyiciye sahiptir. Ayrıca, HTTP sunucusu başlatmak ve dosya yazmak gibi yaygın görevleri gerçekleştirmek için yüksek düzeyde optimize edilmiş minimal bir API seti sağlar.

Bu makalede, Bun ile basit bir web API’si oluşturacak ve Back4app konteynerlerini kullanarak Back4app üzerinde dağıtacaksınız. Bir Bun uygulamasını nasıl barındıracağınızı öğrenmek için okumaya devam edin.

Bun Avantajları

Bun’ın ilk duyurusundan bu yana, Eylül 2023’teki V1 sürümünden önce bile, Bun JavaScript topluluğunda giderek daha popüler hale geldi. İşte nedenlerden bazıları.

Hız

Bun, sistem programlama için tasarlanmış, performans, güvenlik ve okunabilirliğe odaklanan düşük seviyeli bir programlama dili olan Zig ile yazılmıştır. C & C++’a modern bir alternatif olması amaçlanmıştır.

Ayrıca, Chrome’un V8 JavaScript motorunu kullanan Node.js ve Deno’nun aksine, Safari’ye güç veren JavaScriptCore motorunu kullanır.

Zig ve JavaScript Core’a ek olarak Bun, JavaScript için optimize edilmiş özel bir bellek ayırıcı ve kodu yürütülürken optimize etmek için tam zamanında (JIT) derleyici gibi bir dizi başka teknik de kullanır.

Genel olarak, Zig, JavaScript Core ve diğer optimizasyonların birleşimi Bun’u diğer çalışma zamanlarına kıyasla çok hızlı bir JavaScript çalışma zamanı haline getirmektedir.

Node.js Uyumluluğu

Bun, Node.js’nin yerine geçecek şekilde tasarlanmıştır ve bu nedenle tüm Node.js API’leri ile uyumludur.

Ayrıca kripto, fs, path vb. gibi tüm yerleşik Node.js modüllerine sahiptir. Kullanılabilir ve kullanılamayan Node.js modüllerini Bun.js dokümantasyonundan kontrol edebilirsiniz.

Ayrıca Bun, npm uyumlu bir paket yöneticisidir. Bu, Bun kullanarak Node.js paketlerini yüklemek ve yönetmek için Bun’u kullanabileceğiniz anlamına gelir.

Kutudan Çıkan TypeScript Desteği

Bun, TypeScript için yerel ve sorunsuz bir desteğe sahiptir, bu da projelerinizde TypeScript’i tercih ediyorsanız veya gerektiriyorsa mükemmel bir seçimdir.

JavaScript’in genişletilmiş ve statik olarak yazılmış bir sürümü olan TypeScript, JavaScript geliştirmeyi geliştirmek için gelişmiş dil özellikleri ve statik yazım sunar.

Bun ile ek yapılandırmaya gerek yoktur ve TypeScript işlevselliğini etkinleştirmek için ekstra kurulum veya derleme prosedürlerine gerek yoktur.

Bun’ın Sınırlamaları

Bun, avantajlarına rağmen projenizde kullanmadan önce göz önünde bulundurmanız gereken bazı sınırlamalara sahiptir.

Sınırlı Kaynaklar

Bun hala nispeten yenidir, bu da topluluğun şu anda küçük olduğu anlamına gelir. Bun-js’ye özgü geliştirmeyi kapsayan çok fazla kaynak yoktur, bu da çalışma zamanını nasıl kullanacağınızı bulmakta zorlanabileceğiniz anlamına gelir.

Bununla birlikte, Bun dokümantasyonu kapsamlıdır ve değerli bir referans noktası olarak hizmet vermektedir. Zorluklarla karşılaşmanız durumunda, Discord kanalları aracılığıyla yardım isteme seçeneği de vardır.

Windows için Destek

Bun şu anda Windows işletim sistemi için sınırlı destek sağlamaktadır. Yazım sırasında, Windows’ta yalnızca çalışma zamanı desteklenmektedir.

Test koşucusu, paket yöneticisi ve paketleyici hala geliştirilme aşamasındadır ve bu nedenle Windows’ta çalışmaz. Bun uygulamasının nasıl barındırılacağı hakkında daha fazla bilgi edinmek için okumaya devam edin.

Bun Uygulaması Oluşturma

Bun’ı kullanabilmeniz için önce yüklemeniz gerekir.

Bun’ı macOS, WSL ve Linux’a yüklemek için aşağıdaki komutu çalıştırın:

curl -fsSL https://bun.sh/install | bash

Geliştirme Ortamınızı Kurma

Yeni bir Bun projesi oluşturmak için aşağıdaki komutu çalıştırın:

bun init

Yukarıdaki komutu çalıştırdığınızda proje dizininizde boş bir Bun projesi başlatılır.

Eğitim için, en hızlı Bun HTTP sunucu çerçevelerinden biri olan Elysia ile basit bir API oluşturacaksınız (Karşılaştırmalarına göre).

Bu proje için gerekli olan Elysia ve diğer bağımlılıkları yüklemek için aşağıdaki komutu çalıştırın:

bun add elysia knex dotenv pg

Komutta yüklü olan diğer bağımlılıklar şunlardır:

  • Knex, bir sorgu oluşturucu. Bu bağımlılığı veritabanınızla etkileşimi basitleştirmek için kullanacaksınız.
  • dotenv, bu paket projenizdeki çevresel değişkenleri yönetmenize yardımcı olur.
  • pg (Postgres veritabanı sürücüsü) postgres veritabanınızla etkileşim için.

Ardından, knex’i projenizde çalıştırarak başlatın:

knex init

Yukarıdaki komut bir knexfile.js dosyası oluşturur. Bu dosya veritabanınız için yapılandırma seçenekleri içerir.

Dosyadaki kodu aşağıdaki kod bloğu ile değiştirin:

require("dotenv").config();

export const development = {
  client: "pg",
  connection: process.env.DATABASE_URL,
  migrations: {
    directory: "./db/migrations",
  }
};

Ardından, proje kök dizininizde bir db.js dosyası oluşturun ve aşağıdaki kod bloğunu buna ekleyin.

const knex = require("knex");
const knexFile = require("./knexfile.js");

const environment = process.env.NODE_ENV || "development";

export default knex(knexFile[environment]);

Ardından, bir .env dosyası oluşturun ve veritabanı bağlantı ayrıntılarınızı veya URI’nızı dosyaya ekleyin.

Örneğin:

DATABASE_URL = <YOUR_DATABASE_URI>

“YOUR_DATABASE_URI” ifadesini veritabanı URL’niz ile değiştirin.

Not: Özel bilgileri sürüm kontrolüne işlemediğinizden emin olmak için .env dosyanızı .gitignore dosyanıza eklediğinizden emin olun.

Veritabanı Modelinizi Oluşturma

Knex kullanarak veritabanı modelinizi oluşturmak için, bir geçiş dosyası oluşturacak ve Knex kullanarak bir SQL oluşturma komutu yazacaksınız.

İlk geçişinizi oluşturmak için aşağıdaki komutu çalıştırın:

knex migrate:make blog

Ardından, oluşturulan geçiş dosyasındaki kodu aşağıdaki kod bloğu ile değiştirin:

/**
 * @param { import("knex").Knex } knex
 * @returns { Promise<void> }
 */
export function up (knex) {
  return knex.schema.createTable("blog", (table) => {
    table.increments("id").primary();
    table.string("title").notNullable();
    table.string("content").notNullable();
    table.string("author").notNullable();
    table.timestamp("created_at").defaultTo(knex.fn.now());
  });
}

/**
 * @param { import("knex").Knex } knex
 * @returns { Promise<void> }
 */
export function down (knex) {
  return knex.schema.dropTable("blog");
}

Son olarak, geçiş dosyanızı çalıştırmak için aşağıdaki kod bloğunu çalıştırın:

knex migrate:latest

Yukarıdaki komut, daha önce oluşturduğunuz geçiş dosyasını çalıştırır ve böylece veritabanınızda bir Blog tablosu oluşturur.

Bun-Elysia Sunucusu Oluşturma

Bu adımda basit bir API sunucusu oluşturacaksınız.

index.ts dosyanızı açın ve aşağıdaki kod bloğunu ekleyin:

//index.ts
const { Elysia } = require("elysia");
let db = require("./db");

db = db.default;

const app = new Elysia();

Aşağıdaki kod bloğunda, Elysia’yı içe aktardınız ve Elysia çerçevesinin (app) bir örneğini oluşturdunuz.

Rota İşleyicileri Oluşturma

Ardından, uygulamanız için rota işleyicileri oluşturacaksınız. Oluşturacağınız işleyici aşağıdaki rotalar için olacaktır:

  • POST /posts/create-new-post
  • GET /posts
  • GET /posts/:id
  • PATCH /posts/:id/update-post
  • DELETE /posts/:id/delete-post

“/posts/create-new-post” işleyicisini oluşturmak için aşağıdaki kod bloğunu index.ts dosyanıza ekleyin:

app.post("/posts/create-new-post", async (context) => {
  try {
    //Extract the title, content and author from the request body
    const { title, content, author } = context.body;

    //Insert the post into the database
    const post = await db("blog").insert({
      title,
      content,
      author,
    });

    //Send response to the client
    return new Response(JSON.stringify(post));
  } catch (error: any) {
    //Send error to the client
    return new Response(error.message, { status: 500 });
  }
});

Yukarıdaki kod bloğu, veritabanınıza yeni gönderiler ekleyen uç noktanız için bir rota işleyicisidir.

Tüm “/posts” gönderilerinizi getiren işleyiciyi oluşturmak için aşağıdaki kod bloğunu index.ts dosyanıza ekleyin:

app.get("/posts", async (context) => {
  try {
    //Get all posts from the database
    const posts = await db.select("*").from("blog");

    //Send response to the client
    return new Response(JSON.stringify(posts));
  } catch (error: any) {
    //Send error to the client
    return new Response(error.message, { status: 500 });
  }
});

Tek bir gönderiyi “/posts/:id” kimliğine göre getiren işleyiciyi oluşturmak için aşağıdaki kod bloğunu index.ts dosyanıza ekleyin:

app.get("/posts/:id", async (context) => {
  //Extract the id from the request params
  const { id } = context.params;

  //Get the post from the database
  const post = await db("blog").where({ id });

  //If the post is not found, send a 404 response
  if (post.length === 0) {
    return new Response("Post not found", { status: 404 });
  }

  //Send response to the client
  return new Response(JSON.stringify(post));
});

Tek bir gönderiyi “/posts/:id/update-post” kimliğine göre yükteki verilerle güncelleyen işleyiciyi oluşturmak için aşağıdaki kod bloğunu index.ts dosyanıza ekleyin:

app.patch("/posts/:id/update-post", async (context) => {
  //Extract the id from the request params
  const { id } = context.params;

  //Extract the title and content from the request body
  const { title, content } = context.body;

  //Update the post in the database
  const post = await db("blog").where({ id }).update(
    {
      title,
      content,
    },
    ["id", "title", "content"]
  );

  //Send response to the client
  return new Response(JSON.stringify(post));
});

Tek bir gönderiyi “/posts/:id/delete-post” kimliğine göre silen işleyiciyi oluşturmak için aşağıdaki kod bloğunu index.ts dosyanıza ekleyin:

app.delete("/posts/:id/delete-post", async (context) => {
  //Extract the id from the request params
  const { id } = context.params;

  //Delete the post from the database
  const post = await db("blog").where({ id }).del();

  //Send response to the client
  return new Response(JSON.stringify(post));
});

Son olarak, uygulamanızın PORT’unu ayarlamak için aşağıdaki kod bloğunu ekleyin.

app.listen(3000, () => {
  console.log("Server running on port 3000");
});

Uygulamanızı başlatmak için aşağıdaki komutu çalıştırın:

bun --watch index.ts

Back4app Konteynerlerinde Bun Uygulaması Dağıtma

Bun uygulamanızı dağıtmak birkaç adım gerektirir.

Adım 1: Bir Docker dosyası yazın

Bir Dockerfile oluşturmak için aşağıdaki komutu terminalinizde çalıştırın.

touch Dockerfile

Yukarıdaki komutu çalıştırmak, projenizin kök dizininde bir Dockerfile oluşturur.

Ardından, Dockerfile’ınızı açın ve aşağıdaki kod bloğunu ekleyin:

FROM oven/bun

WORKDIR /app

COPY package.json .
COPY bun.lockb .

RUN bun install

COPY . .

EXPOSE 3000

CMD ["bun", "index.ts"]

Yukarıdaki Docker dosyasında, ilk satır olan FROM oven/bun, kullanılacak temel görüntüyü belirtir. Bu imaj, Bun çalışma zamanını ve tüm bağımlılıklarını içeren önceden oluşturulmuş bir imajdır.

Bir sonraki satır olan WORKDIR /app, görüntü için çalışma dizinini ayarlar. Bu, uygulama kodunun kopyalanacağı ve çalıştırılacağı dizindir.

Aşağıdaki iki satır, COPY package.json . ve COPY bun.lockb ., package.json ve bun.lockb dosyalarını geçerli dizinden görüntüye kopyalar. Bu dosyalar Bun çalışma zamanının uygulamanın bağımlılıklarını yüklemesi için gereklidir.

Bir sonraki satır olan RUN bun install, Bun çalışma zamanını kullanarak uygulamanın bağımlılıklarını yükler.

Bir sonraki satır olan COPY ..., geçerli dizinin tamamını görüntüye kopyalar. Bu, uygulama kodunu ve diğer gerekli dosyaları içerir.

Bir sonraki satır olan EXPOSE 3000, konteynerden 3000 numaralı portu dış dünyaya açar. Bu, uygulamanın dinleyeceği bağlantı noktasıdır.

Son satır olan CMD ["bun", "index.ts"], konteyner başlatıldığında çalıştırılacak komutu belirtir. Bu komut Bun çalışma zamanını başlatacak ve uygulamanın index.ts dosyasını çalıştıracaktır.

Son olarak, kodunuzu GitHub‘a gönderin.

Adım 2: Bir Back4app Uygulaması Oluşturun

Bun uygulamasını barındırmak için bir sonraki adım Back4App’ta yeni bir uygulama oluşturmaktır. Öncelikle, Back4App hesabınızda oturum açın veya henüz bir hesabınız yoksa kaydolun. Giriş yaptıktan sonra kendinizi Back4App kontrol panelinde bulacaksınız.

“YENİ UYGULAMA” düğmesine tıklayın ve“Hizmet Olarak Konteynerler” seçeneğini seçin.

Back4app BaaS vs CaaS

Bun uygulamasını barındırmak için bir sonraki adım olarak GitHub hesabınızı Back4app hesabınıza bağlayın. Hesabınızı bağlamak, Back4app’in hesabınızdaki depolara erişmesini sağlar.

Hesabınızdaki tüm depolara veya belirli depolara erişim izni vermeye karar verebilirsiniz. Dağıtmak istediğiniz uygulamayı, bu durumda bu eğitimde oluşturduğunuz uygulamayı seçin ve Seç‘e tıklayın.

Yeni uygulama back4app

Seç düğmesine tıkladıktan sonra, uygulamanızla ilgili PORT ve ortam değişkenleri gibi ayrıntıları dolduracağınız bir yapılandırma sayfasına yönlendirileceksiniz.

Ayrıntıları doldurduktan sonra Uygulama Oluştur düğmesine tıklayın. Bu, dağıtım sürecini başlatır. Dağıtımınız başarılı olmalı ve uygulamanıza erişmek için bir URL alacaksınız, ancak başarısız olursa, Dockerfile’ınızla ilgili sorunları çözmek için Back4app ChatGPT entegrasyonundan yararlanabilirsiniz.

Alternatif olarak, Back4app’in ayrıntılı günlüklerini ve sorun giderme kılavuzunu kullanarak dağıtım hatalarınızı manuel olarak giderebilirsiniz.

Sonuç

Bu makalede Bun JavaScript çalışma zamanını, avantajlarını ve belirgin sınırlamalarını keşfettiniz. Ayrıca Elysia, Knex ve PostgreSQL kullanarak bir Bun uygulamasının nasıl oluşturulacağını keşfettiniz.

Son olarak, Back4app konteynerlerini ve Bun uygulamalarınızı platformda nasıl dağıtacağınızı keşfettiniz.

Bun’u kullanırken, henüz ilk aşamalarında olduğunu ve gelecekte bazı büyük değişiklikler getirebileceğini unutmamak önemlidir.

SSS

Bun Nedir?

Bun, hızlı ve verimli olacak şekilde tasarlanmış bir JavaScript çalışma zamanıdır. JavaScriptCore motorunun üzerine inşa edilmiştir ve daha hızlı hale getirmek için bir dizi optimizasyon (düşük seviyeli dil Zig’i kullanmanın avantajları) kullanır.

Bir Bun Uygulaması Nasıl Dağıtılır?

– Bir Bun uygulaması oluşturun.
– Bir Dockerfile yazın.
– Bun uygulamanızı GitHub’a gönderin.
– Bir Back4app hesabı açın veya mevcut hesabınızda oturum açın.
– Back4app’te yeni bir “CaaS” uygulaması oluşturun.
– Back4app’e dağıtmak istediğiniz uygulamaya erişim izni verin.
– Uygulamayı seçin ve yapılandırma ayrıntılarını doldurun.
– Dağıt’a tıklayın.


Leave a reply

Your email address will not be published.