Doel
In vorige post implementeerde ik verschillende logische servers op mijn proxmox home-server machine:
“templ-ubuntu”, “home-devdepserver” en “home-utilityserver”.
Zie Architecture of my home server
.
Ik wil nu een eerste minimale demonstratie web-applicatie in Golang met een MariaDB database ontwikkelen,
gebruikmakend van de centrale repository voor source code opslag.
De applicatie dient daarna als OCI container opgeleverd te worden en in de centrale registry voor binaries opgeslagen te worden.
Daarna dient een applicatie-execution server-omgeving op mijn home-server aangemaakt te worden.
De aangemaakte containerized applicatie en database dient op deze server-omgeving vervolgens gedeployed te worden.
Hiervoor zal ik “home-testappserver” en “home-prodappserver” als logische servers installeren.
Als laatste wil ik deze gedeployde web-applicatie publiek toegankelijk maken via tunneling.
De applicatie moet kunnen opgeroepen worden via een link in de “Demo” pagina van mijn website op Cloudflare.
In deze post wil ik hiervoor mijn “virtueel datacenter” vervolledigen met communicatie middleware.
Het opruimen van bestaande “home-pve” en “home-backupserver” zal later volgen.
Na deze post krijgen we dan volgende situatie:
Met dit project werk ik de realisatie van al mijn ideeën voor de publieke website en een klein virtueel datacenter volledig af.
In volgend project wil ik starten met de verdere uitwerking van mijn ideeën over een moderne software-fabriek:
applicatie development tools, testing, security, CI/CD, OCI & Kubernetes en app/infra-monitoring.
Resultaat
1 - Aankoop en installatie van laptop
Ik kocht mijn eerste laptop en installeerde er Linux Mint als OS op.
Ik koos voor een gereviseerde business laptop, die geschikt is voor web development, aan een budget prijs.
Zie Architecture of my laptop
.
Deze Linux Laptop gebruikte ik om alle nieuwe software uit te testen en aan te leren.
In de toekomst ga ik volledig overstappen van Windows desktops naar enkel Linux desktops.
2 - Beveiliging van thuis-netwerk, servers, werkstations en software
Omdat ik applicaties in mijn thuisnetwerk toegankelijk wil maken vanuit het internet,
dien ik de toegang tot lokale resources beter te beveiligen.
Bezoekers bij mij thuis geef ik ook toegang tot mijn wifi-netwerk,
en ik wil hier tevens voorkomen dat deze toegang krijgen tot andere lokale resources dan het internet.
Ik bouwde daarom mijn toegangsbeveiliging uit en dit gebeurde op verschillende niveau’s.
Op netwerk-niveau probeerde ik firewall’s op routers en VLAN’s (virtuele LAN) te gebruiken.
Door gescheiden virtuele netwerken op 1 fysiek netwerk te voorzien,
kan ik internet bezoekers en wifi bezoekers thuis gescheiden houden van interne gebruikers.
Ik gebruik echter een router geleverd door mijn ISP die geen VLAN’s ondersteunt,
en dien daarom te wachten op een upgrade van mijn ISP.
De firewall-regels op mijn router laten nu alle uitgaand verkeer naar het internet toe,
maar blokkeren alle inkomend verkeer (dit zal ik later in deze post heel beperkt moeten wijzigen).
Op machine/OS-niveau heb ik voor alle machines firewall’s geinstalleerd en geconfigureerd.
Op mijn Windows desktop is dit de ingebouwde Windows firewall,
en op mijn Linux Mint laptop is dit de UFW firewall software.
Deze workstations laten alle uitgaand verkeer toe, maar blokkeren alle inkomend verkeer bij default.
Op mijn NAS/home-server werd proxmox als hypervisor OS geinstalleerd en die voorziet in een hierarchy van firewall’s.
Proxmox implementeert software-matig op de machine een eigen intern netwerk met een virtuele switch,
die alle lxc’s en vm’s verbindt met het home netwerk.
Op het node-niveau en elk lxc/vm-niveau voorziet proxmox een aparte firewall die geconfigureerd dient te worden.
Zie “Network and Firewall organization” sectie in Architecture of my home server .
Beveiliging voor iedere toegankelijke service/applicatie dient ook voorzien te worden.
Voor de ssh-service en gitea server software werd reeds beveiliging via ssh-keys geimplementeerd.
Desktop en Laptop workstation beschikken daarom over mijn persoonlijke private ssh-key,
en alle servers beschikken over mijn persoonlijke public ssh-key om gemakkelijk toegang te verlenen.
Voor zelfontwikkelde applicaties die publiek toegangelijk zijn,
voorzie ik enkel beveiligde https of vpn toegang na (paswoord) authenticatie door de gebruiker.
Meer uitleg over de gekozen authenticatie-software volgt later in deze post.
3 - Ontwikkeling van minimale demo web-applicaties in Go
3.1 - Ontwikkel demo_hello applicatie
Als eerste maakte ik een HelloWorld applicatie “demo_hello” aan in Golang (met prefix “example-” in Gitea).
Voor de implementatie werd de standaard net/http en html/template library in go gebruikt.
Ik koos Golang als programmeertaal omdat het een eenvoudige, performante taal is,
en echt geschikt om in containers/cloud te draaien.
Deze HelloWorld repo kan hierna gebruikt worden om de development van alle nieuwe golang projecten gemakkelijk te kunnen opstarten.
De repo bevat de te gebruiken github/gitea configuraties, local git configuraties, en de golang setup.
Het bevat ook een eenvoudige makefile om een compile, linter-ing en test workflow door automatisatie te vereenvoudigen.
Later zal ook andere pipeline-logica toegevoegd worden.
Op deze manier werd onmiddelijk bij de start een goede development workflow afgedwongen.
Zie Cheatsheet for golang beginners
voor meer uitleg.
Deze en alle volgende repositories voor applicatie-development zijn publiek toegankelijk in mijn GitHub / RobertTC32 account.
3.2 - Ontwikkel demo_todo applicatie
Daarna werd de “demo_todo” repo (met prefix “app-” in Gitea) aangemaakt met demo_hello repo als starter.
De repo-structuur werd voorzien om niet enkel golang source code te bevatten,
maar ook golang test code, sql script files, pipeline specificaties, etc.
Vervolgens heb ik dan een mariadb database aangemaakt met sql scripts voor creatie van db-objecten en testdata.
MariaDB is een razendsnel, open-source en erg populair relationeel databasebeheersysteem (RDBMS).
Het is een directe ‘fork’ van MySQL, opgezet door de oorspronkelijke ontwikkelaars.
Een mariadb database zal ik in latere projecten ook in kubernetes gebruiken (met horizontal scaling en backup),
en er dan performantietesten op uitvoeren.
Na de aanmaak van de databank werd een eerste versie van de demo_todo web applicatie ontwikkeld.
Deze toonde enkel de database-inhoud als todo-rijen in een tabel op het scherm.
3.3 - Deploy containerized web-applicaties op applicatie-server
Voor beide web applicaties maakte ik een zo klein mogelijke OCI-image,
en installeerde deze daarna op mijn test- en prod- applicatie servers.
Door een upgrade van Windows werkte plots “Docker” en “Docker Desktop” niet meer.
Ik heb dan “Podman Desktop” op mijn Windows desktop geïnstalleerd en uitgetest.
Na heel wat uittesten kon ik het probleem met docker ook oplossen.
Containerizatie en deployment gebeurden handmatig,
maar in volgende posts zullen we dit automatiseren (ansible).
Na het opstarten op de applicatie-servers, werden de web applicaties uitgetest binnen het thuisnetwerk.
4 - Maak web-applicatie publiek toegankelijk via tunneling
5 - Maak web-applicaties publiek toegankelijk zonder tunneling
6 - Voeg toegangsbeveiliging toe aan web-applicatie
