> ## Documentation Index
> Fetch the complete documentation index at: https://new-docs.simplecloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Configurators

> Automatische Serverkonfiguration basierend auf Server-Software

## Was sind Configurators?

Configurators passen Server-Konfigurationsdateien automatisch basierend auf der verwendeten Server-Software an. Sie handhaben Einstellungen wie Port-Bindung, Player-Forwarding und andere softwarespezifische Konfigurationen mittels Platzhalter-Ersetzung.

## Wie Configurators funktionieren

Während der Server-Vorbereitung:

1. Lädt der Serverhost das Configurator-Template aus `options/configurators/`
2. Identifiziert die Ziel-Konfigurationsdateien
3. Ersetzt Platzhalter mit tatsächlichen Server-Werten
4. Schreibt die konfigurierten Dateien ins Server-Verzeichnis

## Configurator Templates

Configurators werden in YAML-Dateien unter `options/configurators/{name}.yml` definiert. Jeder Configurator gibt an, welche Dateien modifiziert werden und welche Platzhalter ersetzt werden.

### Beispiel: Paper + Velocity

```yaml theme={null}
# options/configurators/paper_velocity.yml
files:
  - path: server.properties
    format: properties
    values:
      server-port: "{{port}}"
      max-players: "{{max-players}}"
      online-mode: "false"

  - path: config/paper-global.yml
    format: yaml
    values:
      proxies.velocity.enabled: true
      proxies.velocity.secret: "{{forwarding-secret}}"
      proxies.velocity.online-mode: true

  - path: spigot.yml
    format: yaml
    values:
      settings.bungeecord: false
```

### Beispiel: Velocity

```yaml theme={null}
# options/configurators/velocity.yml
files:
  - path: velocity.toml
    format: toml
    values:
      bind: "0.0.0.0:{{port}}"
      show-max-players: "{{max-players}}"
      player-info-forwarding-mode: "modern"
      forwarding-secret-file: "forwarding.secret"

  - path: forwarding.secret
    format: text
    content: "{{forwarding-secret}}"
```

## Unterstützte Formate

| Format       | Erweiterung | Beschreibung               |
| ------------ | ----------- | -------------------------- |
| `yaml`       | .yml, .yaml | YAML-Konfigurationsdateien |
| `json`       | .json       | JSON-Konfigurationsdateien |
| `properties` | .properties | Java-Properties-Dateien    |
| `toml`       | .toml       | TOML-Konfigurationsdateien |
| `text`       | beliebig    | Plaintext-Datei-Ersetzung  |

## Platzhalter

Configurators unterstützen dynamische Platzhalter, die durch serverspezifische Werte ersetzt werden:

### Server-Eigenschaften

| Platzhalter       | Beschreibung                 |
| ----------------- | ---------------------------- |
| `{{port}}`        | Zugewiesener Server-Port     |
| `{{server-name}}` | Server-Name (z.B. `lobby-1`) |
| `{{group}}`       | Gruppenname                  |
| `{{max-players}}` | Maximale Spieleranzahl       |
| `{{memory}}`      | Zugewiesener Speicher (MB)   |

### Netzwerk-Eigenschaften

| Platzhalter             | Beschreibung               |
| ----------------------- | -------------------------- |
| `{{forwarding-secret}}` | Velocity Forwarding Secret |
| `{{server-ip}}`         | Server-IP-Adresse          |
| `{{network-id}}`        | Netzwerk-Identifier        |

### Typ-Eigenschaften

| Platzhalter    | Beschreibung                                |
| -------------- | ------------------------------------------- |
| `{{type}}`     | Server-Typ (`proxy`, `server`, `lobby`)     |
| `{{software}}` | Server-Software (`paper`, `velocity`, etc.) |

### Benutzerdefinierte Eigenschaften

Zugriff auf benutzerdefinierte Eigenschaften aus der Gruppe:

```yaml theme={null}
values:
  custom-setting: "{{$.my-custom-property}}"
```

Das `$.` Präfix greift auf die Properties-Map des Servers zu.

## Benutzerdefinierte Configurators erstellen

### 1. Template erstellen

Erstelle eine YAML-Datei in `options/configurators/`:

```yaml theme={null}
# options/configurators/my-configurator.yml
files:
  - path: config.yml
    format: yaml
    values:
      server.port: "{{port}}"
      server.name: "{{server-name}}"

  - path: settings.properties
    format: properties
    values:
      max.players: "{{max-players}}"
```

### 2. Im Blueprint referenzieren

Gib den Configurator in deinem Blueprint an:

```yaml theme={null}
# blueprints/my-blueprint.yml
name: My Blueprint
configurator: my-configurator
minecraft_version: "1.21"
server_software: paper
```

### 3. Der Serverhost wendet ihn an

Während des Server-Starts ruft der Workflow die `ConfiguratorAction` auf:

```yaml theme={null}
# workflows/internal/setup.yml
steps:
  - action: configurator
    configurator: "{{configurator}}"
    dir: "{{server-dir}}"
```

## Eingebaute Configurators

### paper\_velocity

Für Paper-Server hinter Velocity-Proxy:

* Setzt Server-Port in `server.properties`
* Aktiviert Velocity Modern Forwarding in `paper-global.yml`
* Konfiguriert Forwarding Secret
* Deaktiviert BungeeCord-Modus in `spigot.yml`

### paper\_bungeecord

Für Paper-Server hinter BungeeCord:

* Setzt Server-Port in `server.properties`
* Aktiviert BungeeCord-Modus in `spigot.yml`
* Deaktiviert Online-Mode

### velocity

Für Velocity-Proxy-Server:

* Konfiguriert Bind-Port in `velocity.toml`
* Richtet Modern Forwarding ein
* Erstellt Forwarding-Secret-Datei

### bungeecord

Für BungeeCord-Proxy-Server:

* Konfiguriert Listener-Port in `config.yml`
* Aktiviert IP-Forwarding
* Setzt Max-Players

## Verschachtelte Wertpfade

Für verschachtelte Konfigurationsstrukturen nutze Punkt-Notation:

```yaml theme={null}
files:
  - path: config.yml
    format: yaml
    values:
      server.network.port: "{{port}}"
      server.network.host: "0.0.0.0"
      features.enabled.chat: true
```

Dies erstellt:

```yaml theme={null}
server:
  network:
    port: 25565
    host: "0.0.0.0"
features:
  enabled:
    chat: true
```

## Fehlerbehebung

### Konfiguration wird nicht angewendet

1. Prüfe ob Configurator-Name mit Blueprint übereinstimmt
2. Verifiziere den Dateipfad
3. Prüfe Serverhost-Logs auf Fehler

### Platzhalter wird nicht ersetzt

1. Stelle sicher, dass Platzhalter-Syntax korrekt ist: `{{name}}`
2. Prüfe ob die Property auf dem Server existiert
3. Für benutzerdefinierte Properties, nutze `{{$.property-name}}`

### Falsches Dateiformat

1. Verifiziere das `format` Feld entspricht dem tatsächlichen Dateityp
2. Prüfe auf Syntaxfehler im Template
3. Stelle sicher, dass die Datei im Server-Verzeichnis existiert
