# 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.