> For the complete documentation index, see [llms.txt](https://thorstenkramm.gitbook.io/saltstack/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://thorstenkramm.gitbook.io/saltstack/salt-states/beispiel-caddy-webserver.md).

# Beispiel Caddy Webserver

verschiedene State-Module im Zusammenspiel

### Vorbereitung auf dem Salt-Master

Legen Sie auf dem Salt-Master einen Ordner `/srv/salt/caddy` an und laden Sie Caddy in diesen Ordner herunter.

```bash
mkdir /srv/salt/caddy
cd /srv/salt/caddy
curl -LOJ "https://caddyserver.com/api/download?os=linux&arch=amd64"
```

### Webserver ausrollen

{% code title="/srv/salt/caddy/init.sls" %}

```yaml
#
# Make sure an apropiated unprivileged user exists
#
caddy:
  group.present: []
  user.present:
    - shell: /bin/false
    - home: /var/www
    - groups:
      - caddy
    - system: true
    - createhome: false

#
# Make sure the software binary exists, copy from the master otherwise
#
/usr/local/bin/caddy:
  file.managed:
    - source: salt://caddy/caddy_linux_amd64
    - mode: "0755"
    - user: root

#
# Make sure a directory for the config exists
#
/etc/caddy:
  file.directory:
    - user: root
    - group: root

#
# Make sure a doc-root exists
#
/var/www:
  file.directory:
    - user: caddy
    - group: caddy

#
# Make sure an index file exists
#
/var/www/index.html:
  file.managed:
    - contents: <h1>Hallo Webserver</h1>
    - user: caddy
    - group: caddy

#
# Keep the server running
#
run-caddy:
  cmd.run:
    - name: nohup caddy file-server --listen 0.0.0.0:8080 --root /var/www/ 2>/dev/null &
    - ignore_timeout: true
    - bg: true
    - runas: caddy
    - cwd: /tmp
    - unless: pgrep caddy
```

{% endcode %}

### Probleme & Verbesserungen

#### Probleme

1. Der Webserver überlebt keinen Reboot
2. Der Webserver kann nur Ports > 1024 nutzen, weil er nicht als Root läuft. Den Webserver als Root-User starten, wäre ein unnötiges Sicherheitsrisiko.
3. Es existiert keine Konfiguration auf dem System. Ein Re-Start des Webservers ohne Salt setzt voraus, dass man das Startkommando aus Zeile 53 kennt.

#### Verbesserungen

1. Systemd verwenden.
2. Setcap verwenden, um unprivilegierten Benutzern die Verwendung von Ports < 1024 zu erlauben.
3. Eine lokale Konfiguration speichern.&#x20;

Entfernen Sie die Zeilen 48–58 und fügen Sie folgende Erweiterung hinzu.

{% code title="/srv/salt/caddy/init.sls" %}

```yaml
# snipp....
#
# Maintain a systemd service file. Shipped with caddy
# https://raw.githubusercontent.com/caddyserver/dist/master/init/caddy.service
#
/etc/systemd/system/caddy.service:
  file.managed:
    - source: salt://caddy/caddy.service
    - require:
      - file: /usr/local/bin/caddy

#
# Reload systemd if the service file has changed
#
daemon-reload:
  cmd.run:
    - name: systemctl daemon-reload
    - onchanges:
      - file: /etc/systemd/system/caddy.service

#
# Maintain a config file
#
/etc/caddy/Caddyfile:
  file.managed:
    - contents: |
        :80 {
          root * /var/www/
          file_server
        }

#
# Keep the server running using systemd
#
caddy-service:
  service.running:
    - name: caddy
    - enable: true
    - watch:
      - file: /etc/caddy/Caddyfile
```

{% endcode %}

✋ Bevor Sie den optimieren State ausrollen:

1. Laden Sie das Caddy-Service-File herunter.\
   `curl -O https://raw.githubusercontent.com/caddyserver/dist/master/init/caddy.service`
2. Ändern Sie die Pfade zur Caddy-Binary im Service-File `caddy.service` zu `/usr/local/bin/caddy`. Verwenden Sie einen Editor, oder sed: `sed "s|/usr/bin/caddy|/usr/local/bin/caddy|g" -i caddy.service`.
3. Stoppen Sie die laufenden Caddy Prozesse auf allen Minions. Ein Salt-Modul kann die Aufgabe ausführen: `salt '*' ps.pkill caddy`.

![Caddy Server verwalten](https://3666581685-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LFRZJPZX11pwB1staCp%2Fuploads%2FzQtfMpymJwaKNzPEWmPX%2Fimage.png?alt=media\&token=5a052d68-0a1b-4aab-b351-514df6b4d707)
