[~] BACK



~~ HIY (III) ~~

** WEBSERVER **

[HOW] | [20230227] | [0] | [0x17]




Nachdem die Struktur und die Vorraussetzungen geklärt sind, geht es jetzt ans Terminal. NixOS läuft auf der Hetzner Kiste und wartet quasi darauf was tun zu können. Geben wir ihr also was sie will und bauen den NGINX Server für die Domains inkl. TLS/SSL. Prinzipiell sollen auf dem Server drei Domains laufen. Natürlich die NERDBUDE, der Click! Clack! Hack! und natürlich auch das Damn Fine Keyboards. Vor dem Umzug waren diese Websites im Filetree der NERDBUDE verankert. Das soll nun natürlich nicht mehr der Fall sein, sondern die Websites sollen völlig unabhängig von einander gehostet werden. Dazu müssen im Vorfeld natürlich der CCH! und das DFK aus der NERDBUDE rausgekratzt werden. Hab ich getan - also hab ich jetzt drei selbstständige Websitestrukturen und es kann los gehen.

WEBSITESTRUKTUR


Als erstes müssen die ganzen HTML Files auf den Server. Ich denke das Default-Directory dafür ist /var/www/$websitename/. Also werden die einzelnen Strukturen per scp auf den Server geschoben. Natürlich wird hier $websitename mit dem eigentlichen Domainname ersetzt - also /var/www/clickclackhack/. Yeah - der Content ist schon mal da. Jetzt müssen wir NGINX nur noch sagen, dass der Content auch da ist.

CONFIGURATION.NIX

Die Konfiguration ist normalerweise recht simple und schnell erledigt. Ich hab allerdings einen Fehler gemacht. Mein Gehirn ist immernoch drauf getrimmt, Tools in einzelnen Configfiles zu konfigurieren. Unter NixOS machen wir das aber nicht und praktischerweise gibt es auch Fehlermeldungen dazu die einer/einem sagen, dass alles "Read-Only" ist. Irgendwann merkt sich das mein Hirn auch, dass wir doch alles in der configuration.nix definieren wollen. Also rein in die configuratio.nix. Grundlegend sieht die funktionierende configuration.nix wie folgt aus. Keine Sorge ich geh es gleich noch Schritt für Schritt durch.


configuration.nix
    { config, pkgs, ... }:
    let release = "nixos-21.11";
    in  {
      imports = [
        ./hardware-configuration.nix
    		})
    
        ];
    
    ### WEB SERVER
    
     services.nginx = {
    	enable = true;
    	virtualHosts."damnfinekeyboards.com" = {
    		enableACME = true;
    		forceSSL = true;
    		root = "/var/www/damnfinekeyboards/";
    		};
    	virtualHosts."nerdbude.com" = {
    		enableACME = true;
    		forceSSL = true;
    		root = "/var/www/nerdbude/";
    		};
    	virtualHosts."clickclackhack.de" = {
    		enableACME = true;
    		forceSSL = true;
    		root = "/var/www/clickclackhack/";
    		};
    	};
    	};
    
      security.acme.acceptTerms = true;
      security.acme.certs = {
    	"testbude.space".email = "post@testbude.space";
    	"damnfinekeyboards.com".email = "info@damnfinekeyboards.com";
    	"www.damnfinekeyboards.com".email = "info@damnfinekeyboards.com";
    	"nerdbude.com".email = "post@nerdbude.com";
    	"www.nerdbude.com".email = "post@nerdbude.com";
    	"clickclackhack.de".email = "info@clickclackhack.de";
    	"www.clickclackhack.de".email = "info@clickclackhack.de";
    	};
    
      boot.cleanTmpDir = true;
      zramSwap.enable = true;
      networking.hostName = "nb-main";
      networking.domain = "";
      services.openssh.enable = true;
      networking.firewall = {
    	enable = true;
    	allowedTCPPorts = [ 22 25 80 443 ];
    	allowedUDPPortRanges = [
    	  { from = 4000; to = 4007; }
    	  { from = 8000; to = 8010; }
            ];
    };
    
    ### SSH CERT FOR REMOTE ACCESS
    
      users.users.root.openssh.authorizedKeys.keys = [
        "ssh-rsa XXX"
      ];
    
    ### TOOLCHAIN
    
      environment.systemPackages = with pkgs; [
    
    	vim
    	git
    	unzip
    	openssl
    	goaccess
    	chkrootkit
    	service-wrapper
      ];
    }
  


That's it. Die komplette Config. Ok gehen wir den Kram mal durch.
Ganz am Anfang steht die übliche NixOS Config und die verlinkte externe hardware-configuration.nix - den Teil überspringe ich und fange ganz unten an. Im unteren Teil der configuration.nix finden sich die Tools die wir auf dem Server installieren wollen bzw. sollten damit das auch alles funktioniert. Ich hab mich dafür entschieden das ganze übersichtlich und minimalistisch zu halten. Je weniger Tools auf dem Server laufen, desto weniger Angriffsfläche bieten selbige auch. Die Tools die auf dem Server laufen sind folgende:


configuration.nix
    ### TOOLCHAIN
    
      environment.systemPackages = with pkgs; [
    
    	vim
    	git
    	unzip
    	openssl
    	goaccess
    	chkrootkit
    	service-wrapper
      ];
  


Ich denke die Liste ist selbsterklärend. Vim als Texteditor, git als Versionsverwaltungstool, unzip falls mal was entpackt werden muss, openssl für die SSL Zertifikatsgeschichten, goaccess ist ein ziemlich geiles Tool zur live Log Auswertung, chkrootkit als Tool zur Prüfung ob sich Rootkits auf dem Server befinden. Das hat folgenden Grund. Sobald irgendwo ein Server ans Netz geht, gibt es ein paar finstere Typen die sich daran zu schaffen machen. So gab es auch auf dem $NB_MAIN (so heißt die Hetzner Kiste übrigens) seltsame Aktivitäten direkt dach der Einrichtung. service-wrapper ist der Schnittstellen-Adapter für systemctl commands. [EDIT] fleaz hat mir den Tip gegeben, dass "nginx" gar nicht zusätzlich über die "systemPackages" installieren muss, da sich die configuration.nix zusammen mit der NGINX-Konfiguration darum kümmert, NGINX zu installieren. Es ist an dem Punkt also völlig überflüssig.
Die Tools sind installiert. Also gehts weiter mit der NGINX Konfiguration.

NGINX


NGINX ist unser Webserver. Der kümmert sich zum einen darum den Content, also die .html Files der Website, mit den Domains zu verknüpfen und zusätzlich noch SSL Zertifikate dafür zu generieren. Die Verknüpfung zu den Domains passiert in diesem Abschnitt:


configuration.nix
     services.nginx = {
    	enable = true;
    	virtualHosts."nerdbude.com" = {
        enableACME = true;
    		forceSSL = true;
    		root = "/var/www/nerdbude/";
    		};
  


Die ersten zwei Zeilen starten NGINX als Webserver.
Mit "virtualHosts." wird die Website initialisiert und hier werden auch grundlegende Parameter mitgegeben. Damit NGINX auch merkt welche Domain auf welchen Content zeigen soll geben wir noch die Website als Parameter mit, also virtualHosts."nerbude.com". Unter diesem Virtual Host geben wir auch noch die Anweisung zur Generierung der SSL Zertifikate mit. Das regelt enableACME = true; und damit ausschließlich SSL verwendet wird packen wir noch forceSSL = true; dazu. Zu guter Letzt definieren wir mit root = "/var/www/nerdbude/"; den Pfad zu den .html Files. Das reicht im Grunde aus, damit NGINX die Website ausliefert. Die Redundanz der Websites für die Versionen mit und ohne "www" braucht es nicht als "virtualHosts"-Eintrag. Hier reicht ein Redirect von der einen zur anderen Version. [Danke fleaz!] Da SSL immer noch eine Kontaktmail braucht geben wir die im folgenden Abschnitt noch mit:


configuration.nix
      security.acme.acceptTerms = true;
      security.acme.certs = {
    	"nerdbude.com".email = "post@nerdbude.com";
    	"www.nerdbude.com".email = "post@nerdbude.com";
    	};
  


Das sind die grundlegenden Configs für die Domains inkl. SSL Zertifikate. NixOS generiert die SSL Zertifikate völlig automagisch. Es kann kurz dauern bis diese erkannt werden, das hat bei mir zwischen 10 und 15 Minuten gedauert. Also total aushaltbar. Nun sollten wir NGINX noch ein paar allgemeine Parameter mitgeben.


configuration.nix
      boot.cleanTmpDir = true;
      zramSwap.enable = true;
      networking.hostName = "nb-main";
      networking.domain = "";
      services.openssh.enable = true;
      networking.firewall = {
    	enable = true;
    	allowedTCPPorts = [ 22 25 80 443 ];
    	allowedUDPPortRanges = [
    	  { from = 4000; to = 4007; }
    	  { from = 8000; to = 8010; }
            ];
    };
    
    ### SSH CERT FOR REMOTE ACCESS
    
      users.users.root.openssh.authorizedKeys.keys = [
        "ssh-rsa XXX"
      ];
  


Zum einen aktivieren wir hier den SSH Zugang mit services.openssh.enable = true; und aktivieren die Firewall und machen ein paar Ports auf. Das passiert hier und ist relativ selbsterklärend:


configuration.nix
      networking.firewall = {
    	enable = true;
    	allowedTCPPorts = [ 22 25 80 443 ];
    	allowedUDPPortRanges = [
    	  { from = 4000; to = 4007; }
    	  { from = 8000; to = 8010; }
            ];
    };
  


Aktiviert wird die Firewall mit enable = true; und unter allowedTCPPorts = [ 22 25 80 443 ]; geben wir der Firewall die Ports mit die sie durchlassen soll. Als Abschluss lassen wir noch unseren SSH Key noch in der configuration.nix umd auch per SSH auf den Server zukommen.


configuration.nix
      users.users.root.openssh.authorizedKeys.keys = [
        "ssh-rsa XXX"
      ];
  


Der SSH Key stammt noch aus der Installation von NixOS die ich HIER beschrieben hatte. Hier könnt ihr natürlich noch andere Keys hinterlegen. Natürlich müsst ihr XXX mit eurem Key ersetzen. Nachdem ihr den obligatorischen nixos-rebuild switch durchgeführt habt sollte euer Webserver laufen. Um die Domains selber geht es im nächsten Teil. Die brauchen nämlich noch die Weiterleitung auf euren Server.

BONUS: 301 REDIRECT


Aktuell laufen clickclackhack.de und damnfinekeyboards.com schon auf dem NixOS Server. Die NERDBUDE allerdings noch nicht. Das hat den einfachen Grund, dass der Podcast-Feed in der NERDBUDE Struktur liegt. Würde ich jetzt einfach umziehen, würden eure Podcatcher keine neuen Episoden mehr bekommen. Deswegen bekommt der Feed einen 301-Redirect der allen Clients sagt, dass der Feed permanent auf eine neue Adresse umgezogen ist. Das ganze regelt die .htaccess Datei, die beim alten Anbieter in der Struktur abgelegt wird. Die .htaccess sieht wie folgt aus:


.htaccess
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^podcast/feed/feed.xml https://www.clickclackhack.de/feed/feed.xml [L,R=301]
    </IfModule>
  


Sobald nun ein Client (Browser, Feedreader, Podcatcher) den Feed aufrufen will, bekommt er gesagt, dass er doch bitte den neuen nehmen soll. Den lasse ich jetzt noch etwas laufen, damit auch jede*r den neuen Feed bekommt und wenn das abgeschlossen ist, wandert die NERDBUDE auch endlich auf den NixOS Server.

Auf dem NixOS Server bauen wir das für die "www"-Weiterleitung ähnlich auf (wenn jemand von euch weiß wie ich das in die configuration.nix einbaue, schreibt mir und ich bau das hier mit rein):

.htaccess
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^https://www.clickclackhack.de https://clickclackhack.de [L,R=301]
    </IfModule>
  


PARTS:
[01] - Intro
[02] - Vorraussetzungen
[03] - Webserver
[04] - Mailserver



EDIT:
[2023-02-27] - remove nginx from systempackages / redirect websites [fleaz]
[~] BACK