From 2b5f43c3c78ab6e3d740b2360c9d4021bddd4dc9 Mon Sep 17 00:00:00 2001 From: Arun Fung Date: Fri, 24 Jul 2026 23:37:55 +0800 Subject: [PATCH 1/4] feat: add Fizzy app metadata --- apps/fizzy/README.md | 45 ++++++++++++++++++++++++++++++++++ apps/fizzy/README_en.md | 53 ++++++++++++++++++++++++++++++++++++++++ apps/fizzy/data.yml | 34 ++++++++++++++++++++++++++ apps/fizzy/logo.png | Bin 0 -> 5505 bytes 4 files changed, 132 insertions(+) create mode 100644 apps/fizzy/README.md create mode 100644 apps/fizzy/README_en.md create mode 100644 apps/fizzy/data.yml create mode 100644 apps/fizzy/logo.png diff --git a/apps/fizzy/README.md b/apps/fizzy/README.md new file mode 100644 index 000000000000..0c4e7c6e8512 --- /dev/null +++ b/apps/fizzy/README.md @@ -0,0 +1,45 @@ +# Fizzy + +Fizzy 是 37signals 推出的 Kanban 项目管理工具,用于组织议题、想法和团队工作。 +该应用包使用 Fizzy 官方 Docker 镜像,并将数据库、队列、缓存和附件统一保存在 +安装实例的 `data` 目录中。 + +## 安装和首次登录 + +1. 选择一个未占用的 HTTP 端口。 +2. 将 `BASE_URL` 设置为浏览器实际访问 Fizzy 的完整地址。 +3. `SECRET_KEY_BASE` 由 1Panel 自动生成,安装后不要修改。 +4. SMTP 可以留空。没有配置 SMTP 时,登录验证码会写入 Fizzy 容器日志,可在 + 1Panel 的容器日志页面查看。 + +## SMTP + +Fizzy 自身后台不提供 SMTP 服务器配置页面。需要发邮件时,请在 1Panel 的 Fizzy +应用参数中填写发件地址、SMTP 服务器、端口、用户名、密码和 TLS 选项,然后重启 +应用。 + +`SMTP_TLS=true` 仅用于要求隐式 TLS 的 SMTPS 服务器,通常使用端口 `465`。 +大多数使用 STARTTLS 的服务器应保持 `SMTP_TLS=false`,通常使用端口 `587`。 + +## 域名和 HTTPS + +Fizzy 容器内部只提供 HTTP。请使用 1Panel 网站功能创建反向代理并配置 HTTPS +证书。域名启用后,将 `BASE_URL` 修改为最终地址,例如 +`https://fizzy.example.com`,然后重启应用。 + +## 数据和备份 + +所有持久化内容都位于安装实例的 `data` 目录,对应容器内的 +`/rails/storage`。备份前建议停止应用,并完整备份该目录。恢复时应恢复完整目录 +并保留 UID/GID `1000:1000` 的写权限。 + +## 版本说明 + +该应用使用 `ghcr.io/basecamp/fizzy:latest` 滚动镜像。上游更新可能在重新拉取 +镜像后直接生效,因此升级前必须备份 `data` 目录。 + +## 许可证 + +Fizzy 的源代码采用 O’Saasy License。该许可证允许自托管、修改和分发,但限制将 +Fizzy 作为竞争性的托管或 SaaS 服务提供。它不是 OSI 批准的标准开源许可证; +部署前请阅读上游 `LICENSE.md`。 diff --git a/apps/fizzy/README_en.md b/apps/fizzy/README_en.md new file mode 100644 index 000000000000..76add70509d5 --- /dev/null +++ b/apps/fizzy/README_en.md @@ -0,0 +1,53 @@ +# Fizzy + +Fizzy is a Kanban project management tool from 37signals for organizing issues, +ideas, and team work. This package uses the official Fizzy Docker image and +stores its databases, queues, cache, and attachments in the installation's +`data` directory. + +## Installation and first sign-in + +1. Choose an unused HTTP port. +2. Set `BASE_URL` to the complete URL that browsers use to reach Fizzy. +3. 1Panel generates `SECRET_KEY_BASE`; do not change it after installation. +4. SMTP may be left empty. Without SMTP, sign-in verification codes are written + to the Fizzy container logs and can be read from the 1Panel container log + page. + +## SMTP + +Fizzy does not provide an SMTP server configuration page in its own +administration UI. To enable email, edit the Fizzy application parameters in +1Panel, enter the sender address, SMTP server, port, username, password, and TLS +option, then restart the application. + +Set `SMTP_TLS=true` only for an SMTP server that requires implicit TLS, usually +on port `465`. Most servers using STARTTLS should keep `SMTP_TLS=false`, usually +on port `587`. + +## Domain and HTTPS + +The Fizzy container serves HTTP only. Create a reverse-proxy website and manage +the HTTPS certificate in 1Panel. After enabling the domain, change `BASE_URL` to +the final address, such as `https://fizzy.example.com`, and restart the +application. + +## Data and backups + +All persistent content is in the installation's `data` directory, mounted at +`/rails/storage` inside the container. Stop the application before a backup, +copy the complete directory, and preserve write access for UID/GID `1000:1000` +when restoring it. + +## Version policy + +This application uses the rolling image `ghcr.io/basecamp/fizzy:latest`. +Upstream changes can take effect after the image is pulled again, so back up the +`data` directory before updating. + +## License + +Fizzy's source is available under the O'Saasy License. It permits self-hosting, +modification, and distribution, but restricts offering Fizzy as a competing +hosted or SaaS service. It is not an OSI-approved open-source license; read the +upstream `LICENSE.md` before deployment. diff --git a/apps/fizzy/data.yml b/apps/fizzy/data.yml new file mode 100644 index 000000000000..237b6b8e200f --- /dev/null +++ b/apps/fizzy/data.yml @@ -0,0 +1,34 @@ +name: Fizzy +tags: + - 实用工具 +title: 可自托管的 Kanban 项目管理工具 +description: 可自托管的 Kanban 项目管理工具 +additionalProperties: + key: fizzy + name: Fizzy + tags: + - Tool + shortDescZh: 可自托管的 Kanban 项目管理工具 + shortDescEn: A self-hosted Kanban project management tool + description: + en: A self-hosted Kanban project management tool + es-es: Una herramienta de gestión de proyectos Kanban autoalojada + fa: 'ابزار مدیریت پروژه کانبان خودمیزبان' + ja: セルフホスト型のカンバンプロジェクト管理ツール + ms: Alat pengurusan projek Kanban hos sendiri + pt-br: Uma ferramenta de gerenciamento de projetos Kanban auto-hospedada + ru: Самостоятельно размещаемый инструмент управления проектами Kanban + ko: 셀프 호스팅 Kanban 프로젝트 관리 도구 + zh-Hant: 可自託管的 Kanban 專案管理工具 + zh: 可自托管的 Kanban 项目管理工具 + tr: Kendi sunucunuzda barındırabileceğiniz Kanban proje yönetim aracı + type: website + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://fizzy.do/ + github: https://github.com/basecamp/fizzy + document: https://github.com/basecamp/fizzy/blob/main/docs/docker-deployment.md + architectures: + - amd64 + - arm64 diff --git a/apps/fizzy/logo.png b/apps/fizzy/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d71d883068c8b148b11af87586c3db84362561f6 GIT binary patch literal 5505 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 Date: Fri, 24 Jul 2026 23:43:12 +0800 Subject: [PATCH 2/4] feat: package Fizzy runtime --- apps/fizzy/latest/data.yml | 181 +++++++++++++++++++++++++++ apps/fizzy/latest/data/.gitkeep | 0 apps/fizzy/latest/docker-compose.yml | 26 ++++ apps/fizzy/latest/scripts/init.sh | 6 + 4 files changed, 213 insertions(+) create mode 100644 apps/fizzy/latest/data.yml create mode 100644 apps/fizzy/latest/data/.gitkeep create mode 100644 apps/fizzy/latest/docker-compose.yml create mode 100755 apps/fizzy/latest/scripts/init.sh diff --git a/apps/fizzy/latest/data.yml b/apps/fizzy/latest/data.yml new file mode 100644 index 000000000000..6b282dd41701 --- /dev/null +++ b/apps/fizzy/latest/data.yml @@ -0,0 +1,181 @@ +additionalProperties: + formFields: + - default: 3000 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP 端口 + label: + en: HTTP Port + es-es: Puerto HTTP + fa: 'پورت HTTP' + ja: HTTP ポート + ms: Port HTTP + pt-br: Porta HTTP + ru: HTTP-порт + ko: HTTP 포트 + zh-Hant: HTTP 埠 + zh: HTTP 端口 + tr: HTTP Bağlantı Noktası + required: true + rule: paramPort + type: number + - default: http://localhost:3000 + edit: true + envKey: BASE_URL + labelEn: Base URL + labelZh: 外部访问地址 + label: + en: Base URL + es-es: URL base + fa: 'نشانی پایه' + ja: ベース URL + ms: URL Asas + pt-br: URL base + ru: Базовый URL + ko: 기본 URL + zh-Hant: 外部訪問地址 + zh: 外部访问地址 + tr: Temel URL + required: true + rule: paramHttp + type: text + - default: fizzy + envKey: SECRET_KEY_BASE + labelEn: Secret Key Base + labelZh: 加密密钥 + label: + en: Secret Key Base + es-es: Clave secreta base + fa: 'کلید رمزنگاری پایه' + ja: シークレットキーベース + ms: Asas Kunci Rahsia + pt-br: Chave secreta base + ru: Базовый секретный ключ + ko: 기본 비밀 키 + zh-Hant: 加密金鑰 + zh: 加密密钥 + tr: Temel Gizli Anahtar + random: true + required: true + type: password + - default: "" + edit: true + envKey: MAILER_FROM_ADDRESS + labelEn: Mail From Address + labelZh: 发件地址 + label: + en: Mail From Address + es-es: Dirección del remitente + fa: 'نشانی فرستنده ایمیل' + ja: メール送信元アドレス + ms: Alamat Pengirim E-mel + pt-br: Endereço do remetente + ru: Адрес отправителя + ko: 메일 발신 주소 + zh-Hant: 發件地址 + zh: 发件地址 + tr: Gönderen E-posta Adresi + required: false + type: text + - default: "" + edit: true + envKey: SMTP_ADDRESS + labelEn: SMTP Server + labelZh: SMTP 服务器 + label: + en: SMTP Server + es-es: Servidor SMTP + fa: 'سرور SMTP' + ja: SMTP サーバー + ms: Pelayan SMTP + pt-br: Servidor SMTP + ru: SMTP-сервер + ko: SMTP 서버 + zh-Hant: SMTP 伺服器 + zh: SMTP 服务器 + tr: SMTP Sunucusu + required: false + type: text + - default: 587 + edit: true + envKey: SMTP_PORT + labelEn: SMTP Port + labelZh: SMTP 端口 + label: + en: SMTP Port + es-es: Puerto SMTP + fa: 'پورت SMTP' + ja: SMTP ポート + ms: Port SMTP + pt-br: Porta SMTP + ru: SMTP-порт + ko: SMTP 포트 + zh-Hant: SMTP 埠 + zh: SMTP 端口 + tr: SMTP Bağlantı Noktası + required: false + rule: paramPort + type: number + - default: "" + edit: true + envKey: SMTP_USERNAME + labelEn: SMTP Username + labelZh: SMTP 用户名 + label: + en: SMTP Username + es-es: Usuario SMTP + fa: 'نام کاربری SMTP' + ja: SMTP ユーザー名 + ms: Nama Pengguna SMTP + pt-br: Usuário SMTP + ru: Имя пользователя SMTP + ko: SMTP 사용자 이름 + zh-Hant: SMTP 使用者名稱 + zh: SMTP 用户名 + tr: SMTP Kullanıcı Adı + required: false + type: text + - default: "" + edit: true + envKey: SMTP_PASSWORD + labelEn: SMTP Password + labelZh: SMTP 密码 + label: + en: SMTP Password + es-es: Contraseña SMTP + fa: 'رمز عبور SMTP' + ja: SMTP パスワード + ms: Kata Laluan SMTP + pt-br: Senha SMTP + ru: Пароль SMTP + ko: SMTP 비밀번호 + zh-Hant: SMTP 密碼 + zh: SMTP 密码 + tr: SMTP Parolası + required: false + type: password + - default: "false" + edit: true + envKey: SMTP_TLS + labelEn: SMTP Implicit TLS + labelZh: SMTP 隐式 TLS + label: + en: SMTP Implicit TLS + es-es: TLS implícito SMTP + fa: 'TLS ضمنی SMTP' + ja: SMTP 暗黙的 TLS + ms: TLS Tersirat SMTP + pt-br: TLS implícito SMTP + ru: Неявный TLS для SMTP + ko: SMTP 암시적 TLS + zh-Hant: SMTP 隱式 TLS + zh: SMTP 隐式 TLS + tr: SMTP Örtük TLS + required: false + type: select + values: + - label: "false" + value: "false" + - label: "true" + value: "true" diff --git a/apps/fizzy/latest/data/.gitkeep b/apps/fizzy/latest/data/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/apps/fizzy/latest/docker-compose.yml b/apps/fizzy/latest/docker-compose.yml new file mode 100644 index 000000000000..cd7fc577a27b --- /dev/null +++ b/apps/fizzy/latest/docker-compose.yml @@ -0,0 +1,26 @@ +services: + fizzy: + image: ghcr.io/basecamp/fizzy:latest + container_name: ${CONTAINER_NAME} + restart: unless-stopped + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:80 + environment: + - SECRET_KEY_BASE=${SECRET_KEY_BASE} + - DISABLE_SSL=true + - BASE_URL=${BASE_URL} + - MAILER_FROM_ADDRESS=${MAILER_FROM_ADDRESS} + - SMTP_ADDRESS=${SMTP_ADDRESS} + - SMTP_PORT=${SMTP_PORT} + - SMTP_USERNAME=${SMTP_USERNAME} + - SMTP_PASSWORD=${SMTP_PASSWORD} + - SMTP_TLS=${SMTP_TLS} + volumes: + - ./data:/rails/storage + labels: + createdBy: "Apps" +networks: + 1panel-network: + external: true diff --git a/apps/fizzy/latest/scripts/init.sh b/apps/fizzy/latest/scripts/init.sh new file mode 100755 index 000000000000..f807ec725400 --- /dev/null +++ b/apps/fizzy/latest/scripts/init.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +set -e + +mkdir -p data +chown -R 1000:1000 data From aed15e3b38548afdbbffa16ece3ae87a4b73e73b Mon Sep 17 00:00:00 2001 From: Arun Fung Date: Wed, 29 Jul 2026 15:21:20 +0800 Subject: [PATCH 3/4] fix: require Fizzy SMTP configuration --- apps/fizzy/README.md | 11 ++++++----- apps/fizzy/README_en.md | 14 ++++++++------ apps/fizzy/latest/data.yml | 6 +++--- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/apps/fizzy/README.md b/apps/fizzy/README.md index 0c4e7c6e8512..e6e5e6140350 100644 --- a/apps/fizzy/README.md +++ b/apps/fizzy/README.md @@ -9,14 +9,15 @@ Fizzy 是 37signals 推出的 Kanban 项目管理工具,用于组织议题、 1. 选择一个未占用的 HTTP 端口。 2. 将 `BASE_URL` 设置为浏览器实际访问 Fizzy 的完整地址。 3. `SECRET_KEY_BASE` 由 1Panel 自动生成,安装后不要修改。 -4. SMTP 可以留空。没有配置 SMTP 时,登录验证码会写入 Fizzy 容器日志,可在 - 1Panel 的容器日志页面查看。 +4. 必须填写可用的 SMTP 配置。Fizzy 的注册和登录通过电子邮件验证码完成,只有 + 邮件投递正常后用户才能完成登录。 ## SMTP -Fizzy 自身后台不提供 SMTP 服务器配置页面。需要发邮件时,请在 1Panel 的 Fizzy -应用参数中填写发件地址、SMTP 服务器、端口、用户名、密码和 TLS 选项,然后重启 -应用。 +Fizzy 自身后台不提供 SMTP 服务器配置页面。请在 1Panel 的 Fizzy 应用参数中填写 +发件地址、SMTP 服务器和端口;用户名、密码和 TLS 选项按 SMTP 服务商要求填写。 +这些 SMTP 设置以后仍可在 1Panel 中编辑,但每次修改后都必须重启应用;在邮件投递 +恢复正常前,用户无法完成邮件验证码登录。 `SMTP_TLS=true` 仅用于要求隐式 TLS 的 SMTPS 服务器,通常使用端口 `465`。 大多数使用 STARTTLS 的服务器应保持 `SMTP_TLS=false`,通常使用端口 `587`。 diff --git a/apps/fizzy/README_en.md b/apps/fizzy/README_en.md index 76add70509d5..d8c6d1d0e967 100644 --- a/apps/fizzy/README_en.md +++ b/apps/fizzy/README_en.md @@ -10,16 +10,18 @@ stores its databases, queues, cache, and attachments in the installation's 1. Choose an unused HTTP port. 2. Set `BASE_URL` to the complete URL that browsers use to reach Fizzy. 3. 1Panel generates `SECRET_KEY_BASE`; do not change it after installation. -4. SMTP may be left empty. Without SMTP, sign-in verification codes are written - to the Fizzy container logs and can be read from the 1Panel container log - page. +4. A working SMTP configuration is required. Fizzy uses email verification + codes for sign-up and sign-in, so users cannot complete email-code login + until mail delivery works. ## SMTP Fizzy does not provide an SMTP server configuration page in its own -administration UI. To enable email, edit the Fizzy application parameters in -1Panel, enter the sender address, SMTP server, port, username, password, and TLS -option, then restart the application. +administration UI. In the Fizzy application parameters in 1Panel, enter the +sender address, SMTP server, and port; provide the username, password, and TLS +option as required by your SMTP provider. These settings may be edited later in +1Panel, but restart the application after every change; users cannot complete +email-code login until mail delivery works. Set `SMTP_TLS=true` only for an SMTP server that requires implicit TLS, usually on port `465`. Most servers using STARTTLS should keep `SMTP_TLS=false`, usually diff --git a/apps/fizzy/latest/data.yml b/apps/fizzy/latest/data.yml index 6b282dd41701..b54ba734eed1 100644 --- a/apps/fizzy/latest/data.yml +++ b/apps/fizzy/latest/data.yml @@ -76,7 +76,7 @@ additionalProperties: zh-Hant: 發件地址 zh: 发件地址 tr: Gönderen E-posta Adresi - required: false + required: true type: text - default: "" edit: true @@ -95,7 +95,7 @@ additionalProperties: zh-Hant: SMTP 伺服器 zh: SMTP 服务器 tr: SMTP Sunucusu - required: false + required: true type: text - default: 587 edit: true @@ -114,7 +114,7 @@ additionalProperties: zh-Hant: SMTP 埠 zh: SMTP 端口 tr: SMTP Bağlantı Noktası - required: false + required: true rule: paramPort type: number - default: "" From 877688b3472836a59b321d4781730a296ff159b8 Mon Sep 17 00:00:00 2001 From: Arun Fung Date: Wed, 29 Jul 2026 16:05:07 +0800 Subject: [PATCH 4/4] fix: handle optional SMTP auth and proxy HTTPS --- apps/fizzy/README.md | 11 ++++++++--- apps/fizzy/README_en.md | 14 ++++++++++---- apps/fizzy/latest/data.yml | 24 ++++++++++++++++++++++++ apps/fizzy/latest/docker-compose.yml | 4 +++- apps/fizzy/latest/scripts/entrypoint.sh | 11 +++++++++++ 5 files changed, 56 insertions(+), 8 deletions(-) create mode 100755 apps/fizzy/latest/scripts/entrypoint.sh diff --git a/apps/fizzy/README.md b/apps/fizzy/README.md index e6e5e6140350..4dbbc06fe7d1 100644 --- a/apps/fizzy/README.md +++ b/apps/fizzy/README.md @@ -24,9 +24,14 @@ Fizzy 自身后台不提供 SMTP 服务器配置页面。请在 1Panel 的 Fizzy ## 域名和 HTTPS -Fizzy 容器内部只提供 HTTP。请使用 1Panel 网站功能创建反向代理并配置 HTTPS -证书。域名启用后,将 `BASE_URL` 修改为最终地址,例如 -`https://fizzy.example.com`,然后重启应用。 +直接通过 HTTP 端口访问时,请选择 HTTP 模式(`DISABLE_SSL=true`),并将 +`BASE_URL` 设置为 `http://` 地址。 + +Fizzy 容器内部只提供 HTTP。若在 1Panel 网站中创建 HTTPS 反向代理并配置证书, +请在应用参数中选择 HTTPS 模式(`DISABLE_SSL=false`),将 `BASE_URL` 改为最终的 +`https://` 地址(例如 `https://fizzy.example.com`),确认反向代理发送 +`X-Forwarded-Proto`,然后重启应用。HTTPS 模式会启用 Rails 安全 Cookie、HSTS 和 +HTTP 到 HTTPS 的重定向,因此容器的原始 HTTP 端口不再是正常访问路径。 ## 数据和备份 diff --git a/apps/fizzy/README_en.md b/apps/fizzy/README_en.md index d8c6d1d0e967..0bddcc871bf0 100644 --- a/apps/fizzy/README_en.md +++ b/apps/fizzy/README_en.md @@ -29,10 +29,16 @@ on port `587`. ## Domain and HTTPS -The Fizzy container serves HTTP only. Create a reverse-proxy website and manage -the HTTPS certificate in 1Panel. After enabling the domain, change `BASE_URL` to -the final address, such as `https://fizzy.example.com`, and restart the -application. +For direct access through the HTTP port, select HTTP mode (`DISABLE_SSL=true`) +and set `BASE_URL` to an `http://` address. + +The Fizzy container serves HTTP only. When deploying behind a 1Panel HTTPS +reverse proxy with a managed certificate, select HTTPS mode +(`DISABLE_SSL=false`), set `BASE_URL` to the final `https://` address (for +example, `https://fizzy.example.com`), ensure the proxy sends +`X-Forwarded-Proto`, and restart the application. HTTPS mode enables Rails +secure cookies, HSTS, and HTTP-to-HTTPS redirects, so the raw HTTP port is no +longer the normal access path. ## Data and backups diff --git a/apps/fizzy/latest/data.yml b/apps/fizzy/latest/data.yml index b54ba734eed1..77b574e47580 100644 --- a/apps/fizzy/latest/data.yml +++ b/apps/fizzy/latest/data.yml @@ -59,6 +59,30 @@ additionalProperties: random: true required: true type: password + - default: "true" + edit: true + envKey: DISABLE_SSL + labelEn: HTTPS Mode + labelZh: HTTPS 模式 + label: + en: HTTPS Mode + es-es: Modo HTTPS + fa: 'حالت HTTPS' + ja: HTTPS モード + ms: Mod HTTPS + pt-br: Modo HTTPS + ru: Режим HTTPS + ko: HTTPS 모드 + zh-Hant: HTTPS 模式 + zh: HTTPS 模式 + tr: HTTPS Modu + required: true + type: select + values: + - label: Direct HTTP (true) + value: "true" + - label: HTTPS Reverse Proxy (false) + value: "false" - default: "" edit: true envKey: MAILER_FROM_ADDRESS diff --git a/apps/fizzy/latest/docker-compose.yml b/apps/fizzy/latest/docker-compose.yml index cd7fc577a27b..ba6d3a9389b5 100644 --- a/apps/fizzy/latest/docker-compose.yml +++ b/apps/fizzy/latest/docker-compose.yml @@ -7,9 +7,10 @@ services: - 1panel-network ports: - ${PANEL_APP_PORT_HTTP}:80 + entrypoint: ["/usr/local/bin/fizzy-entrypoint", "./bin/thrust", "./bin/rails", "server"] environment: - SECRET_KEY_BASE=${SECRET_KEY_BASE} - - DISABLE_SSL=true + - DISABLE_SSL=${DISABLE_SSL} - BASE_URL=${BASE_URL} - MAILER_FROM_ADDRESS=${MAILER_FROM_ADDRESS} - SMTP_ADDRESS=${SMTP_ADDRESS} @@ -19,6 +20,7 @@ services: - SMTP_TLS=${SMTP_TLS} volumes: - ./data:/rails/storage + - ./scripts/entrypoint.sh:/usr/local/bin/fizzy-entrypoint:ro labels: createdBy: "Apps" networks: diff --git a/apps/fizzy/latest/scripts/entrypoint.sh b/apps/fizzy/latest/scripts/entrypoint.sh new file mode 100755 index 000000000000..d4d1d1ad9eb4 --- /dev/null +++ b/apps/fizzy/latest/scripts/entrypoint.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +if [ "${SMTP_USERNAME-}" = "" ]; then + unset SMTP_USERNAME +fi + +if [ "${SMTP_PASSWORD-}" = "" ]; then + unset SMTP_PASSWORD +fi + +exec /rails/bin/docker-entrypoint "$@"