docs/quick-start.md

# Schnellstart: minimale Welley-Bereitstellung

Der kürzeste Weg zu einer laufenden Welley-Instanz auf einem einzelnen Linux-Host, in einer beliebigen Cloud oder auf deiner eigenen Hardware. Es werden nur die Flags verwendet, die die CLI wirklich verlangt. Alles andere bleibt auf dem Standardwert.

Das bekommst du: die Plattform, die RAG-Pipeline, Nginx, Redis und einen **mitgelieferten** PostgreSQL-Container, dazu ein Let's-Encrypt-Zertifikat, das bei der Installation ausgestellt wird. Keine verwaltete Datenbank, kein CDN, keine Telemetrie und keine Slack-Integration (dafür gibt es die Anleitungen für AWS EC2 und DigitalOcean).

## 1\. Voraussetzungen

**Ein Linux-Host**

-   Ubuntu 24.04 LTS (oder eine vergleichbare aktuelle Distribution).
-   2 vCPU, 4 GB RAM und 60 GB Speicherplatz als Ausgangspunkt.
-   Eine öffentliche IPv4-Adresse, die sich nicht ändert.
-   Eingehende TCP-Ports **80** und **443** sind aus dem Internet offen, **22** ist für dich offen. Port 80 wird bei der Installation für die Zertifikatsprüfung gebraucht und danach für die wöchentliche Erneuerung.
-   Ein Nicht-Root-Nutzer mit `sudo`. Die Anleitung führt alles mit diesem Nutzer aus, unten heißt er `<user>`.

**DNS**

Zwei Einträge, die beide auf die öffentliche IP des Hosts zeigen:

| Eintrag | Zweck |
| --- | --- |
| `<domain>` | die Website selbst |
| `storage.<domain>` | Uploads und statische Dateien, weil es in dieser Konfiguration kein CDN gibt |

Lege sie an, bevor du anfängst: Die CLI prüft, ob beide Namen auf diesen Host zeigen, und bricht ab, wenn das nicht so ist.

**DNS-Einträge für E-Mail**

Die Domain deiner `--smtp-from`\-Adresse braucht Einträge zur E-Mail-Authentifizierung. Ohne sie verwerfen Gmail, Outlook und andere große Anbieter E-Mails an Empfänger oft, wenn diese noch nie etwas von dir bekommen haben. Das betrifft jede Einladung und jede Anmeldebestätigung. Die Mail landet nicht einmal im Spam, obwohl dein SMTP-Anbieter sie als gesendet meldet.

| Eintrag | Typ | Wert |
| --- | --- | --- |
| `<mail-domain>` | TXT | SPF, zum Beispiel `v=spf1 include:<provider> ~all`. Den genauen Wert bekommst du von deinem SMTP-Anbieter. |
| `_dmarc.<mail-domain>` | TXT | DMARC, zum Beispiel `v=DMARC1; p=none; rua=mailto:dmarc@<mail-domain>` |
| `<selector>._domainkey.<mail-domain>` | TXT oder CNAME | DKIM, wird von deinem SMTP-Anbieter erzeugt, wenn du die Domain verifizierst |

Eine Domain kann nur einen SPF-Eintrag haben. Wenn sie schon einen hat, ergänze ihn um deinen Anbieter, statt einen zweiten anzulegen. `create` warnt, wenn SPF oder DMARC fehlt, bricht aber nicht ab. DKIM kann es nicht prüfen, weil der Selector-Name vom jeweiligen Anbieter abhängt.

Überspring DKIM nicht. Viele Anbieter, darunter Amazon SES, senden standardmäßig mit ihrer eigenen Domain als Envelope-Absender. SPF prüft dann die Domain des Anbieters und nicht deine, zählt also nicht für DMARC. Die DMARC-Prüfung kann dann nur über DKIM bestanden werden. Den DKIM-Status siehst du in der Konsole deines Anbieters. In Amazon SES findest du ihn unter _Verified identities, dann `<mail-domain>`, dann DKIM_, und er muss _Successful_ lauten. SES Easy DKIM veröffentlicht drei CNAME-Einträge mit dem Namen `<token>._domainkey.<mail-domain>`.

**SMTP-Zugangsdaten**

Host, Nutzer, Passwort und eine Absenderadresse, von einem beliebigen Anbieter. Die Plattform braucht sie für die E-Mail-Bestätigung und das Zurücksetzen von Passwörtern, und die CLI weigert sich, ohne sie zu installieren. Die Standardwerte gehen vom Versand über STARTTLS auf Port 587 aus.

**Eine Admin-E-Mail-Adresse** für die erste Anmeldung und das Zurücksetzen des Passworts.

## 2\. Docker installieren

Folge der offiziellen Anleitung für deine Distribution: [Install Docker Engine](https://docs.docker.com/engine/install/). Danach gibst du deinem Nutzer Zugriff auf den Daemon:

```
sudo usermod -aG docker <user>
```

Melde dich ab und wieder an und prüfe dann, ob beide Teile vorhanden sind:

```
docker ps
docker compose version
```

## 3\. CLI herunterladen

Wähle den `platform`\-Wert, der zu deinem Host passt:

**linux/amd64**

```

curl -fL "https://appstore.allroads.social/v1/social.wellesley.wlycli/latest?channel=stable&platform=linux/amd64" -o wlycli
chmod +x wlycli
./wlycli -v
  
```
  **linux/arm64**

```

curl -fL "https://appstore.allroads.social/v1/social.wellesley.wlycli/latest?channel=stable&platform=linux/arm64" -o wlycli
chmod +x wlycli
./wlycli -v
  
```
  **darwin/arm64**

```

curl -fL "https://appstore.allroads.social/v1/social.wellesley.wlycli/latest?channel=stable&platform=darwin/arm64" -o wlycli
chmod +x wlycli
./wlycli -v
  
```
  **darwin/amd64**

```

curl -fL "https://appstore.allroads.social/v1/social.wellesley.wlycli/latest?channel=stable&platform=darwin/amd64" -o wlycli
chmod +x wlycli
./wlycli -v
  
```
  

## 4\. Bereitstellen

```
./wlycli deploy create \
-d example.com \
-e admin@example.com \
--smtp-host smtp.example.com \
--smtp-user "$MAIL_USER" \
--smtp-password "$MAIL_PASSWORD" \
--smtp-from noreply@example.com
```

Diese sechs Flags sind alles, was nötig ist. Der Befehl prüft das DNS, schreibt die Bereitstellungsdateien, stellt das Zertifikat mit Certbot aus und startet die Container. Rechne mit mehreren Minuten.

Diese Standardwerte übernimmst du damit:

| Einstellung | Standardwert |
| --- | --- |
| Installationsverzeichnis | `~/.welley/<project>`, wobei `<project>` die Domain ist, in der jedes nicht alphanumerische Zeichen durch `_` ersetzt wird (aus `example.com` wird also `example_com`) |
| Datenbank | mitgelieferter PostgreSQL-Container, Daten im Installationsverzeichnis |
| Zertifikate | Let's Encrypt über Certbot, wird automatisch einmal pro Woche erneuert |
| Uploads und statische Dateien | werden von `https://storage.<domain>` ausgeliefert |
| Updates | Kanal `stable`, wird täglich geprüft, nach Möglichkeit ohne Ausfallzeit eingespielt |

## 5\. Erste Anmeldung

Das generierte Admin-Passwort wird ins Plattform-Log geschrieben:

```
docker logs example_com-platform-blue-1 | grep "Auto-init complete"
```

Öffne `https://<domain>`, melde dich mit der Admin-E-Mail-Adresse an, die du mit `-e` angegeben hast, und ändere das Passwort sofort. Behandle das Log bis dahin als geheim.

## 6\. Ergebnis prüfen

```
docker ps
```

Du solltest je einen Container für `nginx`, `platform-blue`, `rag-pipeline-blue`, `postgres`, `redis`, `autoheal` und `snoopy` sehen, alle mit dem Namen `<project>-<service>-1`.

## Wenn etwas schiefgegangen ist

`create` läuft nicht ein zweites Mal, solange das Projektverzeichnis oder seine Container existieren. Wenn die Dateien in Ordnung sind und nur einige Container nicht gestartet sind, kannst du sie neu erstellen, ohne etwas zu verlieren:

```
./wlycli deploy restart -d example.com
```

Wenn die Bereitstellung selbst neu gemacht werden muss, lösche sie und fang von vorn an. Dabei wird die mitgelieferte Datenbank samt allem anderen gelöscht:

```
./wlycli deploy delete -d example.com --yes-please-delete-all-the-data
```

## Weitere Dokumente

-   [**Welley CLI** docs/index.md](https://welley.com/de/administrators/docs/cli/)
-   [**Server bereitstellen** skills/deploy-server/SKILL.md](https://welley.com/de/administrators/docs/deploy-server-skill/)
-   [**openai.yaml** skills/deploy-server/agents/openai.yaml](https://welley.com/de/administrators/docs/deploy-server-openai-yaml/)
-   [**DigitalOcean-Referenz** skills/deploy-server/references/digitalocean.md](https://welley.com/de/administrators/docs/deploy-server-digitalocean/)
