$ whoami

Florian Voit

Full-stack developer with a soft spot for PHP and Symfony – and just as much a sysadmin. As Team Lead Storage at Hetzner I move Storage Box and Storage Share forward together with the team – from running the servers to the software that turns them into products.

1<?php
2
3namespace Eu\Voit;
4
5use Com\Hetzner\Attribute\AsTeamLead;
6use Com\Hetzner\Employee;
7use Com\Hetzner\Storage\Product;
8use Eu\Voit\Florian\Idea;
9
10// Team Lead Storage at Hetzner
11#[AsTeamLead(team: 'Storage', at: 'Hetzner')]
12final readonly class Florian extends Employee
13{
14 public function __construct(
15 public array $code = ['PHP', 'Symfony', 'Rails', 'Go'],
16 public array $ops = ['Debian', 'Ubuntu', 'Puppet'],
17 public string $fs = 'ZFS',
18 public string $servers = '2000+',
19 public string $scale = '200+ PB',
20 public array $products = ['Storage Box', 'Storage Share'],
21 public array $offline = ['dog', 'travel', 'homelab'],
22 ) {}
23
24 public function __invoke(Idea $idea): Product
25 {
26 return $this->build($idea, withTeamwork: true)->ship();
27 }
28}
PHP · UTF-8 · LFLn 26, Col 64

// infrastructure at scale

Thousands of servers. Run with code.

As a team we build and run Storage Box and Storage Share – on infrastructure of several thousand servers running Debian and Ubuntu. ZFS keeps the data together, Puppet keeps the whole fleet in shape.

2,000+
Servers in production
200+ PB
Storage in production
ZFS
File system under all data
2 products
Storage Box & Storage Share

// 01 about

Developer. Sysadmin. Both.

Florian Voit – black-and-white portrait in a suit

I have been in IT since 2013 – starting with my apprenticeship at Hetzner, first in systems integration in DC support, then in application development. Code is what stuck: PHP and Symfony are my tools of choice, from the data model to the UI. I know Ruby on Rails well, and I am currently taking a closer look at Go.

I never left systems integration behind, though: Debian and Ubuntu, ZFS as the foundation and Puppet for everything that has to be reproducible are as much part of my toolkit as PHP.

At Hetzner I am the team lead of the storage team. I do not see myself as the boss: I still like to be hands-on, see myself as a mentor – and above all as part of the team that moves the product forward together. We own Storage Box and Storage Share end to end: development, operations and support, from provisioning to customer requests.

What drives me? Seeing how many servers and how much data we run reliably as a team – and how well customers take to the products. When building software I care about clean work, good reviews and tests. And the courage to ship the 80 % solution: the last 20 % usually cost more than they are worth. Pareto would be proud.

role
Team Lead Storage
employer
Hetzner
products
Storage Box, Storage Share
location
Zwickau
age
29 years
in IT
since 2013
languages
German · native
English · fluent
French · basic
personal
Married, Theo the dog, travel, gaming, homelab

// 02 stack

Code and infrastructure. From one pair of hands.

Writing the software and running the servers it runs on – both with the same care.

Programming

src/
PHP

My main language – PHP 8.4, strictly typed, tested with Codeception.

Symfony

My main framework – for management interfaces, console tools and APIs, with plenty of Symfony Messenger.

// A Symfony rate limiter protects the treat jar from Theo. (sample code)

namespace Eu\Voit\Dog;

use Eu\Voit\Dog;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\RateLimiter\RateLimiterFactory;

final readonly class TreatDispenser
{
    public function __construct(
        private RateLimiterFactory $treatsLimiter,
    ) {}

    public function __invoke(Dog $dog): Response
    {
        $limit = $this->treatsLimiter->create($dog->name)->consume();

        return $limit->isAccepted()
            ? new Response('Treat dispensed.')
            : new Response("Nice try, {$dog->name}.", 429);
    }
}
GitVersioning, reviews, a clean history
LTS
BashSmall helpers and automation in day-to-day ops
LTS
SQLDesigning schemas, tuning queries, analysis & reporting
LTS
Ruby on RailsEvolving existing applications – mostly the backend
stable
HTML, CSS, JavaScriptFunctional frontends, built from the backend
stable
RedisCaching, sessions, queues and locks
stable
RabbitMQAsynchronous jobs and decoupling services
stable
GoBackend, tools & services – currently levelling up
beta

Operations

/etc/
Debian / UbuntuSeveral thousand servers – plus a few at home
LTS
DockerServices and builds in containers
LTS
PuppetThe fleet as code – now and then with my own modules
stable
ZabbixMonitoring and alerting – mostly in use, we build templates and triggers ourselves too
stable
GitLab CI/CDTests, builds and deployments as pipelines – for this site, too
stable
PackerBuilding OS images automatically and reproducibly
stable
NGINXWeb server and reverse proxy – here for voit.eu, too
stable
Grafana & PrometheusDashboards and metrics – at work and in the homelab
stable

Storage & databases

/srv/
ZFSSnapshots, checksums, replication
LTS
Storage BoxIn the team as lead – and a customer at home
LTS
Storage ShareIn the team as lead – and my own cloud at home
LTS
NextcloudThe base of Storage Share – run and developed in the team
LTS
MariaDB / Galera ClusterRunning highly available database clusters
stable
PostgreSQLFor applications – at work and at home
stable
MongoDBWhen the schema has to stay flexible
stable

// TODO?To be honest: my full stack stops at design – UI/UX is not my strong suit. That is why an AI designed this site – the content is mine. In general, AI has become a fixed part of my toolbox: it is strong at concepts and first ideas, but I never blindly trust the code it generates. Pure vibe coding is not my thing – *cough* except maybe for the design of this site.

// 03 career

My career as a traceroute.

Every hop is a stop. Pick a hop for details.

$ mtr --report florian.voit.eu
#HOSTLoss%SntFromTo
Destination reached. One detour with packet loss – the route via practice proved more stable.

hop 7

Team Lead Storage

teamlead.storage.hetzner.fsn.de · 07/2025 – today

With growth, storage became its own team in July 2025. Lead since then: together we develop, run and support Storage Box and Storage Share.

  1. Team Lead Storage 07/2025 – today · teamlead.storage.hetzner.fsn.de

    With growth, storage became its own team in July 2025. Lead since then: together we develop, run and support Storage Box and Storage Share.

  2. Business informatics degree (discontinued) 06/2021 – 06/2025 · business-informatics.iu.online.de

    Alongside my job I studied business informatics online at IU and got through a good half of it. Then I deliberately stopped: hands-on practice simply suits me better.

  3. Software Developer / DevOps Engineer · Storage ~2020 – 06/2025 · devops.storage.hetzner.fsn.de

    Together with a few colleagues the idea came up to offer Storage Shares based on Nextcloud – I helped build the management backend. Then subject-matter lead for storage in the team, the one keeping the overview. Big project: migrating the storage systems to a new operating system whose OS image is built automatically in a pipeline.

  4. Software Developer / DevOps Engineer · internal software development 07/2016 – ~2020 · devops.development.hetzner.fsn.de

    Lead developer of the internal ERP system. Alongside, day-to-day operations – Storage Boxes and, early on, the old VQ/VX vServers – including customer requests. Plus running the central internal communication platform.

  5. Apprenticeship, IT specialist for application development 08/2015 – 07/2016 · fiae-apprentice.development.hetzner.fsn.de

    Switched specialisation to application development – from the data center to internal software development at Hetzner.

  6. Apprenticeship, IT specialist for systems integration · DC support 08/2013 – 07/2015 · fisi-apprentice.dc-support.hetzner.fsn.de

    Starting at Hetzner Online GmbH: apprenticeship as an IT specialist for systems integration in data center support.

  7. Secondary school certificate — – 07/2013 · realschulabschluss.pestalozzischule.zwi.de

    Secondary school certificate (Realschulabschluss) at Pestalozzischule in Zwickau.

// 04 personal

Away from the rack.

There is more to life than work: I am married, a dog person, love gaming and the Harry Potter films, get on my bike now and then – and tinker with my homelab after hours.

$ cat ~/personal/travel.txt18 destinations · 7 countries · 3 continents

Where I have been

pick a country to zoom in

City trips are my thing – and the USA most of all: the sheer size of the country impresses me as much as its cities, and in Northern Michigan we have something like a second home – with a second family. We have covered the East Coast pretty well, the West Coast is next. On the wish list: Canada, Australia, Japan. Beach holidays? Only if I have to.

World map with visited countries
Pick a country below – the map zooms in and shows the places.

Dog person

~/personal/theo.txt

Theo, our French Bulldog (born in May 2025), is a real bundle of energy: agility and target training are his thing – at 7 pm sharp he turns into a couch potato. He is right in the middle of puberty, a stubborn head as typical for the breed, and keeps us on our toes.

name
Theo
breed
French Bulldog
born
May 2025
$ fetch --ball → only reliable with --treat
in memoriam Maylo French Bulldog · 2013 – Nov 2023

Our first dog. Life was not easy for him before he came to us in December 2017 – with us he was a couch potato through and through. Apart from us and our closest friends, he could not stand pretty much anyone.

$ zfs set readonly=on voit.eu/personal/maylo → Read‑only. Forever.

Homelab

~/personal/homelab.md

What works in the data center gets tried out at home on a small scale – and the other way round. Smart home, photos, documents, mail, passwords and single sign-on are all self-hosted. What I am proudest of is my smart home: a surprising amount in our flat now runs on its own. The details stay on the LAN.

$ nmap homelab.voit.internal — Failed to resolve.

// 05 terminal

Ask the shell.

A small terminal with its own file system. Try ls, cd and cat – Tab completes commands and paths.

flo@voit: ~ · bashTab ⇥ completes

// 06 contact

ping florian

Latency varies, packet loss is low. For an informal exchange – about PHP, storage or homelabs – email or LinkedIn work best. Recruiting requests end in 403 Forbidden: I am happy at Hetzner. And support for Hetzner products goes through the official channels.

// professional

mail On click – keeps spam bots out
linkedinin/florian-voitopens in a new tab
xingFlorian_Voit3opens in a new tab

// personal

instagram@N4IR0opens in a new tab
githubN4IR0opens in a new tab