# Beispiel Caddy Webserver

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://thorstenkramm.gitbook.io/saltstack/salt-states/beispiel-caddy-webserver.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
