LiveVerificabile pubblicamente

Cosa può fare un server da €40

Oltre 4 milioni di aziende e decine di milioni di record. Un singolo server. Nessun microservizio, nessun Kubernetes, nessun buzzword.

Server8 vCPU, 16 GB RAM, €40/mese
DatabasePostgreSQL 16 — 4M+ aziende, decine di milioni di record
CacheRedis 7 — TTL per tipo di dato
RuntimeBun + Fastify 5 — TypeScript nativo

Test live

100 query reali, 20 in parallelo, contro il database di produzione

Premi il pulsante per eseguire 100 query reali e misurare la capacità del server.

Metodologia

Cosa misuriamo

Il test di capacità esegue 100 query reali (ricerca aziende, ricerca persone, dettagli CUI, IBAN), 20 alla volta, contro il database di produzione con oltre 4 milioni di aziende, rappresentanti e decine di milioni di record interconnessi. La stima degli utenti concorrenti assume che un utente reale faccia in media 1 richiesta ogni 3 secondi (caricamento pagina + tempo di riflessione).

Come misuriamo

Le funzioni di query vengono chiamate direttamente sul server (senza overhead HTTP), e il tempo viene misurato con performance.now() — risoluzione sub-millisecondo. I risultati includono solo il tempo di elaborazione del server, non la latenza di rete.

Formula

utenti concorrenti = richieste/secondo × 3s (tempo medio tra azioni)

Perché è importante

Un server da €40/mese con un database ben indicizzato e Bun come runtime può servire migliaia di utenti concorrenti. Nessun microservizio, nessun Kubernetes, nessuna infrastruttura da milioni di euro necessaria.

Quanto costa altrove

Lo stesso server (8 vCPU, 16 GB RAM) presso diversi provider — prezzi mensili, senza sconti

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

Gli hyperscaler (AWS, Google, Azure) offrono servizi gestiti, ma per un portale con un database ben indicizzato, un semplice VPS offre le stesse prestazioni a una frazione del costo.

Testalo tu stesso

Installa k6 (open source, binario singolo) ed esegui lo script qui sotto.

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

I tuoi risultati includeranno la latenza di rete — i nostri vengono misurati direttamente sul server. Lo script usa 50 utenti virtuali per 30 secondi, con una pausa di 0,5s tra le richieste.