LiveVerificabil public

Ce poate face un server de €40

Peste 4 milioane de firme și zeci de milioane de înregistrări. Un singur server. Fără microservicii, fără Kubernetes, fără buzzwords.

Server8 vCPU, 16 GB RAM, €40/lună
Baza de datePostgreSQL 16 — 4M+ firme, zeci de milioane de înregistrări
CacheRedis 7 — TTL per tip de date
RuntimeBun + Fastify 5 — TypeScript nativ

Test live

100 interogări reale, 20 concurente, pe baza de date de producție

Apasă butonul pentru a rula 100 de interogări reale și a măsura capacitatea serverului.

Metodologie

Ce măsurăm

Testul de capacitate rulează 100 de interogări reale (căutare firme, persoane, detalii CUI, IBAN), 20 la un moment dat, pe baza de date de producție cu peste 4 milioane de firme, reprezentanți și zeci de milioane de înregistrări interconectate. Estimarea utilizatorilor simultani presupune că un utilizator real face în medie 1 cerere la 3 secunde (încărcare pagină + timp de gândire).

Cum măsurăm

Funcțiile de interogare sunt apelate direct pe server (fără overhead HTTP), iar timpul este măsurat cu performance.now() — rezoluție sub-milisecundă. Rezultatele includ doar procesarea serverului, nu latența rețelei.

Formula

utilizatori simultani = cereri/secundă × 3s (timp mediu între acțiuni)

De ce e relevant

Un server de €40/lună cu o bază de date bine indexată și Bun ca runtime poate servi mii de utilizatori simultani. Nu e nevoie de microservicii, Kubernetes, sau infrastructură de milioane.

Cât costă în altă parte

Același server (8 vCPU, 16 GB RAM) la diferiți furnizori — prețuri lunare, fără discount

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

Hyperscalerii (AWS, Google, Azure) oferă servicii managed, dar pentru un portal cu baza de date bine indexată, un VPS simplu livrează aceeași performanță la o fracțiune din cost.

Testează singur

Instalează k6 (open source, un singur binar) și rulează scriptul de mai jos.

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

Rezultatele tale vor include latența rețelei — rezultatele noastre sunt măsurate direct pe server. Scriptul folosește 50 de utilizatori virtuali timp de 30 de secunde, cu pauză de 0.5s între cereri.