Derfor byggede vi en self-hosted FOSS-infrastruktur i EU
by Rasmus Jensen, Founder & Software Engineer
1. Introduktion
Mange små softwarevirksomheder starter med at basere deres arbejde på Big Tech SaaS-platforme til hosting af kildekode, dokumentation, autentificering, overvågning og andre interne processer. Disse tjenester er nemme at komme i gang med, men over tid medfører de ofte stigende omkostninger, vendor lock-in og begrænset kontrol over, hvor og hvordan data opbevares.
I lyset af den ændrede geopolitiske situation og EU’s voksende fokus på digital suverænitet så vi også en klar værdi i at holde vores interne systemer og data fuldt under egen kontrol og placeret inden for EU. Som et lille dansk udviklingsteam tog vi derfor et skridt tilbage og kiggede kritisk på, hvad vi reelt har brug for for at kunne arbejde effektivt, sikkert og professionelt.

Vores krav viste sig at være bevidst enkle: Git-hosting, dokumentation, password management, identity, monitoring, pålidelige backups og filhåndtering. Vi har ikke behov for enterprise-scale workflow engines eller store automationsrammer. I stedet prioriterer vi stabilitet, forudsigelige omkostninger og fuld kontrol over vores interne miljø.
Dette førte os til at bygge en fuldt self-hosted intern platform baseret på FOSS (Free and Open Source Software). Selvom mange af de værktøjer, vi anvender, ikke er udviklet inden for EU, gør deres open-source-natur det muligt for os selv at drive dem på europæisk infrastruktur. I praksis afgøres jurisdiktion af, hvor softwaren kører – ikke hvor den er skrevet. Ved at hoste alt inden for EU sikrer vi, at al driftsdata forbliver under europæisk lovgivning og i overensstemmelse med EU’s forventninger til privacy og security.
2. Derfor bevægede vi os væk fra Big Tech
Vores beslutning om at bevæge os væk fra Big Tech-tjenester var i høj grad praktisk funderet. Som en lille virksomhed kan vi spare en betydelig mængde penge ved selv at hoste vores interne værktøjer. SaaS-platforme afregner typisk per bruger eller per feature, og disse løbende omkostninger vokser hurtigt – også selvom vores behov forbliver simple. Vores samlede platform koster i dag omkring 10–11 euro om måneden.
Den primære server er en Hetzner CX33-instans, som aktuelt koster cirka 5,49 euro om måneden og leverer 4 vCPUs, 8 GB RAM og 80 GB SSD. Krypterede backups lagres i Hetzners EU-baserede Object Storage, som koster 4,99 euro om måneden og inkluderer 1 TB storage samt 1 TB trafik, før eventuelt merforbrug faktureres. Disse priser er stabile og forudsigelige. Der er ingen ekstra omkostninger for flere brugere, repositories, passwords eller dokumentation, hvilket gør det muligt for os at skalere vores arbejde uden at skalere vores udgifter.
Samtidig undgår vi unødig kompleksitet. Store SaaS-platforme indeholder ofte omfattende enterprise-features, som vi ikke har behov for. Ved at vælge FOSS-værktøjer, der præcist dækker vores behov, reducerer vi den operationelle overhead og fjerner afhængigheden af eksterne leverandører. Fordi vi selv hoster hele platformen, bestemmer vi selv, hvor længe logs opbevares, hvordan adgang styres, og hvordan authentication er konfigureret. Det gør arbejdet med at opnå og vedligeholde overensstemmelse med ISO 27001 både enklere og mere omkostningseffektivt.
3. FOSS-værktøjer og EU-dataplacering
De værktøjer, vi anvender, er ikke udelukkende udviklet i EU, men de er reelle open-source-projekter med OSI-godkendte licenser såsom Apache 2.0, MIT, AGPLv3 og GPLv3. Det giver os fuld kontrol over, hvordan softwaren afvikles, og hvordan data behandles.
Dataplacering og hvilken lovgivning data er underlagt, afhænger af, hvor serverne fysisk er placeret, ikke af hvor udviklerne befinder sig. Da vi hoster alle services på Hetzner-servere placeret inden for EU, forbliver alle logs, autentificeringshændelser, backups, dokumentation og filer inden for EU’s grænser og underlagt europæisk lovgivning. Ingen udenlandske cloud providers behandler vores interne data. Det understøtter både privacy-krav, sikkerhedsforventninger og langsigtet stabilitet.
4. Privat EU-baseret netværk og VPN-adgang
Vores miljø kører udelukkende i et privat netværk hostet inden for EU. Ingen af de interne services er eksponeret mod det offentlige internet. Den eneste komponent, der er offentligt tilgængelig, er WireGuard VPN-porten. Når teammedlemmer er autentificeret via WireGuard, får de adgang til et sikret internt miljø, som udelukkende anvender private IP-adresser. Det skaber en enkel og stærk sikkerhedsafgrænsning, som begrænser eksponering og reducerer angrebsfladen.
5. Centraliseret identitet med Keycloak og FIDO2
Identitet er et centralt element i vores sikkerhedsmodel og i vores forberedelse til ISO 27001. Vi anvender Keycloak til authentication, multi-factor authentication og single sign-on.

Administrative konti skal autentificere sig med FIDO2-hardwarekeys, hvilket markant reducerer risikoen for phishing og password-baserede angreb og samtidig understøtter en stærkere kontrol med privilegeret adgang. Adgangsrettigheder styres via Keycloak-grupper, så alle services følger den samme konsistente identitetsmodel med sporbare rettigheder og klar rolleopdeling.
6. Interne produktivitetsværktøjer baseret på FOSS
Til det daglige udviklingsarbejde anvender vi Gitea til source code hosting og let projektstyring, Wiki.js til dokumentation og ISO-processer, Vaultwarden til password management og Nextcloud til intern filhåndtering.

Gitea dækker vores behov for planlægning og koordinering gennem indbyggede issues, milestones og project boards. Det betyder, at vi ikke har behov for en separat project management-platform med sin egen adgangsmodel.
Nextcloud giver os praktisk filhåndtering og deling, samtidig med at løsningen passer ind i vores identity-first tilgang. Vi integrerer Nextcloud med Keycloak og anvender gruppebaseret adgangsstyring, så rettigheder forbliver konsistente på tværs af vores interne services. Det gør filadgang sporbar og undgår problemet med separate logins og separate tilladelser, som ofte opstår, når mange SaaS-værktøjer kombineres.
Alle services kører i Docker og autentificerer sig via Keycloak. Værktøjerne er letvægtige, stabile og nemme at vedligeholde. Da de er self-hosted, forlader vores repositories, dokumentation, filer og credentials aldrig EU-kontrolleret infrastruktur.
7. HTTPS, reverse proxy og certifikathåndtering
Vi anvender Nginx som reverse proxy til at håndtere HTTPS for alle interne services. Certifikater udstedes automatisk via DNS-01-validering fra Let’s Encrypt. Det sikrer kryptering af al trafik uden at kræve yderligere offentlig eksponering af services ud over VPN-endpointet.
8. Logging, metrics og overvågning af autentificering
Log-opsamling og overvågning håndteres af Promtail, Loki, Prometheus og Grafana. Promtail videresender logs fra alle services til Loki, og Grafana leverer visuelle dashboards, som er sikret via Keycloak. Prometheus indsamler metrics på tværs af platformen, herunder fejlede loginforsøg, lockouts og performance for autentificering fra Keycloak.
Det giver os mulighed for tidligt at opdage usædvanlig aktivitet og opretholde et højt niveau af overblik. Disse funktioner understøtter ISO 27001-kravene til overvågning og hændelsesdetektion.
9. Krypterede backups og disaster recovery
Vi anvender Restic til at udføre krypterede backups af alle kritiske komponenter, herunder Keycloak, Gitea, Wiki.js, Vaultwarden, Nextcloud-data, konfigurationsfiler og TLS-certifikater.

Backups opbevares i Hetzners EU-baserede Object Storage. Restore-tests gennemføres regelmæssigt for at sikre pålidelig gendannelse. Alle backups forbliver inden for EU og er fuldt krypterede.
10. Hardening og ISO 27001-alignment
Vi følger en struktureret hardening-proces, som omfatter håndhævelse af MFA, least privilege-adgang, log-retention, rotation af credentials, løbende gennemgang af VPN-peers samt ensartet konfiguration af services. Ved at køre hele platformen i et kontrolleret miljø med centraliseret logging og identitet bliver arbejdet med at opnå og vedligeholde overensstemmelse med ISO 27001 væsentligt enklere.
11. Kontrollerede integrationer med en MCP-server
I takt med at vi forbedrer produktiviteten, ønsker vi også at forbedre, hvordan vores interne systemer forbindes til udviklerværktøjer og AI-assistenter, uden at gå på kompromis med sikkerhed eller compliance.

Vi planlægger at bygge en MCP-server (Model Context Protocol server), som kan forbinde til Wiki.js og Gitea på en kontrolleret måde. Målet er ikke at eksponere alt. Målet er at tilbyde en stramt afgrænset integrationsflade med klare regler, så vi kan understøtte nyttig automatisering og samtidig forblive compliant.
I praksis betyder en compliant MCP-tilgang, at vi kan:
- begrænse hvilke repositories, issues og wiki-områder der kan tilgås
- håndhæve authentication og authorization via Keycloak
- logge og auditere alle requests og responses, der passerer gennem integrationen
- anvende rate limiting, token-scoping og miljøadskillelse
- forhindre utilsigtet datalækage ved at begrænse, hvad MCP-serveren må returnere
Det er det samme designprincip, vi anvender resten af platformen. Vi foretrækker små, veldefinerede integrationspunkter med stærk identitetskontrol frem for bred adgang fra mange forskellige værktøjer.
12. Konklusion
Ved at opbygge en self-hosted platform, der udelukkende er baseret på FOSS og drives på EU-baseret infrastruktur, har vi skabt et sikkert, omkostningseffektivt og transparent miljø, som matcher behovene hos et lille dansk udviklingsteam. Vi har fuld kontrol over identitet, logging, dokumentation, filer, passwords, overvågning og backups. Vores data forlader aldrig europæisk jurisdiktion, vores omkostninger forbliver forudsigeligt lave, og vores interne platform er fuldt under vores egen kontrol.
Denne tilgang giver os stabilitet, uafhængighed og et solidt fundament for at arbejde i overensstemmelse med ISO 27001. Den understøtter vores daglige arbejde uden unødig kompleksitet og sikrer, at vores interne systemer forbliver fuldstændigt under vores egen styring.