Hardware
CodeFloe runs on Hetzner1, both directly and through two self-managed Proxmox VE clusters that are themselves built from rented Hetzner bare metal. Hetzner brings many essential points to the table:
- great value/cost ratio
- GDPR compliance
- Terraform/OpenTofu provider
- VMs and bare-metal servers
- S3
These are effectively all the parts which are needed to run any service. Yes, a managed database is missing in that list. However, we are brave (enough) to roll our own database 🤓️, both to save costs and “because we can” 😉️.
Server Configuration
Section titled “Server Configuration”CodeFloe uses a mix of dedicated servers, cloud instances and virtual machines on two Proxmox VE clusters. Cloud instances are great for small services and dev instances. However, they only have a small root disk which cannot be used for a Ceph cluster (as Ceph requires a dedicated storage device). Also the shared NVMEs on the cloud instances are good, but not as good as NVMEs from dedicated servers.
The three rented dedicated servers (demeter, hades, minerva) that used to carry the database and part of the CI load were returned in July 2026.
Their roles moved onto the Proxmox VE cluster, where a single large host can be carved into several right-sized VMs instead of being pinned to one role.
The database now lives on three VMs spread across three physical hosts, and CI got three dedicated VMs of its own.
Separating the two means a heavy build can no longer affect database latency.
The forge followed in August 2026.
codefloe.com used to run on a Hetzner cloud instance named git; it now runs on ceph-ax102-forgejo-1, a VM on the Ceph cluster, and the cloud instance is gone.
Forgejo in single mode keeps all its state on disk, so what it gains there is Ceph replica-3: the disk no longer belongs to any one host, a host failure becomes a restart elsewhere rather than a backup restore, and the VM can be live-migrated for maintenance.
CodeFloe Pages runs on the same cluster, one VM per host.
For CI/CD, we know that speed matters.
An AX42 (artemis), three Proxmox VMs on desktop-class CPUs (ci-1, ci-2, ci-3), a CAX41 cloud instance (ci-arm1) and a Mac Mini M4 (gaia) process the builds.
See the CI/CD hardware page for the per-runner job capacity.
Server Specifications
Section titled “Server Specifications”GB 6 SC is the Geekbench 6 single-core score; higher is better. Scores marked (ref.) link to public results for the same CPU or cloud instance model, rather than measurements of the named server. For Proxmox VMs, these are host CPU reference scores, not guest benchmarks. Actual scores vary with the Geekbench version, OS, power settings, virtualization and host load. Unmarked scores are retained from the existing specifications.
Hetzner
Section titled “Hetzner”| Name | Env | CPU | Mem | Disk | OS | GB 6 SC | Used for | Costs/m (€) |
|---|---|---|---|---|---|---|---|---|
| artemis | prod | AMD Ryzen 7 PRO 8700GE | 64 GB DDR5 ECC | 2x 500 GB SAMSUNG MZVL2512HCJQ-00B0 NVME | Alma10 | 2676 | CI/CD | 57.30 |
| ci-arm1 | prod | Ampere Neoverse-N1 (CAX41) | 32 GB | 160 GB NVME SSD | Alma10 | 1037 (ref.) | CI/CD | - |
| misc | prod | Ampere Neoverse-N1 (CAX21) | 8 GB | 80 GB NVME SSD | Alma10 | 1079 | CI/CD, status, Forum, website | 6.49 |
| git-dev | dev | Ampere Neoverse-N1 (CAX11) | 4 GB | 40 GB NVME SSD | Alma9 | 1035 | Git | 3.79 |
| misc-dev | dev | Ampere Neoverse-N1 (CAX11) | 4 GB | 40 GB NVME SSD | Alma9 | 1035 | CI/CD, status, Forum | 3.79 |
| pgnode1-dev | dev | Ampere Neoverse-N1 (CAX11) | 4 GB | 40 GB NVME SSD | Alma9 | 1035 | DB | 3.79 |
| pgnode2-dev | dev | Ampere Neoverse-N1 (CAX11) | 4 GB | 40 GB NVME SSD | Alma9 | 1035 | DB | 3.79 |
| pgnode3-dev | dev | Ampere Neoverse-N1 (CAX11) | 4 GB | 40 GB NVME SSD | Alma9 | 1035 | DB | 3.79 |
git, the CAX31 that used to serve codefloe.com, was removed in August 2026 when the forge moved onto the Ceph cluster.
It is listed below as ceph-ax102-forgejo-1.
Proxmox VE clusters
Section titled “Proxmox VE clusters”The cluster nodes are rented Hetzner bare-metal servers, shared with other projects. There are two clusters, and the difference between them decides what is allowed to run where.
The local cluster is four hosts with node-local RAID1 storage and no Ceph. A VM’s disk belongs to the host it runs on, so there is no live migration. That suits CI and the database, which want directly attached NVMe far more than they want to move.
The Ceph cluster is three AX102 hosts with Ceph replica-3 over a dedicated 10 Gb/s switch. A VM’s disk is not tied to any one host, so the forge and Pages survive a host failure as a restart elsewhere and can be live-migrated for maintenance.
Each VM name carries its cluster, and on the local cluster also the physical host it runs on, because that cluster has mixed CPUs.
In the infrastructure code the two are named devxy-ceph and devxy-local, which is where the ceph- and local- prefixes in the VM names come from.
| Host | Cluster | Model | CPU | Threads | Mem | GB 6 SC | Rental/m (€) |
|---|---|---|---|---|---|---|---|
| zeus | local | AX102 | AMD Ryzen 9 7950X3D | 32 | 128 GB | 2872 (ref.) | 112.00 |
| hera | local | EX101 | Intel Core i9-13900 | 32 | 128 GB | 3040 (ref.) | ~200.00 |
| apollo | local | EX101 | Intel Core i9-13900 | 32 | 64 GB | 3040 (ref.) | 81.00 |
| poseidon | local | EX101 | Intel Core i9-13900 | 32 | 64 GB | 3040 (ref.) | 78.00 |
| athena | Ceph | AX102 | AMD Ryzen 9 7950X3D | 32 | 128 GB | 2872 (ref.) | not yet set |
| hephaestus | Ceph | AX102 | AMD Ryzen 9 7950X3D | 32 | 128 GB | 2872 (ref.) | not yet set |
| hermes | Ceph | AX102 | AMD Ryzen 9 7950X3D | 32 | 128 GB | 2872 (ref.) | not yet set |
CodeFloe only occupies part of each host, so every VM is charged the share of its host’s rental that it actually reserves.
That share is the VM’s largest claim on any single host resource, max(vCPU / host threads, RAM / host RAM), which is whichever resource would run out first if the host were filled with identical VMs.
Local cluster
Section titled “Local cluster”| Name | Env | Host | vCPU | Mem | GB 6 SC | Disk | OS | Used for | Host share | Costs/m (€) |
|---|---|---|---|---|---|---|---|---|---|---|
| local-zeus-codefloe-ci-1 | prod | zeus | 8 | 22 GB | 2872 (ref.) | 40 GB + 500 GB | Alma10 | CI/CD | 25.0 % | 28.00 |
| local-hera-codefloe-ci-2 | prod | hera | 8 | 16 GB | 3040 (ref.) | 40 GB + 800 GB | Alma10 | CI/CD | 25.0 % | ~50.00 |
| local-poseidon-codefloe-ci-3 | prod | poseidon | 16 | 32 GB | 3040 (ref.) | 15 GB + 500 GB | Alma10 | CI/CD | 50.0 % | 39.00 |
| local-hera-codefloe-db-1 | prod | hera | 4 | 16 GB | 3040 (ref.) | 40 GB + 800 GB | Alma10 | DB | 12.5 % | ~25.00 |
| local-apollo-codefloe-db-2 | prod | apollo | 4 | 16 GB | 3040 (ref.) | 40 GB + 800 GB | Alma10 | DB | 25.0 % | 20.25 |
| local-poseidon-codefloe-db-3 | prod | poseidon | 4 | 16 GB | 3040 (ref.) | 40 GB + 800 GB | Alma10 | DB | 25.0 % | 19.50 |
Ceph cluster
Section titled “Ceph cluster”Every host here is an identical AX102, so the reference score is the same for all four VMs.
| Name | Env | Host | vCPU | Mem | Disk | OS | Used for | Host share | Costs/m (€) |
|---|---|---|---|---|---|---|---|---|---|
| ceph-ax102-forgejo-1 | prod | hephaestus | 8 | 32 GB | 20 GB + 20 GB + 400 GB | Alma10 | Git, HAProxy, indexers | 25.0 % | not yet set |
| ceph-ax102-codefloe-pages-1 | prod | athena | 4 | 8 GB | 40 GB + 10 GB + 32 GB | Alma10 | Pages | 12.5 % | not yet set |
| ceph-ax102-codefloe-pages-2 | prod | hephaestus | 4 | 8 GB | 40 GB + 10 GB + 32 GB | Alma10 | Pages | 12.5 % | not yet set |
| ceph-ax102-codefloe-pages-3 | prod | hermes | 4 | 8 GB | 40 GB + 10 GB + 32 GB | Alma10 | Pages | 12.5 % | not yet set |
The Ceph cluster’s hosts share their storage, so the host column is where each VM runs today rather than where it must run.
ceph-ax102-forgejo-1 runs Forgejo with its HAProxy, Valkey as cache and zoekt for code search; issue search is served by Typesense on the Kubernetes cluster instead.
The 32 GB is bought for page cache, because zoekt’s index shards are memory-mapped and want to stay resident.
The local cluster’s share of the bill is roughly €181.75/month, of which €117.00 is CI/CD. The three Ceph cluster hosts are new enough that their rental is not yet in the cost model, so the VMs on them carry no figure and are excluded from the totals below.
Kubernetes
Section titled “Kubernetes”A Talos Linux cluster on Hetzner Cloud carries the services that are a poor fit for a single VM.
It is nine nodes: three control planes, two of them in nbg1 and one in hel1 so the cluster survives losing a location, and six workers split evenly between arm64 and amd64.
Everything on it is deployed by Argo CD from the codefloe/kubernetes repository, Longhorn provides the storage classes, and traffic enters through Envoy Gateway on a Hetzner floating IP.
| Pool | Type | Arch | Count | Location | vCPU | Mem | Disk | Costs/m (€) |
|---|---|---|---|---|---|---|---|---|
| cp-nbg | CX23 | amd64 | 1 | nbg1 | 2 | 4 GB | 40 GB | 3.99 |
| cp-nbg2 | CX23 | amd64 | 1 | nbg1 | 2 | 4 GB | 40 GB | 3.99 |
| cp-hel | CX23 | amd64 | 1 | hel1 | 2 | 4 GB | 40 GB | 3.99 |
| worker-arm64-small | CAX21 | arm64 | 3 | nbg1 | 4 | 8 GB | 80 GB | 19.47 |
| worker-x86-cx-small | CX33 | amd64 | 3 | nbg1 | 4 | 8 GB | 80 GB | 19.47 |
That is €50.91/month at list prices, before the IPv4 addresses, the floating IP and the block storage the cluster also bills for.
The user-facing services on it are Weblate at translate.codefloe.com and the container proxy cache at cr.codefloe.com, which is a Harbor instance.
It also carries the identity provider at auth.codefloe.com, OpenBao at openbao.codefloe.com and the hosted Renovate operator at renovate.codefloe.com, so the platform’s own sign-in, its secret store and its dependency updates are self-hosted rather than bought.
Forgejo’s issue indexer, a three-replica Typesense cluster, and the backup operator run here without hostnames of their own.
| Name | Env | CPU | Mem | Disk | OS | GB 6 SC | Used for | Costs/m (€) |
|---|---|---|---|---|---|---|---|---|
| gaia | prod | Apple M4 | 32 GB DDR5 | 1x 500 GB APPLE SSD AP0512Z | macOS 26 | 3781 | CI/CD | - |
Recurring costs total roughly €315.40/month across the hosts with a price listed above. The three Ceph cluster hosts and the VMs on them are not in that figure.
Footnotes
Section titled “Footnotes”-
There is no relationship/affiliation between CodeFloe and Hetzner. ↩