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]