Skip to content
CodeFloe

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” 😉️.

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.

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.

NameEnvCPUMemDiskOSGB 6 SCUsed forCosts/m (€)
artemisprodAMD Ryzen 7 PRO 8700GE64 GB DDR5 ECC2x 500 GB SAMSUNG MZVL2512HCJQ-00B0 NVMEAlma102676CI/CD57.30
ci-arm1prodAmpere Neoverse-N1 (CAX41)32 GB160 GB NVME SSDAlma101037 (ref.)CI/CD-
miscprodAmpere Neoverse-N1 (CAX21)8 GB80 GB NVME SSDAlma101079CI/CD, status, Forum, website6.49
git-devdevAmpere Neoverse-N1 (CAX11)4 GB40 GB NVME SSDAlma91035Git3.79
misc-devdevAmpere Neoverse-N1 (CAX11)4 GB40 GB NVME SSDAlma91035CI/CD, status, Forum3.79
pgnode1-devdevAmpere Neoverse-N1 (CAX11)4 GB40 GB NVME SSDAlma91035DB3.79
pgnode2-devdevAmpere Neoverse-N1 (CAX11)4 GB40 GB NVME SSDAlma91035DB3.79
pgnode3-devdevAmpere Neoverse-N1 (CAX11)4 GB40 GB NVME SSDAlma91035DB3.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.

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.

HostClusterModelCPUThreadsMemGB 6 SCRental/m (€)
zeuslocalAX102AMD Ryzen 9 7950X3D32128 GB2872 (ref.)112.00
heralocalEX101Intel Core i9-1390032128 GB3040 (ref.)~200.00
apollolocalEX101Intel Core i9-139003264 GB3040 (ref.)81.00
poseidonlocalEX101Intel Core i9-139003264 GB3040 (ref.)78.00
athenaCephAX102AMD Ryzen 9 7950X3D32128 GB2872 (ref.)not yet set
hephaestusCephAX102AMD Ryzen 9 7950X3D32128 GB2872 (ref.)not yet set
hermesCephAX102AMD Ryzen 9 7950X3D32128 GB2872 (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.

NameEnvHostvCPUMemGB 6 SCDiskOSUsed forHost shareCosts/m (€)
local-zeus-codefloe-ci-1prodzeus822 GB2872 (ref.)40 GB + 500 GBAlma10CI/CD25.0 %28.00
local-hera-codefloe-ci-2prodhera816 GB3040 (ref.)40 GB + 800 GBAlma10CI/CD25.0 %~50.00
local-poseidon-codefloe-ci-3prodposeidon1632 GB3040 (ref.)15 GB + 500 GBAlma10CI/CD50.0 %39.00
local-hera-codefloe-db-1prodhera416 GB3040 (ref.)40 GB + 800 GBAlma10DB12.5 %~25.00
local-apollo-codefloe-db-2prodapollo416 GB3040 (ref.)40 GB + 800 GBAlma10DB25.0 %20.25
local-poseidon-codefloe-db-3prodposeidon416 GB3040 (ref.)40 GB + 800 GBAlma10DB25.0 %19.50

Every host here is an identical AX102, so the reference score is the same for all four VMs.

NameEnvHostvCPUMemDiskOSUsed forHost shareCosts/m (€)
ceph-ax102-forgejo-1prodhephaestus832 GB20 GB + 20 GB + 400 GBAlma10Git, HAProxy, indexers25.0 %not yet set
ceph-ax102-codefloe-pages-1prodathena48 GB40 GB + 10 GB + 32 GBAlma10Pages12.5 %not yet set
ceph-ax102-codefloe-pages-2prodhephaestus48 GB40 GB + 10 GB + 32 GBAlma10Pages12.5 %not yet set
ceph-ax102-codefloe-pages-3prodhermes48 GB40 GB + 10 GB + 32 GBAlma10Pages12.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.

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.

PoolTypeArchCountLocationvCPUMemDiskCosts/m (€)
cp-nbgCX23amd641nbg124 GB40 GB3.99
cp-nbg2CX23amd641nbg124 GB40 GB3.99
cp-helCX23amd641hel124 GB40 GB3.99
worker-arm64-smallCAX21arm643nbg148 GB80 GB19.47
worker-x86-cx-smallCX33amd643nbg148 GB80 GB19.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.

NameEnvCPUMemDiskOSGB 6 SCUsed forCosts/m (€)
gaiaprodApple M432 GB DDR51x 500 GB APPLE SSD AP0512ZmacOS 263781CI/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.

  1. There is no relationship/affiliation between CodeFloe and Hetzner. ↩