Zum Inhalt

Unter Ubuntu

In diesem Kapitel beschreiben wir beispielhaft die Installation von RESTCaptcha unter Ubuntu Server 24.04 LTS mit nginx als Reverse-Proxy.

Installation nginx

Überprüfe, ob Du nginx bereits installiert hast:

nginx -v

Sieht das Ergebnis wie folgt aus, musst Du nichts weiter machen und kannst gleich zum nächsten Abschnitt "Installation ASP.NET" springen:

nginx version: nginx/1.28.0

Sollte stattdessen Command 'nginx' not found erscheinen, musst Du nginx noch installieren:

sudo apt update && sudo apt install nginx

Zum Starten von nginx tippe folgendes ein:

sudo systemctl start nginx

Für einen Autostart beim Booten Deines Servers tippe folgendes ein:

sudo systemctl enable nginx

Teste anschließend, ob Du lokal die Standardwebseite von nginx aufrufen kannst:

wget -S --spider localhost

nginx-Standardwebseite

Die Standardwebseite von nginx wird für RESTCaptcha nicht benötigt. Du kannst und solltest sie deaktivieren:

sudo unlink /etc/nginx/sites-enabled/default
sudo systemctl reload nginx

Installation ASP.NET

RESTCaptcha benötigt das ASP.NET-Framework als Abhängigkeit.

Die Installation von ASP.NET Core 9 wird in der Microsoft-Dokumentation ausführlich beschrieben. Hier die Kurzfassung:

Zunächst musst Du das Paket-Repository hinzufügen:

sudo add-apt-repository ppa:dotnet/backports

Dann installierst Du die ASP.NET Core-Runtime:

sudo apt-get update && sudo apt-get install -y apt-transport-https 
sudo apt-get update && sudo apt-get install -y aspnetcore-runtime-9.0

Installation RESTCaptcha

Binaries kopieren

Lege einen neues Verzeichnis für RESTCaptcha (Beispiel: /usr/share/restcaptcha) an und kopiere die Binaries des aktuellen Release dort hinein.

Der folgende Bash-One-Liner macht das für Dich:

curl -sL -H "User-Agent: curl" https://api.github.com/repos/openpotato/restcaptcha/releases/latest | jq -r '.assets[] | select(.name | endswith(".zip")) | .browser_download_url' | head -n1 | xargs -I{} bash -c 'tmp=$(mktemp /tmp/restcaptcha.XXXX.zip); curl -L -H "User-Agent: curl" -o "$tmp" "{}"; sudo mkdir -p /usr/share/restcaptcha; sudo unzip -o "$tmp" -d /usr/share/restcaptcha; rm "$tmp"'

Jetzt konfigurieren wir Eigentümer und Zugriffsrechte für die Verzeichnisse:

sudo chown -R nginx:nginx /usr/share/restcaptcha
sudo chmod -R u=rwX,g=rX,o= /usr/share/restcaptcha

Lege unter /usr/share/restcaptcha eine neue Datei appsettings.Production.json an:

{
  "Serilog": {
    "Using": [
      "Serilog.Sinks.Console",
      "Serilog.Sinks.File"
    ],
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft.AspNetCore": "Warning",
        "Microsoft.AspNetCore.Hosting.Diagnostics": "Warning",
        "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information"
      }
    },
    "WriteTo": [
      { "Name": "Console" },
      {
        "Name": "File",
        "Args": {
          "path": "/var/log/restcaptcha/log-.txt",
          "rollingInterval": "Day",
          "retainedFileCountLimit": 14,
          "fileSizeLimitBytes": 10000000,
          "rollOnFileSizeLimit": true
        }
      }
    ]
  },
  "RestCaptcha": {
    "Sites": [
      {
        "name": "Meine Site",
        "description": "Meine Site, die RESTCaptcha nutzt",
        "siteKey": "Mein-Site-Schlüssel",
        "siteSecret": "AeyGWx3kQeyrDFCE5KDR",
        "validHostNames": []
      }
    ]
  }
}

Für den API-Webservice müssen wir eine Service-Datei anlegen:

sudo nano /etc/systemd/system/restcaptcha.service

Da kommt folgender Inhalt rein:

[Unit]
Description=RESTCaptcha Web Service

[Service]
WorkingDirectory=/usr/share/restcaptcha
ExecStart=/usr/bin/dotnet RestCaptcha.WebService.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=restcaptcha
User=nginx
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
Environment=ASPNETCORE_URLS=http://localhost:5030

[Install]
WantedBy=multi-user.target

Anschließend wird der API-Webservice gestartet

sudo systemctl daemon-reload
sudo systemctl enable restcaptcha.service
sudo systemctl start restcaptcha.service

Die folgende Überprüfung sollte erfolgreich sein:

sudo systemctl status restcaptcha.service

Nginx als Reverse Proxy

Erstelle eine neue Konfigurationsdatei für Nginx und füge folgenden Inhalt hinzu:

server {
    server_name  localhost;
    listen       127.0.0.1:8080;
    listen       [::1]:8080;
    root         /usr/share/restcaptcha.webservice;

    # Proxy request to Kestrel
    location / {
        proxy_pass         http://127.0.0.1:5030;
        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;
    }

    # redirect server error pages to the static page /50x.html
    error_page 500 502 504  /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

server {
    server_name  captcha.beispiel.de;
    listen       443 ssl; 
    root         /usr/share/restcaptcha.webservice;

    # Proxy request to Kestrel
    location / {
        proxy_pass         http://127.0.0.1:5030;
        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;
    }

    # redirect server error pages to the static page /50x.html
    error_page 500 502 504  /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    # Turn on http2 protocol
    http2 on;
}

Starte anschließend nginx neu:

sudo systemctl restart nginx

Der lokale folgende Test ruft den Health-Endpunkt von RESTCaptcha auf und sollte erfolgreich sein:

Invoke-WebRequest -Uri "http://localhost:8080/health" -UseBasicParsing

Für einen öffentlichen Test fehlt noch ein TLS-Zertifikat für unsere https-Bindung. Eine gute Möglichkeit ist die Nutzung von Let's Encrypt zum Erstellen von kostenlosne TLS-Zertifikaten.

Du musst dafür einen ACME-Client installieren. Einer der besten Clients für Linux ist Certbot. Installiere und starte Certbot. Sind alle Fragen beantwortet, kommuniziert Certbot mit Let’s Encrypt, erfragt ein TLS-Zertifikat für die Domäne captcha.beispiel.de und führt die notwendigen Änderungen in Deiner nginx-Konfigurationsdatei durch.

Ein Test in einem Web-Browser mit https://captcha.beispiel.de/health sollte jetzt erfolgreich funktionieren.

Let’s Encrypt und nginx

Eine ausführliche Einführung in das Thema findest Du in folgendem Blog-Post: HTTPS unter nginx/Ubuntu.