Whitepaper: ueo.ventures - un sito statico a pagina singola ospitato su DownToZero
Questo whitepaper illustrerà come DownToZero viene utilizzato per ospitare un sito web statico. Forniremo approfondimenti su come il sito è stato costruito e daremo alcuni dati reali su come viene utilizzato e come ciò si riflette sull’uso di DownToZero e di conseguenza sui costi.
What Is ueo.ventures?
ueo.ventures è un sito statico che fornisce credenziali a entità esterne. Il sito è molto minimale e consiste solo di 2 pagine statiche. Include:
- pagina index - che indica il nome della società
- pagina impressum - che dichiara i requisiti legali per una società privata
How is it build?
Come detto in precedenza, il sito contiene solo 2 pagine. Queste pagine sono file statici in un repository github. Per renderlo disponibile su DownToZero, dobbiamo impacchettare questi due file come container docker.
Ecco il Dockerfile completo usato per impacchettare il sito.
FROM alpine AS runner
RUN apk add --update --no-cache lighttpd && rm -rf /var/cache/apk/*
ADD index.html /var/www/localhost/htdocs/
ADD impressum.html /var/www/localhost/htdocs/
CMD ["/usr/sbin/lighttpd", "-D", "-f", "/etc/lighttpd/lighttpd.conf"]
E la pipeline che usiamo per costruire e distribuire la versione più aggiornata.
name: website
on:
push:
workflow_dispatch:
schedule:
- cron: '30 5 25 * *'
jobs:
build-website:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: build website
run: |
docker build -t xb35e5d0.cr.dtz.dev/ueo-ventures .
- name: Login to xb35e5d0.cr.dtz.dev
uses: docker/login-action@v3
with:
registry: xb35e5d0.cr.dtz.dev
username: apikey
password: ${{ secrets.DTZ_API_KEY }}
- name: uploading image to xb35e5d0.cr.dtz.dev
run: |
docker push xb35e5d0.cr.dtz.dev/ueo-ventures:latest
- name: Resolve image digest
id: resolve_digest
run: |
DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' xb35e5d0.cr.dtz.dev/ueo-ventures:latest)
echo "IMAGE_URL=$DIGEST" >> $GITHUB_ENV
- name: Deploy latest image to service
uses: DownToZero-Cloud/containers-service-update@main
with:
container_image: ${{ env.IMAGE_URL }}
api_key: ${{ secrets.DTZ_API_KEY }}
service_id: service-e1d1efd8
- name: Publish image URL to summary
run: |
echo "## Deployed image" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "${IMAGE_URL}" >> $GITHUB_STEP_SUMMARY
How much is it used?
requests
Il numero di richieste verso questa pagina è piuttosto basso. Quindi vedremo molti cold-start non ottimizzati. Il volume complessivo medio giornaliero è di circa 200 richieste al giorno.
Ecco un breve insieme di dati di esempio
| day | requests |
|---|---|
| 2025-09-12 | 147 |
| 2025-09-13 | 116 |
| 2025-09-14 | 118 |
| 2025-09-15 | 121 |
| 2025-09-16 | 200 |
| 2025-09-17 | 169 |
| 2025-09-18 | 157 |
| 2025-09-19 | 268 |
| 2025-09-20 | 524 |
| 2025-09-21 | 496 |
| 2025-09-22 | 228 |
| 2025-09-23 | 246 |
| 2025-09-24 | 123 |
| 2025-09-25 | 79 |
| 2025-09-26 | 60 |
splitting the request by cold-starts
I cold start sono avvii in cui non è presente nulla sull’host che esegue. I warm start sono quando l’immagine è già caricata sull’host ma il container deve essere avviato. I hot start sono quando il container è già attivo e funzionante.
| day | cold starts | warm starts | hot starts |
|---|---|---|---|
| 2025-09-12 | 63 | 48 | 14 |
| 2025-09-13 | 70 | 3 | 21 |
| 2025-09-14 | 61 | 3 | 22 |
| 2025-09-15 | 68 | 0 | 31 |
| 2025-09-16 | 84 | 3 | 27 |
| 2025-09-17 | 53 | 3 | 25 |
| 2025-09-18 | 72 | 2 | 27 |
| 2025-09-19 | 48 | 2 | 19 |
| 2025-09-20 | 501 | 2 | 10 |
| 2025-09-21 | 474 | 3 | 1 |
| 2025-09-22 | 199 | 3 | 2 |
| 2025-09-23 | 201 | 3 | 27 |
| 2025-09-24 | 71 | 5 | 31 |
| 2025-09-25 | 51 | 3 | 20 |
response times
Sebbene la differenza tra hot e cold start sembri significativa in valori relativi, il tempo complessivo di cold start non scende sotto i 3ms.
Percentili di latenza in ms
| state | p50 | p90 | p95 | p99 |
|---|---|---|---|---|
| cold | 0.536 | 1.003 | 2.0888 | 3.2584 |
| hot | 0 | 0 | 0.001 | 0.001 |
Power Consumption
Tutto ciò si traduce in un certo tipo e modello di utilizzo. La nostra metrica per determinare l’uso è il Watt. Misuriamo il consumo energetico per tutta questa attività e forniamo statistiche dettagliate nel tempo.
| day | consumo energetico (in Wh) | | — | ———– :| | 2025-09-12 | 1.88 | | 2025-09-13 | 2.00 | | 2025-09-14 | 0.96 | | 2025-09-15 | 1.76 | | 2025-09-16 | 3.14 | | 2025-09-17 | 0.43 | | 2025-09-18 | 1.90 | | 2025-09-19 | 1.06 | | 2025-09-20 | 4.74 | | 2025-09-21 | 4.51 | | 2025-09-22 | 1.62 | | 2025-09-23 | 6.51 | | 2025-09-24 | 3.85 | | 2025-09-25 | 3.29 | | 2025-09-26 | 2.81 |
Pricing & Cost Efficiency
DownToZero fattura il calcolo esclusivamente in base all’energia consumata. Le tariffe attuali sono:
- Computazione: 0.010 EUR per Watt-Ora (Wh) in modalità normale; 0.005 EUR/Wh in ecoMode.
- Storage: hot storage - 0.0013 EUR / GB / giorno; cold storage - 0.0007 EUR / GB / giorno
Basandoci sull’uso misurato di questo servizio ueo.ventures:
- Richieste: ~203 richieste/giorno in media durante il periodo di campionamento (picco 524; minimo 60).
- Energia: ~2.40 Wh/giorno in media (min 0.43 Wh; max 6.51 Wh).
Costo computazionale stimato alle tariffe attuali:
- Modalità normale: ~0.024 EUR/giorno (~0.72 EUR per mese da 30 giorni); intervallo giornaliero ≈ 0.004–0.065 EUR.
- ecoMode: ~0.012 EUR/giorno (~0.36 EUR per mese da 30 giorni); intervallo giornaliero ≈ 0.002–0.033 EUR.
Poiché si paga per watt, c’è un incentivo diretto a mantenere le immagini snelle, evitare lavori inutili nei cold start e scegliere ecoMode dove pratico. Nel tempo questo può ridurre sia la spesa che il consumo energetico.
Compromessi: ecoMode può comportare caratteristiche di performance diverse (ad esempio latenza all’avvio, scheduling); i costi possono variare con picchi di utilizzo. Monitorare il consumo e adattarsi secondo necessità.