Rootmanual:dotnet
En kort sammanfattning av hur nuvarande Medreg, som är skrivet i C# och .NET 6+, satts upp, vilket säkerligen skulle gå att applicera åtminstone delvis även på andra Asp.Net-system.
Installera SDK
För en redhat-lik distribution bör det räcka med
dnf install dotnet-sdk-7.0
Vill man köra konsolprogram eller liknande är det allt som behövs göras, vill man sätta upp en webbtjänst behöver den förstås sättas upp exempelvis enligt nedan.
Alternativt, om man bara vill installera runtime (vilket dock innebär att du behöver bygga artefakterna någonstans där sdk är installerat istället) så kan man göra
dnf install aspnetcore-runtime-7.0
Motsvarande kommandon finns för andra distributioner, se https://learn.microsoft.com/en-us/dotnet/core/install/linux
Sedan kan man checka ut och bygga, förslagsvis i releasekonfiguration
dotnet publish --configuration Release
Kopiera sedan bin/Release/net6.0/publish/* till lämplig plats, i medregs fall t.ex. /var/www/medreg/
Sätta upp systemd-tjänst
För medreg skapades en fil /etc/systemd/system/kestrel-medreg.service med ungefär nedanstående innehåll
[Unit] Description=Kestrel host for .net medreg [Service] WorkingDirectory=/var/www/medreg ExecStart= /usr/bin/dotnet /var/www/medreg/MedregWeb.dll Restart=always # Restart service after 10 seconds if the dotnet service crashes: RestartSec=10 KillSignal=SIGINT SyslogIdentifier=dotnet-medreg User=www-data Environment="ASPNETCORE_ENVIRONMENT=Production" Environment="DOTNET_CLI_TELEMETRY_OPTOUT=1" Environment="DOTNET_PRINT_TELEMETRY_MESSAGE=false" Environment="LC_ALL=sv_SE" Environment="Keycloak__Authority=https://login.lysator.liu.se/auth/realms/Lysator" Environment="Keycloak__ClientId=..." Environment="Keycloak__ClientSecret=..." Environment="ConnectionStrings__Db=server=localhost;user id=...;password=...;database=...;charset=utf8mb4;ConvertZeroDateTime=true" Environment="MysqlVersion=10.5.15" Environment="Kestrel__Endpoints__HttpsInlineCertAndKeyFile__Url=https://localhost:5000" Environment="Kestrel__Endpoints__HttpsInlineCertAndKeyFile__Certificate__Path=/var/www/localhost.pem" Environment="Kestrel__Endpoints__HttpsInlineCertAndKeyFile__Certificate__KeyPath=/var/www/localhost-key.pem" [Install] WantedBy=multi-user.target
Diverse konfigurering du vill hämta ur ett IConfiguration lägges med fördel här (t.ex. inställningar för den client du satt upp i keycloak om du nu använder keycloak, databasanslutning, ...) istället för att försöka förlita sig på application-settings.json osv. ("__" ersätter här, precis som i Azure, ":" när det gäller navigering av motsvarande json-träd i en sådan fil)
eventuellt därefter
systemctl daemon-reload
För certifikatet har jag använt mkcert för att på ett enkelt sätt få till ett certifikat för { medreg medreg.lysator.liu.se localhost 127.0.0.1 ::1 } som litas på av den lokala servern, istället för att köra med ett servern inte litar på eller helt utan tls. Den funktionalitet som dotnet-sdk självt har för detta (dotnet dev-certs) fungerar åtminstone i skrivande stund bara på windows och macos.
Sedan kan du starta och enablea den nya tjänsten, och om allt stämmer ska nu en kestrelserver svara på port 5000 på localhost.
Nginx
Istället för att webbservern Kestrel, som med fördel används för Asp.Net, pratar direkt med internet (vilket förvisso går bra att göra med om man känner för det) så har den här satts bakom en nginx som agerar reverse proxy.
Proxyinställningarna kan se ut ungefär såhär:
location / { proxy_pass https://[::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; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; } add_header X-Frame-Options "SAMEORIGIN"; large_client_header_buffers 4 32k;
För TLS kan man med fördel använda certbot för automatiskt utfärdande och förnyande av letsencrypt-cert.