Kan AI helpen om Umbraco 15 op Linux te draaien?

Ingediend door Dirk Hornstra op 28-apr-2025 21:28

In mijn vorige blogpost over het verwerken van de PDF van de Top 2000 kwam ChatGPT niet echt goed uit de verf. Want de acties die ChatGPT uitvoerde waren "goed bedoeld" maar hielpen mij niet echt verder.

Uit ervaringen op het werk weet ik dat ChatGPT wel geschikt is als een "pair programmer". Je wilt wat programmeren, hebt wat inspiratie nodig, stelt vragen aan ChatGPT, deze geeft wat antwoorden. Die gebruik je, pas je aan naar wat jou goed lijkt en vervolgens loop je tegen wat problemen aan. Die meld je dan weer aan ChatGPT die gaat beredeneren wat er aan de hand kan zijn, komt met mogelijke oplossingen en vaak krijg je op die manier iets werkend. Waarschijnlijk zul je die gegevens ook wel vinden als je op Google zoekt, alleen is het dan bladeren door de verschillende blogs en moet je waarschijnlijk meerdere pagina's bekijken (en hopen dat die persoon het goed beschreven heeft). Met ChatGPT krijg je een soort stappenplan die je "gewoon" kunt volgen.

Zo ook in dit geval, ik wil wat meer met Umbraco doen, het open-source CMS wat we bij TRES ondersteunen en "aan de man/vrouw brengen". Daar had ik flink wat jaren geleden al wat mee gedaan, toen kon je Umbraco alleen maar op Windows draaien (omdat het .NET Framework was). Die hosting heb ik nog steeds en kost mij 233 euro per maand. Bij TransIP heb ik een VPS die ik begin dit jaar naar AlmaLinux geüpgrade heb. Daar kun je geen Framework-projecten op draaien, maar Umbraco is al een tijdje overgestapt naar .NET Core. Dat draait op Windows én op Linux (en ik vermoed ook op MacOS). Daar betaal ik rond de 36 euro per maand voor.

Ik typ dit artikel op vrijdag en dat komt goed uit, 1 van mijn planning-punten op vrijdag is "extra inkomsten". Maar het kunnen besparen op je uitgaven is ook "extra inkomsten". Als ik dit over "zou kunnen zetten" scheelt me dat 197 euro per maand... Toch wel de moeite waard ;)

Eerst maar eens mijn test-omgeving opzetten.

1. Configuratie nginx

Bij de installatie van AlmaLinux was volgens ook al .NET 9 geïnstalleerd, dus de basis is er. Ontwikkelingen gaan door, zo ook de versies, dus eerst maar eens kijken of ik de SDK van .NET 9 bij kan werken.
Hiervoor voer ik onderstaand commando uit:



sudo dnf install -y dotnet-sdk-9.0
 

Ik krijg echter een fout over MariaDB. Dat was misschien nog een eerdere update o.i.d., maar dat blokkeert nu dus mijn installatie van .NET 9. Op basis van deze pagina kwam ik er achter dat versie 10.4 niet meer beschikbaar was, dus "even aanpassen naar versie 10.5" was voldoende (sudo vi /etc/yum.repos.d/MariaDB.repo).

ChatGPT gaf mij al wat opties over hoe ik zaken in NGINX in moest stellen, maar het werd mij iets gemakkelijker gemaakt. Als je in Plesk zit en je gaat naar het domein waar je site wilt draaien, dan heb je op het tabblad Hosting & DNS het item Apache & nginx. Klik daarop. Haal het vinkje weg bij Proxy mode en klik op OK. Daarmee zorg je dat het verkeer naar deze URL niet meer doorgestuurd wordt naar Apache. Vervolgens heb je het blok additional nginx directives, daarin vul je deze data:



location /{
    proxy_pass http://127.0.0.1:5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection keep-alive;
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}
 

Hiermee zorg je dat als je straks de applicatie via dotnet draait, deze onder water doorgegeven wordt.

2. Configuratie Umbraco

Op de pagina van Umbraco staat uitgelegd hoe je de meest recente versie kunt installeren, ik doe het voor het gemak in Visual Studio. Vervolgens ga ik het project publiceren. Die bestanden zet ik via FTP over naar de server. Ga ik later vast anders doen, maar nu wil ik het "gewoon werkend krijgen".
Ik kies voor een Folder Profile en Target Runtime zet ik op linux-x64, ik publiceer het project en zet het (als voorbeeld) via FTP over naar de VPS op /var/www/html

3. Configuratie .NET opstarten

Wat je nu kunt doen is eerst via SSH inloggen op je VPS-omgeving. Je gaat naar de locatie waar de bestanden staan (in mijn voorbeeld /var/www/html) en doet dan een dotnet projectbestand.dll. "projectbestand" is de naam van hoe jouw Visual Studio Project heet (zo zal de DLL dan ook heten). Als dit goed gaat, dan zou je in jouw browser naar https://jouwsite kunnen browsen en zou je het installatiescherm van Umbraco moeten zien (dat deed ie bij mij wel).

Alleen.. dat moet natuurlijk automatisch. Zodra jouw SSH verbinding afgebroken wordt, draait je website niet meer.

Je maakt "dus" een service aan die automatisch opstart:



cd /etc/systemd/system
sudo vi jouwwebapplicatie.service

-- INHOUD START

[Unit]
Description=jouw omschrijving
After=network.target

[Service]
WorkingDirectory=/var/www/html
ExecStart=/usr/bin/dotnet /var/www/html/jouwwebapplicatie.dll
Restart=always
RestartSec=10
SyslogIdentifier=jouwwebapplicatie
User=geldige-username-op-dit-systeem-die-voldoende-rechten-heeft
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy=multi-user.target


-- INHOUD EINDE


sudo systemctl daemon-reexec
sudo systemctl enable jouwwebapplicatie
sudo systemctl start jouwwebapplicatie

-- en voor controle:
sudo systemctl status jouwwebapplicatie

Hiermee heb ik een werkende Umbraco 15 test-omgeving draaien. Tijd om te experimenteren!

4. One more thing...

Ik ga hier meerdere sites op draaien. En dan kun "dus" niet standaard het bovenstaande kopiëren. Die site van zonet draait op localhost:5000. Maar je "nieuwe/extra" site zou standaard ook op die poort draaien: kan niet, want is al in gebruik. Dus die zet je bijvoorbeeld op poort 5001.
Hiervoor voeg je het onderstaande toe in nieuwe-site.service (uitleg via Microsoft Learn):
 



Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=ASPNETCORE_URLS=http://localhost:5001
 

Extra uitleg

Voor de mensen die niet weten wat nginx is, nog even wat extra uitleg. Online was ik nginx wel eens tegengekomen, dat waren meestal websites "die het niet meer deden", en dan kreeg je een soort pagina te zien met onderaan iets van "nginx". Vorig jaar bij de migratie van de websites van TRES heb ik er meer mee te maken gekregen, hiermee konden we namelijk eerst "onder water" de website nog laten verwijzen naar de oude hosting en vervolgens naar de nieuwe hosting, zonder nogmaals de DNS te hoeven aanpassen.

Als IT-er heb je natuurlijk wel van proxy-servers gehoord. Dat zijn servers die vaak binnen jouw interne netwerk zitten en zorgen dat internet-verkeer lokaal gecached wordt, zodat het dataverkeer beheersbaar blijft. Stel je voor dat je op een school zit met 2.000 studenten en die gaan 's morgens allemaal even op telegraaf.nl kijken of er nieuws is (20 jaar geleden was dit een geldige case, inmiddels checken alle scholieren hun mobiel, maar voor dit voorbeeld doen we net alsof het 20 jaar geleden is). Naast de homepage van de Telegraaf worden er stylesheets, afbeeldingen, javascript-bestanden, kleine filmpjes, reclame-afbeeldingen en "wat al niet meer" gedownload, 157 aanvragen, een kleine 6 MB. 2.000 x 6 MB = 12 Gigabyte. Is vast wel een nieuwsartikel wat interessant is, dus klik je door, nog zo'n hoeveelheid data. Dat waren ook de tijden dat je voor dataverbruik moest betalen. Het was dus zaak om er een proxyserver tussen te zetten, deze deed het eerste verzoek, de overige verzoeken kregen de content vanaf de proxyserver. Je ziet dat daar flink wat verkeer mee bespaard werd.

Nginx is een "proxy-service". Als je in stap 3 hierboven dotnet jouw.dll opstart, dan draait de website op http://localhost:5000. Maar vanaf "buiten" kun je daar niet bij, localhost is op jouw pc... jouw pc! Daarom zeg je tegen nginx: alle verzoeken die vanaf buiten binnen komen op dit pakket, onder water geef je door wat lokaal op poort 5000 staat te draaien. En waarschijnlijk kun je er nog wel meer dingen mee doen, misschien iets om later nog eens verder uit te gaan zoeken.