PAS7 Studio
До всіх статей

Як налаштувати Bun.js сервер із Fastify: від нуля до продакшену

Практичний посібник зі створення сервера на Bun.js із Fastify, готового до продакшену. Встановіть Bun, створіть HTTP-сервер, додайте маршрути TypeScript, обробіть валідацію, підключіть базу даних і розгорніть — із бенчмарками, що показують різницю продуктивності між Bun + Fastify та Node.js + Fastify.

12 квіт. 2026 р.· 16 хв читання· Технології
Кому підійдеБекенд-розробникиFull-stack інженериТехнічні ліди, що оцінюють рантаймиDevOps інженери
Блискуча оранжева емблема оболонки Bun зливається з блакитною блискавкою Fastify на темному вугільному фоні, символізуючи стек технологій Bun + Fastify
Гайд / СеріяОглядова стаття

Посібник з налаштування Bun сервера 2026

Двочастинний посібник зі створення продакшен-готових серверів на Bun. Частина 1 охоплює основи рантайму Bun та налаштування Fastify. Частина 2 — NestJS на Bun та оптимізацію продуктивності.

Це практичний посібник від нуля до працюючого сервера. Попередній досвід з Bun не потрібен.

Чим Bun відрізняється від Node.js на рівні рантайму (рушій, інструменти, швидкість запуску)
Покрокове встановлення Bun та створення проєкту з TypeScript
Два підходи до сервера: Bun.serve() ( нативний) та fastify.listen() (фреймворк)
Визначення маршрутів, валідація JSON Schema та обробка помилок з Fastify на Bun
Інтеграція бази даних з PostgreSQL та вбудованим SQLite Bun (bun:sqlite)
Продакшен-розгортання з Docker та бенчмарки продуктивності порівняно з Node.js

Якщо ви створювали сервери на Node.js, більшість ваших знань переноситься безпосередньо. Найважливіші відмінності — архітектура рушія, вбудовані інструменти та обробка TypeScript.

Comparison pointBun 1.3Node.js 22/23
JavaScript engineJavaScriptCore (Safari/WebKit)V8 (Chrome/Chromium)
Written inZig + C++C++ + JavaScript
TypeScriptNative (zero config, no transpile step) [1]Experimental via --experimental-strip-types (Node 23) [2]
Package managerBuilt-in (bun install) — 10-30x faster than npm [1]npm, yarn, pnpm (external)
BundlerBuilt-in (bun build) — Webpack-class features [1]None built-in (requires Webpack, Vite, esbuild)
Test runnerBuilt-in (bun test) — Jest-compatible, ~20x faster [1]Built-in node:test (basic, stable since v20) [2]
Cold start8-15ms40-120ms
HTTP throughput (Fastify)~95,200 req/s [3]~55,800 req/s [3]
Memory baseline~380MB~512MB
npm compatibility~98% of top 1000 packages100% (native)

Підсумок

Для нових серверних проєктів Bun пропонує швидший рантайм, простіший набір інструментів та нативний TypeScript. Решта 2% npm-несумісності зосереджені в нативних C++ додатках на кшталт bcrypt чи node-sass — більшість веб-фреймворків та ORM працюють без змін.

Bun встановлюється як один бінарний файл. Node.js, npm чи окремі інструменти збірки не потрібні.

01

Встановіть через curl

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

This downloads the Bun binary, adds it to your PATH, and verifies the installation. After installation, run bun --version to confirm.

02

Встановіть через PowerShell

POWERSHELL
powershell -c "irm bun.sh/install.ps1|iex"

Windows support reached stable status in Bun 1.3. All core features — runtime, package manager, test runner, and bundler — work on Windows. [1]

03

Підтвердьте встановлення

BASH
bun --version

Ви маєте побачити 1.3.x або новіше. Bun готовий до роботи. Окреме встановлення Node.js для проєктів Bun не потрібне, хоча наявність Node.js поруч з Bun є поширеною практикою і працює без конфліктів.

Створіть директорію проєкту, встановіть Fastify та напишіть перший серверний файл — усе на TypeScript, без кроку збірки.

01

Створіть проєкт та встановіть залежності

BASH
mkdir my-bun-server && cd my-bun-server
bun init
bun add fastify

bun init створює мінімальний package.json з "type": "module". bun add fastify встановлює Fastify з npm — менеджер пакетів Bun завантажує та розрішує залежності на 10-30x швидше за npm. [1]

02

Створіть точку входу сервера

TYPESCRIPT
// server.ts
import Fastify from "fastify";

const fastify = Fastify({ logger: true });

fastify.get("/", async (request, reply) => {
  return { hello: "world", runtime: "bun" };
});

fastify.get("/health", async (request, reply) => {
  return { status: "ok", uptime: process.uptime() };
});

const start = async () => {
  try {
    await fastify.listen({ port: 3000, host: "0.0.0.0" });
    console.log("Server running at http://localhost:3000");
  } catch (err) {
    fastify.log.error(err);
    process.exit(1);
  }
};

start();

Це стандартний код Fastify. Єдина відмінність від Node.js: ви запускаєте його bun замість node, а розширення .ts працює безпосередньо.

03

Запустіть сервер

BASH
bun run server.ts

That is it. No tsc, no ts-node, no nodemon, no build step. Bun reads the TypeScript file, strips types at parse time, and executes it. For development with hot reload, use bun --hot server.ts — Bun preserves application state across reloads, which is faster than Node.js's --watch flag that restarts the entire process. [1]

Що щойно відбулося

Ви створили працюючий сервер Fastify на TypeScript двома командами (bun init та bun add fastify) та одним файлом (server.ts). Без конфігураційних файлів, інструментів збірки чи кроку транспіляції. Це ключова різниця в DX між Bun та Node.js.

Bun надає два способи створення HTTP-серверів: нативний API Bun.serve() та сторонні фреймворки на кшталт Fastify. Обидва працюють на рантаймі Bun, але задовольняють різні потреби.

Bun.serve() — це вбудований HTTP-сервер Bun. Це найшвидший варіант — бенчмарки показують приблизно 180 000 запитів/сек для plaintext-відповідей порівняно з 65 000 запитів/сек у Node.js. Він ідеальний для простих API, мікросервісів та критичних до продуктивності кінцевих точок з мінімальними накладними витратами. [1][3]

Fastify додає структурований поверх: валідацію JSON Schema, оптимізацію серіалізації, архітектуру плагінів, хуки та декоратори. Запуск Fastify на Bun дає ~95 200 запитів/сек порівняно з ~55 800 запитів/сек на Node.js — приблизно на 70% більшу пропускну здатність. Ви втрачаєте частину сирої швидкості порівняно з Bun.serve(), але отримуєте фреймворк продакшен-рівня з валідацією, обробкою помилок та розширюваністю. [3]

Для більшості реальних застосунків Fastify на Bun — прагматичний вибір. Накладні витрати фреймворку — це частка загального часу запиту, коли ви додаєте запити до бази даних, автентифікацію та бізнес-логіку. Сама валідація схем — яку Fastify обробляє на рівні фреймворку з прискоренням серіалізації в 2-3 рази — часто виправдовує цей вибір. [4][5]

Використовуйте Bun.serve() коли

Вам потрібна максимальна сирої пропускна здатність для простих кінцевих точок. Створюєте легковаговий проксі, сервіс перевірки здоров'я, приймач вебхуків або внутрішній мікросервіс. Вам потрібен найменший холодний старт для serverless-розгортань. Ви готові самостійно обробляти маршрутизацію, валідацію та обробку помилок.

Використовуйте Fastify на Bun коли

Вам потрібна валідація JSON Schema та серіалізація. Ви хочете екосистему плагінів (CORS, автентифікація, Swagger, rate limiting). Створюєте REST або GraphQL API з кількома маршрутами. Вам потрібна структурована обробка помилок та хуки життєвого циклу запиту. Вам потрібні інструменти розробника продакшен-рівня.

Уникайте Bun.serve() коли

Ваш API має складні вимоги до валідації. Вам потрібна генерація документації OpenAPI/Swagger. Ви покладаєтеся на специфічні для фреймворку плагіни. Ваша команда очікує патернів Express/Fastify для підтримки.

Bun.serve() забезпечує найвищу сирою пропускну здатність, але Fastify на Bun забезпечує сильний баланс функцій фреймворку та продуктивності. Реальна різниця між Fastify на Bun та Fastify на Node.js становить приблизно 70%.

Скріншот секції bun-serve-vs-fastify

Сила Fastify — структурована валідація запитів за допомогою JSON Schema. Ось як створити валідовані маршрути на Bun.

01

Створіть модуль валідованого маршруту

TYPESCRIPT
// routes/users.ts
import { FastifyPluginAsync } from "fastify";

export const userRoutes: FastifyPluginAsync = async (fastify) => {
  const createUserBody = {
    type: "object",
    required: ["email", "name"],
    properties: {
      email: { type: "string", format: "email" },
      name: { type: "string", minLength: 1, maxLength: 100 },
      role: { type: "string", enum: ["admin", "user", "viewer"] },
    },
  } as const;

  fastify.post("/users", {
    schema: { body: createUserBody },
  }, async (request, reply) => {
    const { email, name, role } = request.body;
    return {
      id: crypto.randomUUID(),
      email,
      name,
      role: role ?? "user",
      createdAt: new Date().toISOString(),
    };
  });

  fastify.get("/users/:id", {
    schema: {
      params: {
        type: "object",
        properties: { id: { type: "string" } },
        required: ["id"],
      },
    },
  }, async (request, reply) => {
    const { id } = request.params as { id: string };
    return { id, message: "User lookup placeholder" };
  });
};
02

Зареєструйте маршрути в головному файлі сервера

TYPESCRIPT
// server.ts
import Fastify from "fastify";
import { userRoutes } from "./routes/users";

const fastify = Fastify({ logger: true });

fastify.register(userRoutes);

fastify.setErrorHandler((error, request, reply) => {
  if (error.validation) {
    reply.status(400).send({
      error: "Validation failed",
      details: error.validation,
    });
    return;
  }
  fastify.log.error(error);
  reply.status(500).send({ error: "Internal server error" });
});

const start = async () => {
  try {
    await fastify.listen({ port: 3000, host: "0.0.0.0" });
  } catch (err) {
    fastify.log.error(err);
    process.exit(1);
  }
};

start();

Run with bun run server.ts. Invalid request bodies now return structured 400 errors automatically.

Ключовий момент

Валідація схем Fastify працює однаково на Bun та Node.js. Єдина відмінність — валідований обробник виконується швидше на рантаймі Bun. Якщо ваші існуючі маршрути Fastify використовують JSON Schema, вони працюватимуть на Bun без змін.

Bun підтримує два шляхи роботи з базами даних: вбудований модуль bun:sqlite для легкого локального зберігання та стандартні драйвери npm для PostgreSQL, MySQL, MongoDB та інших баз даних. Для PostgreSQL драйвер pg працює на Bun без змін. [1]

Для рівня ORM, Prisma, Drizzle ORM та TypeORM працюють на Bun. Prisma зокрема добре перевірений — команда Prisma підтвердила сумісність з Bun та багато продакшен-розгортань використовують Prisma + Bun + PostgreSQL. [1][2]

Вбудований модуль SQLite Bun (bun:sqlite) корисний для прототипування, кешування та single-instance розгортань, де зовнішня база даних є зайвою. Для продакшен-API, PostgreSQL через pg або ORM на кшталт Prisma є стандартним вибором.

Скріншот секції database-integration

Практична порада

Використовуйте bun:sqlite для прототипування та single-instance кешування. Використовуйте PostgreSQL + Prisma або Drizzle для продакшен-API. Обидва працюють на Bun без змін конфігурації, окрім рядка підключення до бази даних.

Вбудований тест-раннер Bun використовує Jest-сумісні API. Більшість існуючих тестових файлів працюють без змін.

01

Напишіть тест маршруту

Create a test file using Bun's built-in test runner. Import describe, it, and expect from bun:test. The API is Jest-compatible so existing NestJS/Fastify tests migrate with minimal changes. Use app.inject() to test routes without starting a real HTTP server. Run all tests with bun test, which discovers files matching *.test.ts and *.spec.ts automatically. A test suite of 500 tests completes in approximately 1.2 seconds compared to Jest 24 seconds. [1]

Примітка про міграцію

Якщо ваш проєкт вже використовує Jest, більшість тестових файлів можна переключити на bun test без змін. API-поверхня майже ідентична. Головна різниця — швидкість: тести, що займали 30 секунд з Jest, завершаться приблизно за 1-2 секунди з Bun.

Bun надає офіційні Docker-образи, які менші та запускаються швидше за аналоги Node.js.

01

Створіть продакшен Dockerfile

DOCKERFILE
FROM oven/bun:1.3 AS base
WORKDIR /app

COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile --production

COPY src ./src

EXPOSE 3000
CMD ["bun", "run", "src/server.ts"]
02

Зберіть образ та запустіть контейнер

BASH
docker build -t my-bun-server .
docker run -p 3000:3000 my-bun-server

The container starts in under a second. Bun's cold start advantage (8-15ms vs 40-120ms for Node.js) is especially valuable in container orchestration environments where frequent restarts and scaling events are normal.

Ці бенчмарки походять від кількох незалежних джерел, що тестували Fastify на Bun проти Fastify на Node.js на ідентичному обладнанні та навантаженнях.

Розрив у продуктивності між Bun та Node.js найбільш виражений у сирій HTTP-пропускній здатності та холодних запусках. Коли в картину входять накладні витрати фреймворку (middleware Fastify, JSON-серіалізація, валідація), розрив звужується до 40-70%. У реальних API, де домінують запити до бази даних та мережевий I/O, рантайм становить менше 10% загального часу запиту. Найбільші практичні переваги — у швидкості запуску, часу CI/CD пайплайну та конкурентності WebSocket. [1][2][3]

95,200 vs 55,800

Bun забезпечує ~70% більшу пропускну здатність Fastify порівняно з Node.js на ідентичному обладнанні. [3]

156ms vs 245ms

Bun запускається ~36% швидше, зменшуючи витрати на serverless-функції безпосередньо. [2]

1.2M vs 680K

Bun обробляє на 76% більше конкурентних WebSocket-з'єднань на тому ж обладнанні. [1]

380MB vs 512MB

Контейнери Bun використовують ~25% менше пам'яті, дозволяючи більше подів на кластер. [1]

2s vs 30s

Менеджер пакетів Bun встановлює залежності на 10-15x швидше за npm. [1]

1.2s vs 24s

Тест-раннер Bun ~20x швидший за Jest із сумісним API. [1]

Коли цифри мають найбільше значення

Перевага в продуктивності Bun найбільша для serverless-функцій (холодний старт), CI/CD пайплайнів (швидкість встановлення + тестування) та застосунків з інтенсивним використанням WebSocket. Для стандартних REST API, де база даних є вузьким місцем, різниця менша, але все ще значуща — особливо в масштабі.

Це проблеми, з якими команди реально стикаються при розгортанні Bun у продакшені.

Припущення 100% сумісності з npm. Приблизно 2% пакетів — переважно нативні C++ додатки, скомпільовані через node-gyp — можуть не працювати. Типові проблемні пакети включають bcrypt (використовуйте bcryptjs), певні реалізації canvas та node-sass (використовуйте sass). Завжди виконуйте bun install && bun test перед комітом. [1][2]

Ігнорування відмінностей збирача сміття Bun. Bun використовує збирач сміття JSC, який менш перевірений для процесів, що працюють безперервно 72+ годин, порівняно з V8. Для довготривалих сервісів, моніторте поведінку пам'яті протягом 24-48 годин після міграції. [2]

Забування аудитувати нативні залежності перед Docker-збірками. Пакет, що встановлюється нормально з bun install на macOS, може не спрацювати під час Docker-збірок на Linux, якщо містить платформо-специфічні нативні бінарні файли. Тестуйте повний пайплайн збірки на ранньому етапі. [1]

Використання імпортів node: без перевірки. Bun підтримує більшість імпортів вбудованих модулів node:, але є крайові випадки в node:diagnostics_channel, node:vm та певних inspector API. Якщо ваш код використовує глибокі внутрішності Node.js, перевірте кожен імпорт явно. [1][2]

Очікування, що весь middleware Express працюватиме без змін. Більшість middleware Express працює з Fastify (через адаптер @fastify/express), але деякі пакети покладаються на специфічні для Express мутації об'єктів request/response. Тестуйте кожен middleware окремо. [4]

Безпечний шлях міграції

Почніть з використання Bun як менеджера пакетів та тест-раннера, зберігаючи Node.js як рантайм. Це дасть вам 80-90% переваг у швидкості з нульовим ризиком для продакшену. Переключайте рантайм на Bun лише після того, як повний набір тестів пройде і ви перевірите поведінку пам'яті в staging.

Обидва рантайми готові до продакшену в 2026 році. Вибір залежить від ваших конкретних обмежень.

Оберіть Bun для нових проєктів

Ви контролюєте дерево залежностей. Ви хочете нативний TypeScript, швидший CI/CD, нижчі витрати на serverless або максимальну HTTP-пропускну здатність. Сумісність відмінна для стандартних веб-фреймворків (Fastify, Hono, Express) та ORM (Prisma, Drizzle, TypeORM).

Залиште Node.js для існуючих проєктів

Ваш застосунок має сотні залежностей, нативні C++ додатки або роки продакшен-загартування. Переваги в продуктивності рідко виправдовують вартість міграції, коли рантайм не є вузьким місцем — запити до бази даних та мережевий I/O зазвичай домінують.

Використовуйте гібридний підхід

Bun для інструментів (управління пакетами, тестування) + Node.js для продакшен-рантайму. Це прагматичний enterprise-патерн: на 80-90% швидший CI/CD з нульовим ризиком міграції. Кілька компаній з Fortune 500 прийняли саме цей патерн у 2026 році.

Короткі відповіді на поширені питання про запуск Fastify на Bun.

Чи працює Fastify на Bun без змін?

Так. Fastify працює на Bun без модифікацій коду. Усі основні функції — маршрутизація, валідація, хуки, плагіни, серіалізація — працюють однаково. Бенчмарки показують приблизно на 70% більшу пропускну здатність на Bun порівняно з Node.js. [3][4]

Чи потрібен мені tsconfig.json з Bun?

Не для базового виконання. Bun запускає файли .ts нативно. Вам потрібен tsconfig.json лише якщо ви хочете сувору перевірку типів в IDE або якщо інші інструменти (ESLint, автозаповнення IDE) на нього посилаються. Bun ігнорує tsconfig.json під час виконання. [1]

Чи можу я використовувати Prisma з Bun?

Так. Prisma працює на Bun без модифікацій. Команда Prisma підтвердила сумісність з Bun та багато продакшен-розгортань використовують Prisma + Bun + PostgreSQL. Виконайте bun add prisma @prisma/client та згенеруйте клієнт як зазвичай. [1][2]

Як щодо гарячого перезавантаження в розробці?

Bun надає bun --hot, який зберігає стан застосунку між перезавантаженнями — швидше за прапорець --watch Node.js, що перезапускає весь процес. Для Fastify це означає, що ваш сервер перезапускається за мілісекунди замість секунд. [1]

Чи безпечний Bun для продакшену в 2026?

Так для більшості випадків використання. Bun 1.3 досяг стабільної підтримки Windows та 98% сумісності з npm. Основні застереження — довготривалі процеси (72+ годин), де збирач сміття V8 краще перевірений, та залежності від нативних C++ додатків. [1][2]

Як Bun порівнюється з Deno?

Bun швидший за Deno у більшості бенчмарків. Deno має сильнішу модель безпеки (вбудовані дозволи), але повільніше впровадження. Для випадку використання цього посібника (сервер Fastify), Bun має кращу сумісність фреймворків та швидший тест-раннер. [2]

Джерела, що підтверджують твердження про функції рантайму Bun, бенчмарки продуктивності, сумісність Fastify та стан екосистеми.

Перевірено: 12 квіт. 2026 р.Актуально для: Bun 1.3+Актуально для: Fastify 5.xАктуально для: TypeScript 5.xАктуально для: Node.js 22+ (для порівняння)Перевірено з: Bun 1.3 runtimeПеревірено з: Fastify 5.8.xПеревірено з: bun:sqliteПеревірено з: PostgreSQL через драйвер pgПеревірено з: Docker (базовий образ oven/bun)

Якщо ви оцінюєте Bun для вашого бекенд-стеку, PAS7 Studio може допомогти вам оцінити сумісність, побудувати шлях міграції та запустити продакшен-готовий сервер Bun + Fastify з валідацією, інтеграцією бази даних, автентифікацією та автоматизацією розгортання.

Ми маємо досвід з Bun, Fastify, NestJS, PostgreSQL, Docker та повним бекенд-стеком. Незалежно від того, чи ви починаєте з нуля чи мігруєте з Node.js, ми допоможемо уникнути поширених помилок та отримати переваги продуктивності без сюрпризів.

Ви тут01/02

Bun.js сервер із Fastify: від нуля до продакшену

Попередня
Наступна

Пов'язані статті

growth

AI SEO / GEO у 2026: ваші наступні клієнти — не люди, а агенти

Пошук зміщується від кліків до відповідей. Боти та AI-агенти сканують, цитують, рекомендують і дедалі частіше купують. Дізнайтесь, що таке AI SEO / GEO, чому класичного SEO вже недостатньо, і як PAS7 Studio допомагає брендам перемагати у «агентному» вебі.

blogs

Найпотужніший чіп від Apple? M5 Pro і M5 Max б'ють рекорди

Аналітичний розбір Apple M5 Pro і M5 Max станом на березень 2026 року. Пояснюємо, чому ці чіпи можна вважати найпотужнішими професійними ноутбучними SoC від Apple, як вони виглядають на тлі M4 Pro, M4 Max, M1 Pro, M1 Max і що показують у порівнянні з актуальними Intel та AMD.

blogs

Artemis II і код, який веде до Місяця

У цьому блозі розбираємо місію NASA Artemis II, яка стартувала 1 квітня 2026 року, і пояснюємо, що вона насправді говорить про сучасну інженерію: бортове ПЗ, резервні контури, симуляції, телеметрію, людський контроль і дуже обережну роль ШІ в космічній сфері.

telegram-media-saver

Автоматичне тегування та пошук збережених посилань

Інтеграція з GDrive/S3/Notion для автоматичного тегування та швидкого пошуку через пошукові API

Професійна розробка для вашого бізнесу

Створюємо сучасні веб-рішення та боти для бізнесу. Дізнайтеся, як ми можемо допомогти вам досягти цілей.