ЖивийПублічно верифікований

Що може сервер за €40

Понад 4 мільйони компаній і десятки мільйонів записів. Один сервер. Без мікросервісів, без Kubernetes, без модних слів.

Сервер8 vCPU, 16 ГБ RAM, €40/місяць
База данихPostgreSQL 16 — 4 млн+ компаній, десятки мільйонів записів
КешRedis 7 — TTL за типом даних
Середовище виконанняBun + Fastify 5 — нативний TypeScript

Живий тест

100 реальних запитів, 20 одночасних, до виробничої бази даних

Натисніть кнопку, щоб запустити 100 реальних запитів і виміряти потужність сервера.

Методологія

Що ми вимірюємо

Тест потужності виконує 100 реальних запитів (пошук компаній, пошук осіб, деталі CUI, IBAN), по 20 одночасно, до виробничої бази даних з понад 4 мільйонами компаній, представників і десятками мільйонів взаємопов'язаних записів. Оцінка одночасних користувачів передбачає, що реальний користувач робить у середньому 1 запит кожні 3 секунди (завантаження сторінки + час на обдумування).

Як ми вимірюємо

Функції запитів викликаються безпосередньо на сервері (без HTTP-накладних витрат), а час вимірюється за допомогою performance.now() — роздільна здатність до мілісекунди. Результати включають лише час обробки сервером, без мережевої затримки.

Формула

одночасні користувачі = запити/секунду × 3с (середній час між діями)

Чому це важливо

Сервер за €40/місяць із добре проіндексованою базою даних і Bun як середовищем виконання може обслуговувати тисячі одночасних користувачів. Без мікросервісів, без Kubernetes, без інфраструктури за мільйон доларів.

Скільки це коштує в інших провайдерів

Той самий сервер (8 vCPU, 16 ГБ RAM) у різних провайдерів — щомісячні ціни без знижок

DemoANAF.ro
40/міс
Hetzner Cloud
16/міс
OVHcloud
26/міс
Vultr
44/міс
DigitalOcean
58/міс
AWS EC2
180/міс
Google Cloud
150/міс
Azure
258/міс
Hetzner Cloud: shared CPUAWS EC2: on-demandGoogle Cloud: on-demandAzure: on-demand

Гіперскейлери (AWS, Google, Azure) пропонують керовані сервіси, але для порталу з добре проіндексованою базою даних простий VPS забезпечує таку ж продуктивність за частку вартості.

Протестуйте самостійно

Встановіть k6 (з відкритим кодом, один бінарний файл) і запустіть сценарій нижче.

import http from 'k6/http';
import { check, sleep } from 'k6';

// 50 utilizatori virtuali, 30 secunde
export const options = {
  stages: [
    { duration: '10s', target: 50 },
    { duration: '15s', target: 50 },
    { duration: '5s', target: 0 },
  ],
};

const BASE = 'https://demoanaf.ro';
const SEARCHES = ['construct', 'transport', 'consult', 'auto', 'euro'];
const PEOPLE = ['pop', 'ion', 'maria', 'gheorghe'];
const CUIS = [33503335, 4221306, 14399840, 18189442];

function pick(arr) { return arr[Math.floor(Math.random() * arr.length)]; }

export default function () {
  const roll = Math.random();
  let res;

  if (roll < 0.4)
    res = http.get(BASE + '/api/search?q=' + pick(SEARCHES) + '&limit=10');
  else if (roll < 0.65)
    res = http.get(BASE + '/api/company/' + pick(CUIS));
  else if (roll < 0.85)
    res = http.get(BASE + '/api/search/people?q=' + pick(PEOPLE) + '&limit=10');
  else
    res = http.get(BASE + '/api/iban?q=timis');

  check(res, {
    'status 200': (r) => r.status === 200,
    'response < 500ms': (r) => r.timings.duration < 500,
  });

  sleep(0.5);
}

Ваші результати включатимуть мережеву затримку — наші вимірюються безпосередньо на сервері. Сценарій використовує 50 віртуальних користувачів протягом 30 секунд з паузою 0,5 с між запитами.