# Hosts

# asgard

<span style="white-space: pre-wrap;">Der Host </span>**`<strong class="editor-theme-bold editor-theme-code">asgard</strong>`**<span style="white-space: pre-wrap;"> ist der interne Haupserver im deckeigenen Rechenzentrum.</span>

****IP:****<span style="white-space: pre-wrap;"> 192.168.0.107</span>

##### Hostnamen:

- `<span class="editor-theme-code">asgard.maschinendeck.org</span>`
- `<span class="editor-theme-code">tuer.maschinendeck.org</span>`
- `<span class="editor-theme-code">docs.maschinendeck.org</span>`
- `<span class="editor-theme-code">nextcloud.maschinendeck.org</span>`
- `<span class="editor-theme-code">api.maschinendeck.org</span>`
- `<span class="editor-theme-code">nextcloud.maschinendeck.org</span>`
- `<span class="editor-theme-code">social.maschinendeck.org</span>`

### Spezifikation

<table id="bkmrk-cpuintel-celeron-j41" style="border-style: none;"><colgroup><col style="width: 102px;"></col><col style="width: 374px;"></col></colgroup><tbody><tr><td>****CPU****

</td><td><span style="white-space: pre-wrap;">Intel Celeron J4105 CPU, </span>**4 x 1.50GHz**

</td></tr><tr><td>****GPU****

</td><td>Intel UHD Graphics 600

</td></tr><tr><td>****RAM****

</td><td><span style="white-space: pre-wrap;">8 Gb, DDR4, </span>**2400 MT/s**

</td></tr><tr><td>****Speicher****

</td><td>1 Tb, **Intenso SSD SATAIII**

</td></tr><tr><td>****Netzwerk****

</td><td>1000BASE-T

</td></tr><tr><td>****OS****

</td><td>Ubuntu 24.04.1 LTS

</td></tr></tbody></table>

### Aufbau

<span style="white-space: pre-wrap;">Der Server läuft vollständig im Dockermodus. Die Konfiguration der Container liegt unter </span>`<span class="editor-theme-code">/config</span>`<span style="white-space: pre-wrap;">, deren Daten unter </span>`<span class="editor-theme-code">/data</span>`<span style="white-space: pre-wrap;"> und etwaige Backups der Datenbanken und der in den Containern laufenden Dienste unter </span>`<span class="editor-theme-code">/backup</span>`.

<span style="white-space: pre-wrap;">Die Umgebungsvariablen für einen Container, welche unter Umständen auch Passwörter oder Zugriffstoken enthalten, befinden sich in einer Datei mit dem Namen </span>`<span class="editor-theme-code">.env</span>`<span style="white-space: pre-wrap;"> in dem jeweiligen Verzeichnis unter </span>`<span class="editor-theme-code">/config</span>`.

### Stack

<span style="white-space: pre-wrap;">Ankommende </span>`<span class="editor-theme-code">HTTP</span>`<span style="white-space: pre-wrap;">-Anfragen werden von einem </span>[traefik](https://traefik.io/traefik/)<span style="white-space: pre-wrap;"> Reverseproxy entgegengenommen, welcher diese an die unterliegenden Dockercontainer weiterreicht. Der </span>`<span class="editor-theme-code">traefik</span>`<span style="white-space: pre-wrap;">-Container kümmert sich vollautomatisch um die SSL-Zertifikate via </span>**Letsencrypt**.

<span style="white-space: pre-wrap;">Zur Konfiguration von </span>`<span class="editor-theme-code">traefik</span>`<span style="white-space: pre-wrap;"> für einen einzelnen Container, muss die </span>`<span class="editor-theme-code">docker-compose.yml</span>`<span style="white-space: pre-wrap;"> des Stacks lediglich mit entsprechenden Labels ausgestattet werden. Das Routing auf den exponierten Port geschieht dann automatisch. Hier eine beispielhafte Konfiguration für ein Standardsetup:</span>

```yaml
services:
  example:
    image: example/example
    container_name: example
    env_file: .env
    expose:
      - 80
    networks:
      - public
      - mysql
    labels:
      - traefik.enable=true
      - traefik.http.routers.example.rule=Host(`example.maschinendeck.org`)
      - traefik.http.routers.example.entrypoints=web
      - traefik.http.routers.example_ssl.rule=Host(`example.maschinendeck.org`)
      - traefik.http.routers.example_ssl.tls=true
      - traefik.http.routers.example_ssl.tls.certresolver=letsencrypt
      - traefik.http.routers.example_ssl.entrypoints=websecure
    restart: unless-stopped

networks:
  public:
    external: true
```

<span style="white-space: pre-wrap;">Der entsprechende Container muss mindestens dieses Set an Labels aufweisen um funktionieren zu können </span>**(die Strings* `<em class="editor-theme-code editor-theme-italic">example</em>` *und* `<em class="editor-theme-code editor-theme-italic">example_ssl</em>` *sind für jeden Stack einzigartig zu wählen, müssen also geändert werden)**<span style="white-space: pre-wrap;">. Zusätzlich muss er Zugriff auf das Netzwerk </span>`<span class="editor-theme-code">public</span>`<span style="white-space: pre-wrap;"> erhalten und selbstverständlich muss die entsprechende Domain auf den </span>**DynDNS**<span style="white-space: pre-wrap;"> des Maschinendeck aufgeschaltet sein.</span>

#### Externe Dienste

<span style="white-space: pre-wrap;">Auch alle Anfragen an interne Dienste, welche nicht auf dem Server, sondern auf anderen Hosts im internen Netzwerk betrieben werden, landen bei diesem </span>`<span class="editor-theme-code">traefik</span>`<span style="white-space: pre-wrap;">-Container. Die Konfiguration für die Handhabung solcher Dienste befindet sich in der Datei </span>`<span class="editor-theme-code">/config/traefik/config/dynamic.yaml</span>`, wo entsprechende Services und Router hinterlegt sind.

<span style="white-space: pre-wrap;">Da dort Anfragen in der Regel stupide an einen anderen Host weitergeleitet werden, bestehen diese Konfigurationen aus simplen </span>`<span class="editor-theme-code">loadBalancer</span>`-Direktiven:

```yaml
http:
  services:
    tuer_service:
      loadBalancer:
        servers:
          - url: http://192.168.0.101
  routers:
    tuer:
      service: tuer_service
      entryPoints:
        - web
        - websecure
      rule: Host(`tuer.maschinendeck.org`)
      tls:
        certResolver: letsencrypt
```

Jeweils ein Service und ein Router müssen pro externem Dienst angelegt werden.

### Aktuelle Dienste

<span style="white-space: pre-wrap;">Zur Zeit stellt der Host </span>`<span class="editor-theme-code">asgard</span>`<span style="white-space: pre-wrap;"> folgende Dienste zur Verfügung:</span>

#### bookstack

<span style="white-space: pre-wrap;">Die Software </span>[bookstack](https://www.bookstackapp.com)<span style="white-space: pre-wrap;"> stellt die Dokumentation zur Verfügung, die hier gerade zu sehen ist. Jeder der eine @maschinendeck.org E-Mail-Adresse besitzt kann sich hier ein Konto erstellen und an der Dokumentation mitwirken.</span>

#### Mastodon

<span style="white-space: pre-wrap;">Diese </span>[Mastodon](https://joinmastodon.org/de)-Instanz ist unser Standbein im Fediverse. Alle Maschinisten können einen Account auf Einladung erhalten.

#### Nextcloud

<span style="white-space: pre-wrap;">Bei </span>[Nextcloud](https://nextcloud.com/de/)<span style="white-space: pre-wrap;"> handelt es sich um eine Open Source "private cloud"-Lösung, auf welcher Maschinisten Dateien ablegen und Kalender pflegen können.</span>

#### Bitwarden

<span style="white-space: pre-wrap;">Mit der Open Source Impementierung </span>**"vaultwarden"**<span style="white-space: pre-wrap;"> unterhält das Maschinendeck hier seine eigene </span>[Bitwarden](https://bitwarden.com/de-de/)-Instanz. Hierbei handelt es sich um einen Passwortmanager, mit dessen Hilfe Passwörter sicher mit ganzen Personengruppen geteilt werden können.

# bifroest

<span style="white-space: pre-wrap;">Der Host </span>**`<strong class="editor-theme-bold editor-theme-code">bifroest</strong>`**<span style="white-space: pre-wrap;"> handhabt die Hausautomatisierung/das IoT im Maschinendeck.</span>

****IP:****<span style="white-space: pre-wrap;"> 192.168.0.10</span>  
****IP:****<span style="white-space: pre-wrap;"> 10.23.42.10</span>

##### Hostnamen:

- `<span class="editor-theme-code">bifroest.local</span>`

### Spezifikation

<table id="bkmrk-pi-versionraspberry-" style="border-style: none;"><colgroup><col style="width: 102px;"></col><col style="width: 374px;"></col></colgroup><tbody><tr><td>****Pi Version****

</td><td>Raspberry Pi 3 Model B

</td></tr><tr><td>****RAM****

</td><td>1 Gb

</td></tr><tr><td>****Netzwerk****

</td><td>300BASE-T

</td></tr><tr><td>****OS****

</td><td><span style="color: rgb(170, 170, 170); background-color: rgb(34, 34, 34);">raspberrypiOS bookworm</span>

</td></tr></tbody></table>

### Aufbau

<span style="white-space: pre-wrap;">Der Raspberry Pi bifroest läuft im Dualbetrieb Docker/"bare metal". Die Software </span>[Home Assistant](https://www.home-assistant.io)<span style="white-space: pre-wrap;"> </span>**(HASSIO)**<span style="white-space: pre-wrap;"> läuft in einem Dockercontainer, andere Software </span>**(wie der MQTT-Broker* `<em class="editor-theme-code editor-theme-italic">mosquitto</em>` *)**<span style="white-space: pre-wrap;"> ist direkt über das Betriebssystem installiert.</span>

<span style="white-space: pre-wrap;">Die Dockerkonfiguration findet sich unter </span>`<span class="editor-theme-code">/opt/docker</span>`.

### Peripherie

<span style="white-space: pre-wrap;">Der Pi spannt mithilfe des </span>[slae.sh](https://slae.sh/projects/cc2652/)-Sticks ein Zigbeenetzwerk auf, in welchem sich zahlreiche Sensoren und Aktoren befinden.

# heimdal

<span style="white-space: pre-wrap;">Der Host </span>**`<strong class="editor-theme-bold editor-theme-code">heimdal</strong>`**<span style="white-space: pre-wrap;"> betreibt das </span>****Maschinendeck Door Opening System****<span style="white-space: pre-wrap;"> </span>**(MDoS)**.

****IP:****<span style="white-space: pre-wrap;"> 192.168.0.101</span>

##### Hostnamen:

- `<span class="editor-theme-code">heimdal.local</span>`
- `<span class="editor-theme-code">tuer.maschinendeck.org</span>`

### Spezifikation

<table id="bkmrk-pi-versionraspberry-" style="border-style: none;"><colgroup><col style="width: 102px;"></col><col style="width: 374px;"></col></colgroup><tbody><tr><td>****Pi Version****

</td><td>Raspberry Pi 3 Model B

</td></tr><tr><td>****RAM****

</td><td>1 Gb

</td></tr><tr style="height: 10px;"><td>****Netzwerk****

</td><td>100BASE-T

</td></tr><tr style="height: 10px;"><td>****OS****

</td><td>raspberrypiOS bullseye

</td></tr></tbody></table>

### Peripherie

<span style="white-space: pre-wrap;">An den Raspberry Pi ist die </span>[mdos-Hardware](https://gitlab.com/maschinendeck/mdos/mdos)<span style="white-space: pre-wrap;"> angeschlossen, welche sich direkt am Türschloss befindet. Die Verbindung zum Türmodul wird über eine </span>`<span class="editor-theme-code">RS485</span>`<span style="white-space: pre-wrap;"> Bustreiber hergestellt, welcher direkt über die Serielle Schnittstelle des Pis angebunden ist. Im Gehäuse mit dem Pi befindet sich ein Leistungsstarkes 12V Netzteil, welches den Pi und das Türgerät mit Strom versorgt.</span>

### Aufbau

<span style="white-space: pre-wrap;">Der Raspberry Pi wird mit einem </span>**rasperrypiOS lite** <span style="white-space: pre-wrap;">betrieben, auf welchem "bare metal" die eigens entwickelte Software </span>[mdos-web](https://gitlab.com/maschinendeck/mdos/mdos-web)<span style="white-space: pre-wrap;"> läuft.</span>

<span style="white-space: pre-wrap;">Die Software läuft unter dem Benutzer </span>`<span class="editor-theme-code">pi</span>`<span style="white-space: pre-wrap;"> und liegt unter </span>`<span class="editor-theme-code">/home/pi/mdos-web</span>`<span style="white-space: pre-wrap;">. Gestartet wird Sie über das Node.js-Modul </span>**pm2**<span style="white-space: pre-wrap;">, welches dafür sorgt, dass die Anwendung als Daemon im Hintergrund läuft. Die Logs werden in der Datei </span>`<span class="editor-theme-code">/var/log/mdos-web/production</span>`<span style="white-space: pre-wrap;"> hinterlegt, welche von </span>**logrorate**<span style="white-space: pre-wrap;"> rotiert wird.</span>

# hermod

<span style="white-space: pre-wrap;">Der Host </span>**`<strong class="editor-theme-bold editor-theme-code">hermod</strong>`**<span style="white-space: pre-wrap;"> ist die interne PBX des Maschinendeck.</span>

**IP:**<span style="white-space: pre-wrap;"> 192.168.0.XXX</span>

##### Hostnamen:

- `<span class="editor-theme-code">hermod.local</span>`

### Spezifikation

<table id="bkmrk-pi-versionraspberry-" style="border-style: none;"><colgroup><col style="width: 102px;"></col><col style="width: 374px;"></col></colgroup><tbody><tr><td>**Pi Version**

</td><td>Raspberry Pi 3 Model B

</td></tr><tr><td>**RAM**

</td><td>512 Mb

</td></tr><tr><td>**Netzwerk**

</td><td>1000BASE-T

</td></tr><tr><td>**OS**

</td><td><span style="color: rgb(170, 170, 170); background-color: rgb(34, 34, 34);">RasPBX</span>

</td></tr></tbody></table>

### Aufbau

# thor

<span style="white-space: pre-wrap;">Der Host </span>**`<strong class="editor-theme-bold editor-theme-code">thor</strong>`**<span style="white-space: pre-wrap;"> ist ein Server im deckeigenen Rechenzentrum.</span>

****IP:****<span style="white-space: pre-wrap;"> 192.168.0.133</span>

##### Hostnamen:

- `<span class="editor-theme-code">thor.local</span>`

### Spezifikation

<table id="bkmrk-cpuamd-g-t48e%2C-2-x-7" style="border-style: none;"><colgroup><col style="width: 102px;"></col><col style="width: 374px;"></col></colgroup><tbody><tr><td>****CPU****

</td><td>AMD G-T48E, 2 **x 700 MHz**

</td></tr><tr><td>****GPU****

</td><td>AMD Radeon HD 6250

</td></tr><tr><td>****RAM****

</td><td>2 Gb, DDR3, 1600 **MT/s**

</td></tr><tr><td>****Speicher****

</td><td>128 Gb, **SK hynix SC300 SATA**

</td></tr><tr><td>****Netzwerk****

</td><td>1000BASE-T

</td></tr><tr><td>****OS****

</td><td>Ubuntu 24.04.1 LTS

</td></tr></tbody></table>

# valhalla

<span style="white-space: pre-wrap;">Der Host </span>**`<strong class="editor-theme-bold editor-theme-code">valhalla</strong>`**<span style="white-space: pre-wrap;"> ist der interne Backupserver im deckeigenen Rechenzentrum.</span>

****IP:****<span style="white-space: pre-wrap;"> 192.168.0.64</span>

##### Hostnamen:

- `<span class="editor-theme-code">valhalla.local</span>`

### Spezifikation

<table id="bkmrk-pi-versionraspberry-" style="border-style: none;"><colgroup><col style="width: 102px;"></col><col style="width: 374px;"></col></colgroup><tbody><tr><td>****Pi Version****

</td><td>Raspberry Pi 4 Model B

</td></tr><tr><td>****RAM****

</td><td>8 Gb

</td></tr><tr style="height: 10px;"><td>****Netzwerk****

</td><td>1000BASE-T

</td></tr><tr style="height: 10px;"><td>****OS****

</td><td>raspberrypiOS bookworm

</td></tr></tbody></table>

### Peripherie

<span style="white-space: pre-wrap;">Der Raspberry Pi </span>`<span class="editor-theme-code">valhalla</span>`<span style="white-space: pre-wrap;"> verfügt über </span>****3 Tb HDD****<span style="white-space: pre-wrap;"> Speicher, welcher via USB verbunden ist. Die Festplatten befinden sich in einem </span>**ICY BOX IB-RD3620SU3** JBOD Gehäuse, welches auf RAID 1 geschaltet ist. Der Grund hierfür ist, dass die genutzte NAS-Software openmediavault keine Software-RAIDs über via USB verbundene Platten erlaubt.

### Aufbau

<span style="white-space: pre-wrap;">Der Raspberry Pi wird mit einem </span>**rasperrypiOS lite** <span style="white-space: pre-wrap;">betrieben, auf welchem "bare metal" die NAS-Software </span>[openmediavault](https://www.openmediavault.org)<span style="white-space: pre-wrap;"> </span>**(OMV)** <span style="white-space: pre-wrap;">installiert ist. Diese unterteilt die angehangene, externe Festplatte in drei Partitionen </span>**(mangels support in der Weboberfläche wurden diese Partitionen direkt auf dem Betriebssystem mittels der Software* `<em class="editor-theme-code editor-theme-italic">parted</em>` *erstellt):**

- `<span class="editor-theme-code">/dev/sda1</span>`<span style="white-space: pre-wrap;"> → </span>`<span class="editor-theme-code">/share</span>`<span style="white-space: pre-wrap;"> 100 Gb</span>
- `<span class="editor-theme-code">/dev/sda2</span>`<span style="white-space: pre-wrap;"> → </span>`<span class="editor-theme-code">/docker</span>`<span style="white-space: pre-wrap;"> 100 Gb</span>
- `<span class="editor-theme-code">/dev/sda3</span>`<span style="white-space: pre-wrap;"> → </span>`<span class="editor-theme-code">/backup</span>`<span style="white-space: pre-wrap;"> 2,8 Tb</span>

<span style="white-space: pre-wrap;">Die </span>`<span class="editor-theme-code">/share</span>`<span style="white-space: pre-wrap;"> Partition stellt ein Netzlaufwerk für den lokalen Dateiaustausch via </span>[Samba](https://de.wikipedia.org/wiki/Samba_(Software))<span style="white-space: pre-wrap;"> </span>**(SMB)**<span style="white-space: pre-wrap;"> zur Verfügung. Dieser Speicher ist als volatil zu betrachten.</span>

<span style="white-space: pre-wrap;">Auf der Partition </span>`<span class="editor-theme-code">/docker</span>`<span style="white-space: pre-wrap;"> werden die compose-Dateien für den von OMV zur Verfügung gestellten Dockerdienst gespeichert. Hier läuft aktuell nur ein einziger Container mit der Software </span>[backuppc](https://backuppc.github.io/backuppc/).

<span style="white-space: pre-wrap;">Die Partition </span>`<span class="editor-theme-code">/backup</span>`<span style="white-space: pre-wrap;"> wird in erwähntem Dockercontainer gemountet, um darauf die Backups der Vereinseigenen IT-Infrastruktur abzulegen.</span>

<p class="callout warning">****Die Weboberflächen sind ausschließlich via SSL erreichbar, dringend auf** `<strong class="editor-theme-bold editor-theme-code">https://</strong>` **achten.****</p>

#### openmediavault

<span style="white-space: pre-wrap;">Die Weboberfläche der Software openmediavault ist im Deck unter </span>[https://valhalla.local](https://valhalla.local)<span style="white-space: pre-wrap;"> erreichbar.</span>

#### backuppc

<span style="white-space: pre-wrap;">Die Weboberfläche der Software backuppc zum Managen und Rückspielen von Backups ist unter </span>[https://valhalla.local:8080](https://valhalla.local:8080)<span style="white-space: pre-wrap;"> erreichbar.</span>