diff --git a/CHANGELOG.md b/CHANGELOG.md index c951904..2c5196d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,17 @@ All notable changes to this project will be documented in this file. ### Fixed - **Webmail - Dark Mode:** Placeholder text in the reply composer and input backgrounds in the settings panel were broken in dark mode due to a Vue scoped CSS compilation issue. Fixed throughout. +### Hotfixes (post-release) +- **Inbound - R2 Cron Delivery:** Emails buffered in R2 were not delivered when the EML `To:` header differed from the SMTP envelope recipient (e.g. GitHub mailing list addresses). Mail manager now falls back through payload `resolved_mailbox`, EML delivery headers (`X-GitHub-Recipient-Address`, `Delivered-To`), and the `Received: for ` header. +- **Inbound - Worker `list()` Metadata:** Cloudflare R2 `list()` does not return `customMetadata` unless explicitly requested. Added `include: ['customMetadata']` to the cron sweep so envelope metadata is available on retry. +- **Inbound - R2 Delete Error Handling:** A transient R2 delete failure in the success path caused a false HTTP 500 response despite the message being delivered. Now try/except with a warning log; cron cleans up any orphaned object. +- **Inbound - Empty Message-ID:** Emails with no `Message-ID` header produced an empty string, causing a UNIQUE constraint collision. A UUID fallback is now generated. +- **Inbound - Attachment Filename Safety:** Filenames with path traversal components (`..`) are now stripped via `os.path.basename`. Duplicate filenames within the same message get a numeric suffix instead of overwriting each other on disk. +- **Worker - KV Availability Guard:** Alias KV lookups in the `email()` handler now check `typeof env.QUOTA_KV !== 'undefined'` before use, matching the pattern already applied to quota checks. A missing KV binding previously caused all alias mail to be silently rejected. +- **Worker - Subject Metadata Truncation:** Subject stored in R2 `customMetadata` is now capped at 500 characters to stay within Cloudflare's 2 KB per-object metadata limit. +- **Worker - R2 Object TTL:** The cron sweep now expires and deletes `temp_cache/` objects older than 7 days to prevent unbounded accumulation during persistent misconfigurations. +- **Inbound - Multi-Domain Header Requirement:** When multiple domains are configured, an inbound webhook without the `X-DockFlare-Domain` header now returns 400 instead of silently using a non-deterministic domain config. + ## [v3.1.0] - 2026-04-16 > **Cloudflare Context:** Cloudflare's Email Service entered public beta today — the same `send_email` Workers binding that powers DockFlare Mail's outbound relay is now generally available. Read the announcement: [Email for Agents](https://blog.cloudflare.com/email-for-agents/) diff --git a/README.MD b/README.MD index 19d25f1..a597432 100644 --- a/README.MD +++ b/README.MD @@ -14,7 +14,7 @@ Stars - Release + Release Docker Pulls Python License @@ -81,10 +81,14 @@ Detailed architecture guide: [https://dockflare.app/architecture](https://dockfl ### One-Liner Install ```bash -curl -fsSL https://dockflare.app/install.sh | bash +bash <(curl -fsSL https://dockflare.app/install.sh) ``` -The script checks prerequisites, creates `~/dockflare/`, writes a production-ready `docker-compose.yml`, and starts all services. Open `http://:5000` when it finishes and follow the setup wizard. +The script will guide you through: +1. Choosing an install directory (default: `~/dockflare/`). +2. Choosing a local UI port (default: `5000`). +3. Optionally configuring a Cloudflare Tunnel for DockFlare itself. +4. Optionally enabling the Email profile (dockflare-mail-manager + dockflare-webmail). For full setup documentation, use the project docs site: @@ -269,6 +273,14 @@ networks: docker compose up -d ``` +The Email Suite is an optional, opt-in feature and will not start by default. To include email services, add the `email` profile: + +```bash +docker compose --profile email up -d +``` + +Email setup and provisioning guide: [Email Overview](https://github.com/ChrispyBacon-dev/DockFlare/blob/stable/dockflare/app/templates/docs/en/Email-Overview.md) + 3. Open `http://your-server-ip:5000` and complete the setup wizard. If you are migrating from older environment-based setups, DockFlare can import existing values during onboarding. diff --git a/dockflare/app/core/worker_templates/inbound_worker.js b/dockflare/app/core/worker_templates/inbound_worker.js index 418a589..8bccc78 100644 --- a/dockflare/app/core/worker_templates/inbound_worker.js +++ b/dockflare/app/core/worker_templates/inbound_worker.js @@ -45,9 +45,11 @@ export default { const allowedRecipients = JSON.parse(env.ALLOWED_RECIPIENTS || '[]'); if (!allowedRecipients.includes(message.to)) { let aliasRecord = null; - try { - aliasRecord = await env.QUOTA_KV.get('alias::' + message.to, 'json'); - } catch (_) {} + if (typeof env.QUOTA_KV !== 'undefined') { + try { + aliasRecord = await env.QUOTA_KV.get('alias::' + message.to, 'json'); + } catch (_) {} + } if (!aliasRecord) { message.setReject("Recipient not allowed"); @@ -81,7 +83,7 @@ export default { to: message.to, resolved_mailbox: resolvedMailbox || message.to, via_alias: resolvedMailbox ? "1" : "0", - subject: message.headers.get("subject") || "", + subject: (message.headers.get("subject") || "").slice(0, 500), receivedAt: receivedAt } }); @@ -121,6 +123,8 @@ export default { async scheduled(event, env, ctx) { console.log("Cron: scanning R2 temp_cache for buffered emails..."); + const MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000; + const now = Date.now(); let cursor; let processed = 0; let failed = 0; @@ -129,11 +133,19 @@ export default { const list = await env.EMAIL_BUCKET.list({ prefix: "temp_cache/", limit: 100, - cursor: cursor + cursor: cursor, + include: ['customMetadata'] }); for (const object of list.objects) { const r2Key = object.key; + + if (object.uploaded && (now - object.uploaded.getTime()) > MAX_AGE_MS) { + console.warn(`Cron: expiring ${r2Key} (age > 7d)`); + try { await env.EMAIL_BUCKET.delete(r2Key); } catch (_) {} + failed++; + continue; + } const meta = object.customMetadata || {}; const messageId = r2Key.replace("temp_cache/", "").replace(".eml", ""); diff --git a/dockflare/app/templates/docs/ch-barnduetsch/Quick-Start-Docker-Compose.md b/dockflare/app/templates/docs/ch-barnduetsch/Quick-Start-Docker-Compose.md index a2ed6e4..c551635 100644 --- a/dockflare/app/templates/docs/ch-barnduetsch/Quick-Start-Docker-Compose.md +++ b/dockflare/app/templates/docs/ch-barnduetsch/Quick-Start-Docker-Compose.md @@ -4,26 +4,22 @@ Die Aaleitig zeigt dr schnäuschti Wäg, wie du DockFlare mit em ghärtete Socke ## Option A — Eizeiler-Installation (Empfohle) -Dr schnäuschti Wäg, DockFlare zum Laufe z bringe, isch dr Installations-Skript uf [dockflare.app](https://dockflare.app): +Dr schnäuschti Wäg, DockFlare zum Laufe z bringe, isch dr interaktivi Installations-Skript uf [dockflare.app](https://dockflare.app): ```bash -curl -fsSL https://dockflare.app/install.sh | bash +bash <(curl -fsSL https://dockflare.app/install.sh) ``` -Dr Skript macht Folgendes: -1. Prüeft, ob Docker u Docker Compose verfüegbar si. -2. Erstellt `~/dockflare/` u schrybt dort e `docker-compose.yml` ane. -3. Erstellt s Docker-Netzwerk `cloudflare-net`, falls's no nid existiert. -4. Ladet d Images abe u startet alli Dienscht. -5. Zeigt d lokali URL aa, wenn's fertig isch. +Dr Skript füehrt di dür folgende Schritt: +1. Uswahl vom Installationsverzeuchnis (Standard: `~/dockflare/`). +2. Uswahl vom lokale UI-Port (Standard: `5000`). +3. Optionali Konfiguration vomene Cloudflare-Tunnel für DockFlare. +4. Optionali Aktivierig vom E-Mail-Profil (dockflare-mail-manager + dockflare-webmail). + +Dernoo schrybt er d `docker-compose.yml`, lot di se aaluege u fragt vor em Starte nochmal nach. Sobald alles lauft, mach `http://:5000` uf u füehrt di dr Iirichtigsassistent dür. -> **Optionali Yberschribige** — setz Umgebigsvariable vor em Pipe, zum d Installation aapasse: -> ```bash -> DOCKFLARE_PORT=8080 DOCKFLARE_DIR=/opt/dockflare curl -fsSL https://dockflare.app/install.sh | bash -> ``` - --- ## Option B — Manuälli Docker-Compose-Irichtig diff --git a/dockflare/app/templates/docs/de/Quick-Start-Docker-Compose.md b/dockflare/app/templates/docs/de/Quick-Start-Docker-Compose.md index f4264b9..6f7b812 100644 --- a/dockflare/app/templates/docs/de/Quick-Start-Docker-Compose.md +++ b/dockflare/app/templates/docs/de/Quick-Start-Docker-Compose.md @@ -4,26 +4,22 @@ Diese Anleitung zeigt den schnellsten Weg, um DockFlare mit dem gehärteten Sock ## Option A — Einzeiliges Installations-Skript (Empfohlen) -Der schnellste Weg, DockFlare zum Laufen zu bringen, ist das Installations-Skript unter [dockflare.app](https://dockflare.app): +Der schnellste Weg, DockFlare zum Laufen zu bringen, ist das interaktive Installations-Skript unter [dockflare.app](https://dockflare.app): ```bash -curl -fsSL https://dockflare.app/install.sh | bash +bash <(curl -fsSL https://dockflare.app/install.sh) ``` -Das Skript führt folgende Schritte durch: -1. Prüft, ob Docker und Docker Compose verfügbar sind. -2. Erstellt `~/dockflare/` und schreibt dort eine `docker-compose.yml`. -3. Erstellt das Docker-Netzwerk `cloudflare-net`, falls es noch nicht existiert. -4. Lädt die Images herunter und startet alle Dienste. -5. Gibt die lokale URL aus, wenn fertig. +Das Skript führt Sie durch folgende Schritte: +1. Auswahl des Installationsverzeichnisses (Standard: `~/dockflare/`). +2. Auswahl des lokalen UI-Ports (Standard: `5000`). +3. Optional: Konfiguration eines Cloudflare-Tunnels für DockFlare selbst. +4. Optional: Aktivierung des E-Mail-Profils (dockflare-mail-manager + dockflare-webmail). + +Anschließend schreibt es die `docker-compose.yml`, ermöglicht eine Überprüfung und fragt vor dem Starten nach. Nach dem Start öffnen Sie `http://:5000` und schließen Sie den Einrichtungsassistenten ab. -> **Optionale Überschreibungen** — Setzen Sie Umgebungsvariablen vor dem Ausführen, um die Installation anzupassen: -> ```bash -> DOCKFLARE_PORT=8080 DOCKFLARE_DIR=/opt/dockflare curl -fsSL https://dockflare.app/install.sh | bash -> ``` - --- ## Option B — Manuelle Docker-Compose-Einrichtung diff --git a/dockflare/app/templates/docs/en/Quick-Start-Docker-Compose.md b/dockflare/app/templates/docs/en/Quick-Start-Docker-Compose.md index d0aa763..2631e00 100644 --- a/dockflare/app/templates/docs/en/Quick-Start-Docker-Compose.md +++ b/dockflare/app/templates/docs/en/Quick-Start-Docker-Compose.md @@ -4,26 +4,22 @@ This guide walks through the fastest way to run DockFlare with the hardened sock ## Option A — One-Liner Install (Recommended) -The quickest way to get DockFlare running is the install script hosted at [dockflare.app](https://dockflare.app): +The quickest way to get DockFlare running is the interactive install script hosted at [dockflare.app](https://dockflare.app): ```bash -curl -fsSL https://dockflare.app/install.sh | bash +bash <(curl -fsSL https://dockflare.app/install.sh) ``` -The script will: -1. Check that Docker and Docker Compose are available. -2. Create `~/dockflare/` and write a `docker-compose.yml` there. -3. Create the `cloudflare-net` Docker network if it does not exist. -4. Pull the images and start all services. -5. Print the local URL when done. +The script will guide you through: +1. Choosing an install directory (default: `~/dockflare/`). +2. Choosing a local UI port (default: `5000`). +3. Optionally configuring a Cloudflare Tunnel for DockFlare itself. +4. Optionally enabling the Email profile (dockflare-mail-manager + dockflare-webmail). + +It then writes `docker-compose.yml`, lets you review it, and asks before pulling and starting the stack. Once running, open `http://:5000` and complete the setup wizard. -> **Optional overrides** — set environment variables before piping to control the install: -> ```bash -> DOCKFLARE_PORT=8080 DOCKFLARE_DIR=/opt/dockflare curl -fsSL https://dockflare.app/install.sh | bash -> ``` - --- ## Option B — Manual Docker Compose diff --git a/dockflare/app/templates/docs/es/Quick-Start-Docker-Compose.md b/dockflare/app/templates/docs/es/Quick-Start-Docker-Compose.md index 928d95a..162c35c 100644 --- a/dockflare/app/templates/docs/es/Quick-Start-Docker-Compose.md +++ b/dockflare/app/templates/docs/es/Quick-Start-Docker-Compose.md @@ -4,26 +4,22 @@ Esta guía explica la forma más rápida de ejecutar DockFlare con el socket pro ## Opción A — Instalación en un solo comando (Recomendado) -La forma más rápida de poner en marcha DockFlare es el script de instalación alojado en [dockflare.app](https://dockflare.app): +La forma más rápida de poner en marcha DockFlare es el script de instalación interactivo alojado en [dockflare.app](https://dockflare.app): ```bash -curl -fsSL https://dockflare.app/install.sh | bash +bash <(curl -fsSL https://dockflare.app/install.sh) ``` -El script realizará lo siguiente: -1. Comprobar que Docker y Docker Compose están disponibles. -2. Crear `~/dockflare/` y escribir un archivo `docker-compose.yml` allí. -3. Crear la red Docker `cloudflare-net` si no existe. -4. Descargar las imágenes e iniciar todos los servicios. -5. Mostrar la URL local al finalizar. +El script le guiará a través de: +1. Elección del directorio de instalación (predeterminado: `~/dockflare/`). +2. Elección del puerto local de la interfaz (predeterminado: `5000`). +3. Configuración opcional de un túnel de Cloudflare para DockFlare. +4. Activación opcional del perfil de correo electrónico (dockflare-mail-manager + dockflare-webmail). + +A continuación, escribe el archivo `docker-compose.yml`, permite revisarlo y pregunta antes de iniciar el stack. Una vez en ejecución, abra `http://:5000` y complete el asistente de configuración. -> **Opciones de personalización** — establezca variables de entorno antes de ejecutar el comando para controlar la instalación: -> ```bash -> DOCKFLARE_PORT=8080 DOCKFLARE_DIR=/opt/dockflare curl -fsSL https://dockflare.app/install.sh | bash -> ``` - --- ## Opción B — Docker Compose manual diff --git a/dockflare/app/templates/docs/fr/Quick-Start-Docker-Compose.md b/dockflare/app/templates/docs/fr/Quick-Start-Docker-Compose.md index 2a1c544..e841dc2 100644 --- a/dockflare/app/templates/docs/fr/Quick-Start-Docker-Compose.md +++ b/dockflare/app/templates/docs/fr/Quick-Start-Docker-Compose.md @@ -4,26 +4,22 @@ Ce guide présente le moyen le plus rapide d'exécuter DockFlare avec un socket- ## Option A — Installation en une seule commande (Recommandé) -La façon la plus rapide de démarrer DockFlare est d'utiliser le script d'installation hébergé sur [dockflare.app](https://dockflare.app) : +La façon la plus rapide de démarrer DockFlare est d'utiliser le script d'installation interactif hébergé sur [dockflare.app](https://dockflare.app) : ```bash -curl -fsSL https://dockflare.app/install.sh | bash +bash <(curl -fsSL https://dockflare.app/install.sh) ``` -Le script va : -1. Vérifier que Docker et Docker Compose sont disponibles. -2. Créer `~/dockflare/` et y écrire un fichier `docker-compose.yml`. -3. Créer le réseau Docker `cloudflare-net` s'il n'existe pas encore. -4. Télécharger les images et démarrer tous les services. -5. Afficher l'URL locale une fois terminé. +Le script vous guidera à travers : +1. Le choix du répertoire d'installation (par défaut : `~/dockflare/`). +2. Le choix du port local de l'interface (par défaut : `5000`). +3. La configuration optionnelle d'un tunnel Cloudflare pour DockFlare. +4. L'activation optionnelle du profil e-mail (dockflare-mail-manager + dockflare-webmail). + +Il génère ensuite le fichier `docker-compose.yml`, vous permet de le vérifier et demande confirmation avant de démarrer le stack. Une fois démarré, ouvrez `http://:5000` et suivez l'assistant de configuration. -> **Substitutions optionnelles** — définissez des variables d'environnement avant la commande pour personnaliser l'installation : -> ```bash -> DOCKFLARE_PORT=8080 DOCKFLARE_DIR=/opt/dockflare curl -fsSL https://dockflare.app/install.sh | bash -> ``` - --- ## Option B — Configuration manuelle avec Docker Compose diff --git a/dockflare/app/templates/docs/id/Quick-Start-Docker-Compose.md b/dockflare/app/templates/docs/id/Quick-Start-Docker-Compose.md index e49fcaa..f63d3da 100644 --- a/dockflare/app/templates/docs/id/Quick-Start-Docker-Compose.md +++ b/dockflare/app/templates/docs/id/Quick-Start-Docker-Compose.md @@ -4,26 +4,22 @@ Panduan ini menjelaskan cara tercepat untuk menjalankan DockFlare dengan socket ## Opsi A — Instalasi Satu Perintah (Direkomendasikan) -Cara tercepat untuk menjalankan DockFlare adalah menggunakan skrip instalasi yang tersedia di [dockflare.app](https://dockflare.app): +Cara tercepat untuk menjalankan DockFlare adalah menggunakan skrip instalasi interaktif yang tersedia di [dockflare.app](https://dockflare.app): ```bash -curl -fsSL https://dockflare.app/install.sh | bash +bash <(curl -fsSL https://dockflare.app/install.sh) ``` -Skrip akan melakukan hal berikut: -1. Memeriksa bahwa Docker dan Docker Compose tersedia. -2. Membuat `~/dockflare/` dan menulis file `docker-compose.yml` di sana. -3. Membuat jaringan Docker `cloudflare-net` jika belum ada. -4. Menarik image dan memulai semua layanan. -5. Menampilkan URL lokal setelah selesai. +Skrip akan memandu Anda melalui: +1. Memilih direktori instalasi (default: `~/dockflare/`). +2. Memilih port UI lokal (default: `5000`). +3. Konfigurasi opsional tunnel Cloudflare untuk DockFlare. +4. Mengaktifkan profil email secara opsional (dockflare-mail-manager + dockflare-webmail). + +Kemudian menghasilkan `docker-compose.yml`, memungkinkan Anda meninjaunya, dan meminta konfirmasi sebelum memulai stack. Setelah berjalan, buka `http://:5000` dan selesaikan wizard pengaturan. -> **Opsi kustomisasi** — atur variabel lingkungan sebelum menjalankan perintah untuk mengontrol instalasi: -> ```bash -> DOCKFLARE_PORT=8080 DOCKFLARE_DIR=/opt/dockflare curl -fsSL https://dockflare.app/install.sh | bash -> ``` - --- ## Opsi B — Docker Compose Manual diff --git a/dockflare/app/templates/docs/it/Quick-Start-Docker-Compose.md b/dockflare/app/templates/docs/it/Quick-Start-Docker-Compose.md index ac7483e..ae72002 100644 --- a/dockflare/app/templates/docs/it/Quick-Start-Docker-Compose.md +++ b/dockflare/app/templates/docs/it/Quick-Start-Docker-Compose.md @@ -4,26 +4,22 @@ Questa guida illustra il modo più veloce per eseguire DockFlare con un `docker- ## Opzione A — Installazione con un solo comando (Consigliato) -Il modo più rapido per avviare DockFlare è lo script di installazione disponibile su [dockflare.app](https://dockflare.app): +Il modo più rapido per avviare DockFlare è lo script di installazione interattivo disponibile su [dockflare.app](https://dockflare.app): ```bash -curl -fsSL https://dockflare.app/install.sh | bash +bash <(curl -fsSL https://dockflare.app/install.sh) ``` -Lo script eseguirà le seguenti operazioni: -1. Verificare che Docker e Docker Compose siano disponibili. -2. Creare `~/dockflare/` e scrivere un file `docker-compose.yml` al suo interno. -3. Creare la rete Docker `cloudflare-net` se non esiste ancora. -4. Scaricare le immagini e avviare tutti i servizi. -5. Stampare l'URL locale al termine. +Lo script ti guiderà attraverso: +1. La scelta della directory di installazione (predefinita: `~/dockflare/`). +2. La scelta della porta locale dell'interfaccia (predefinita: `5000`). +3. La configurazione opzionale di un tunnel Cloudflare per DockFlare. +4. L'attivazione opzionale del profilo e-mail (dockflare-mail-manager + dockflare-webmail). + +Genera quindi il file `docker-compose.yml`, ti permette di verificarlo e chiede conferma prima di avviare lo stack. Una volta avviato, apri `http://:5000` e completa la procedura guidata di configurazione. -> **Sostituzioni opzionali** — imposta le variabili d'ambiente prima del pipe per controllare l'installazione: -> ```bash -> DOCKFLARE_PORT=8080 DOCKFLARE_DIR=/opt/dockflare curl -fsSL https://dockflare.app/install.sh | bash -> ``` - --- ## Opzione B — Docker Compose manuale diff --git a/dockflare/app/templates/docs/ja/Quick-Start-Docker-Compose.md b/dockflare/app/templates/docs/ja/Quick-Start-Docker-Compose.md index 94726b7..518b5be 100644 --- a/dockflare/app/templates/docs/ja/Quick-Start-Docker-Compose.md +++ b/dockflare/app/templates/docs/ja/Quick-Start-Docker-Compose.md @@ -4,26 +4,22 @@ ## オプション A — ワンライナーインストール(推奨) -DockFlare を最短で起動するには、[dockflare.app](https://dockflare.app) でホストされているインストールスクリプトを使用します: +DockFlare を最短で起動するには、[dockflare.app](https://dockflare.app) でホストされているインタラクティブなインストールスクリプトを使用します: ```bash -curl -fsSL https://dockflare.app/install.sh | bash +bash <(curl -fsSL https://dockflare.app/install.sh) ``` -スクリプトは以下を実行します: -1. Docker と Docker Compose が利用可能かどうかを確認します。 -2. `~/dockflare/` を作成し、そこに `docker-compose.yml` を書き込みます。 -3. `cloudflare-net` Docker ネットワークが存在しない場合は作成します。 -4. イメージをプルしてすべてのサービスを起動します。 -5. 完了したらローカル URL を表示します。 +スクリプトは以下の手順を案内します: +1. インストールディレクトリの選択(デフォルト:`~/dockflare/`)。 +2. ローカル UI ポートの選択(デフォルト:`5000`)。 +3. DockFlare 自身の Cloudflare トンネルの設定(オプション)。 +4. メールプロファイルの有効化(オプション)(dockflare-mail-manager + dockflare-webmail)。 + +その後、`docker-compose.yml` を生成し、確認を求めてからスタックを起動します。 起動後、`http://:5000` を開いてセットアップウィザードを完了してください。 -> **オプションの上書き設定** — パイプする前に環境変数を設定してインストールをカスタマイズできます: -> ```bash -> DOCKFLARE_PORT=8080 DOCKFLARE_DIR=/opt/dockflare curl -fsSL https://dockflare.app/install.sh | bash -> ``` - --- ## オプション B — 手動 Docker Compose diff --git a/dockflare/app/templates/docs/pl/Quick-Start-Docker-Compose.md b/dockflare/app/templates/docs/pl/Quick-Start-Docker-Compose.md index 03151c6..fef9830 100644 --- a/dockflare/app/templates/docs/pl/Quick-Start-Docker-Compose.md +++ b/dockflare/app/templates/docs/pl/Quick-Start-Docker-Compose.md @@ -4,26 +4,22 @@ Ten przewodnik pokazuje najszybszy sposób uruchomienia DockFlare z wzmocnionym ## Opcja A — Instalacja jednym poleceniem (Zalecane) -Najszybszym sposobem uruchomienia DockFlare jest skrypt instalacyjny dostępny na [dockflare.app](https://dockflare.app): +Najszybszym sposobem uruchomienia DockFlare jest interaktywny skrypt instalacyjny dostępny na [dockflare.app](https://dockflare.app): ```bash -curl -fsSL https://dockflare.app/install.sh | bash +bash <(curl -fsSL https://dockflare.app/install.sh) ``` -Skrypt wykona następujące czynności: -1. Sprawdzi, czy Docker i Docker Compose są dostępne. -2. Utworzy katalog `~/dockflare/` i zapisze tam plik `docker-compose.yml`. -3. Utworzy sieć Docker `cloudflare-net`, jeśli jeszcze nie istnieje. -4. Pobierze obrazy i uruchomi wszystkie usługi. -5. Wyświetli lokalny adres URL po zakończeniu. +Skrypt przeprowadzi Cię przez: +1. Wybór katalogu instalacji (domyślnie: `~/dockflare/`). +2. Wybór lokalnego portu interfejsu (domyślnie: `5000`). +3. Opcjonalną konfigurację tunelu Cloudflare dla DockFlare. +4. Opcjonalne włączenie profilu e-mail (dockflare-mail-manager + dockflare-webmail). + +Następnie generuje plik `docker-compose.yml`, umożliwia jego przegląd i pyta o potwierdzenie przed uruchomieniem stacka. Po uruchomieniu otwórz `http://:5000` i ukończ kreator konfiguracji. -> **Opcjonalne parametry** — ustaw zmienne środowiskowe przed uruchomieniem, aby dostosować instalację: -> ```bash -> DOCKFLARE_PORT=8080 DOCKFLARE_DIR=/opt/dockflare curl -fsSL https://dockflare.app/install.sh | bash -> ``` - --- ## Opcja B — Ręczna konfiguracja Docker Compose diff --git a/dockflare/app/templates/docs/zh/Quick-Start-Docker-Compose.md b/dockflare/app/templates/docs/zh/Quick-Start-Docker-Compose.md index 468db59..020bc3d 100644 --- a/dockflare/app/templates/docs/zh/Quick-Start-Docker-Compose.md +++ b/dockflare/app/templates/docs/zh/Quick-Start-Docker-Compose.md @@ -4,26 +4,22 @@ ## 选项 A — 一键安装(推荐) -启动 DockFlare 最快捷的方式是使用托管在 [dockflare.app](https://dockflare.app) 的安装脚本: +启动 DockFlare 最快捷的方式是使用托管在 [dockflare.app](https://dockflare.app) 的交互式安装脚本: ```bash -curl -fsSL https://dockflare.app/install.sh | bash +bash <(curl -fsSL https://dockflare.app/install.sh) ``` -脚本将执行以下操作: -1. 检查 Docker 和 Docker Compose 是否可用。 -2. 创建 `~/dockflare/` 目录并在其中写入 `docker-compose.yml`。 -3. 如果 `cloudflare-net` Docker 网络不存在则自动创建。 -4. 拉取镜像并启动所有服务。 -5. 完成后打印本地访问地址。 +脚本将引导您完成以下步骤: +1. 选择安装目录(默认:`~/dockflare/`)。 +2. 选择本地 UI 端口(默认:`5000`)。 +3. 可选:为 DockFlare 配置 Cloudflare 隧道。 +4. 可选:启用邮件配置文件(dockflare-mail-manager + dockflare-webmail)。 + +随后生成 `docker-compose.yml`,允许您查看,并在启动前确认。 启动后,打开 `http://:5000` 并完成设置向导。 -> **可选覆盖参数** — 在管道命令前设置环境变量以自定义安装行为: -> ```bash -> DOCKFLARE_PORT=8080 DOCKFLARE_DIR=/opt/dockflare curl -fsSL https://dockflare.app/install.sh | bash -> ``` - --- ## 选项 B — 手动 Docker Compose diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..ade3614 --- /dev/null +++ b/install.sh @@ -0,0 +1,543 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ----------------------------------------------------------------------------- +# DockFlare Master — Install Script +# https://dockflare.app +# +# Usage (interactive — recommended): +# bash <(curl -fsSL https://dockflare.app/install.sh) +# +# +# Optional env overrides (non-interactive / pipe mode): +# DOCKFLARE_PORT — host port to expose DockFlare UI on (default: 5000) +# DOCKFLARE_DIR — install directory (default: $HOME/dockflare) +# DOCKFLARE_UID — UID for data volume ownership (default: 65532) +# DOCKFLARE_GID — GID for data volume ownership (default: 65532) +# DOCKFLARE_EMAIL — set to "true" to enable email profile (default: false) +# DOCKFLARE_TLD — base domain e.g. example.com (required if EMAIL=true) +# DOCKFLARE_DOMAIN — DockFlare master domain (default: dockflare.$DOCKFLARE_TLD) +# +# Examples: +# bash <(curl -fsSL https://dockflare.app/install.sh) +# local run +# bash install.sh +# ----------------------------------------------------------------------------- + +DOCKFLARE_PORT="${DOCKFLARE_PORT:-5000}" +DOCKFLARE_DIR="${DOCKFLARE_DIR:-$HOME/dockflare}" +DOCKFLARE_UID="${DOCKFLARE_UID:-65532}" +DOCKFLARE_GID="${DOCKFLARE_GID:-65532}" +DOCKFLARE_EMAIL="${DOCKFLARE_EMAIL:-false}" +DOCKFLARE_TLD="${DOCKFLARE_TLD:-}" +DOCKFLARE_DOMAIN="${DOCKFLARE_DOMAIN:-}" + +BOLD="\033[1m" +GREEN="\033[0;32m" +YELLOW="\033[0;33m" +RED="\033[0;31m" +CYAN="\033[0;36m" +BLUE="\033[0;34m" +ORANGE="\033[0;33m" +RESET="\033[0m" + +# Detect interactive mode (stdin is a TTY) +if [ -t 0 ]; then + IS_INTERACTIVE=true +else + IS_INTERACTIVE=false +fi + +banner() { + # Split each line at position 35: DOCK (blue) | FLARE (orange) + local lines=( + " ██████╗ ██████╗ ██████╗██╗ ██╗███████╗██╗ █████╗ ██████╗ ███████╗" + " ██╔══██╗██╔═══██╗██╔════╝██║ ██╔╝██╔════╝██║ ██╔══██╗██╔══██╗██╔════╝" + " ██║ ██║██║ ██║██║ █████╔╝ █████╗ ██║ ███████║██████╔╝█████╗ " + " ██║ ██║██║ ██║██║ ██╔═██╗ ██╔══╝ ██║ ██╔══██║██╔══██╗██╔══╝ " + " ██████╔╝╚██████╔╝╚██████╗██║ ██╗██║ ███████╗██║ ██║██║ ██║███████╗" + " ╚═════╝ ╚═════╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝" + ) + echo "" + for line in "${lines[@]}"; do + echo -e "${BLUE}${BOLD}${line:0:35}${ORANGE}${line:35}${RESET}" + done + echo "" + echo -e " ${BOLD}Master Installer${RESET} · https://dockflare.app" + echo "" +} + +info() { echo -e " ${GREEN}✔${RESET} $*"; } +warn() { echo -e " ${YELLOW}⚠${RESET} $*"; } +error() { echo -e " ${RED}✖${RESET} $*" >&2; } +section() { echo ""; echo -e " ${BOLD}$*${RESET}"; echo " $(printf '─%.0s' {1..60})"; } + +# prompt