Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/docker-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Docker Build

on:
push:
branches: [main]
branches: [main, dev]
tags: ["v*"]
workflow_dispatch:

Expand Down Expand Up @@ -30,6 +30,7 @@ jobs:
type=semver,pattern={{major}}.{{minor}}
type=sha,format=long
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}
type=raw,value=dev,enable=${{ github.ref == 'refs/heads/dev' }}

- name: Login to GHCR
uses: docker/login-action@v3
Expand Down Expand Up @@ -66,6 +67,7 @@ jobs:
type=semver,pattern={{major}}.{{minor}}
type=sha,format=long
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}
type=raw,value=dev,enable=${{ github.ref == 'refs/heads/dev' }}

- name: Push to Docker Hub
if: steps.login_dh.outcome == 'success'
Expand Down
6 changes: 5 additions & 1 deletion deploy/README.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ Access `https://<domain-or-IP>/`. Nginx terminates TLS on 443 (your cert), proxi

### T4 (Nginx + acme.sh Auto)

**Certificate separation design:**
- nginx 443: uses `certs/ego.crt` + `ego.key` (Let's Encrypt certificate)
- EGo 5001: uses `certs/ego-selfsigned.crt` + `ego-selfsigned.key` (self-signed certificate)

**One-click deployment:**

```bash
Expand Down Expand Up @@ -94,7 +98,7 @@ docker compose exec acme acme.sh --issue --webroot /var/www/acme -d your.domain
CF_Token=your_token docker compose up -d
docker compose exec acme acme.sh --issue --dns dns_cf -d your.domain --server letsencrypt

# Copy certificates to correct location
# Copy certificates to correct location (Let's Encrypt cert for nginx)
docker compose exec acme cp /acme.sh/your.domain/fullchain.cer /certs/ego.crt
docker compose exec acme cp /acme.sh/your.domain/your.domain.key /certs/ego.key
```
Expand Down
6 changes: 5 additions & 1 deletion deploy/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ docker compose up -d

### T4(Nginx + acme.sh 自动证书)

**证书分离设计:**
- nginx 443: 使用 `certs/ego.crt` + `ego.key`(Let's Encrypt 证书)
- EGo 5001: 使用 `certs/ego-selfsigned.crt` + `ego-selfsigned.key`(自签名证书)

**一键部署:**

```bash
Expand Down Expand Up @@ -95,7 +99,7 @@ docker compose exec acme acme.sh --issue --webroot /var/www/acme -d your.domain
CF_Token=your_token docker compose up -d
docker compose exec acme acme.sh --issue --dns dns_cf -d your.domain --server letsencrypt

# 复制证书到正确位置
# 复制证书到正确位置(Let's Encrypt 证书给 nginx)
docker compose exec acme cp /acme.sh/your.domain/fullchain.cer /certs/ego.crt
docker compose exec acme cp /acme.sh/your.domain/your.domain.key /certs/ego.key
```
Expand Down
4 changes: 4 additions & 0 deletions deploy/init.sh
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,10 @@ case $DEPLOY_DIR in
cp "$HOME/.acme.sh/$DOMAIN/fullchain.cer" certs/ego.crt
cp "$HOME/.acme.sh/$DOMAIN/$DOMAIN.key" certs/ego.key
fi

# 生成自签名证书给 EGo 5001 端口使用
echo "生成自签名证书给 EGo..."
openssl req -x509 -newkey rsa:2048 -keyout certs/ego-selfsigned.key -out certs/ego-selfsigned.crt -days 365 -nodes -subj "/CN=$DOMAIN"
;;
esac

Expand Down
8 changes: 7 additions & 1 deletion deploy/t4-certbot/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# T4 — 懒人全自动(bridge + Nginx + acme.sh,Let's Encrypt)
# 场景:个人 / 小团队云端,拥有公网域名。自动签发并续期免费证书。
#
# 证书分离设计:
# - nginx 443: 使用 certs/ego.crt + ego.key(Let's Encrypt 证书)
# - EGo 5001: 使用 certs/ego-selfsigned.crt + ego-selfsigned.key(自签名证书)
#
# 默认使用 webroot 模式(需要 80 端口),也支持 Cloudflare DNS API 验证。
#
# 方式一:webroot 模式(默认,需要域名解析到本机公网 IP)
Expand All @@ -23,7 +27,9 @@ services:
- WEB_SSL_PORT=5001
- DB_PATH=/app/data/ego.db
- LOG_LEVEL=INFO
- EGO_SSL_DIR=/app/certs
- EGO_SSL_CERT=/app/certs/ego-selfsigned.crt
- EGO_SSL_KEY=/app/certs/ego-selfsigned.key
- EGO_SECRET_KEY=${EGO_SECRET_KEY:-}
volumes:
- ego_data:/app/data
- ego_config:/app/config
Expand Down
4 changes: 3 additions & 1 deletion deploy/t4-certbot/nginx.conf
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# T4 Nginx — Let's Encrypt(acme.sh webroot 自动续期)
# 证书统一放在本目录 certs/ego.crt 与 certs/ego.key,与 T3 一致。
# 证书分离设计:
# - nginx 443: 使用 certs/ego.crt + ego.key(Let's Encrypt 证书)
# - EGo 5001: 使用 certs/ego-selfsigned.crt + ego-selfsigned.key(自签名证书)
# 首次签发后需把证书复制到 certs/ 目录(见 docker-compose 注释)。
# 把所有 your.domain 改成你的域名。

Expand Down
18 changes: 15 additions & 3 deletions web_ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,13 +63,25 @@ def run_web_ui(port: int = 5000, ssl_port: int = 5001):
"""由 main.py 调用,启动 Flask 开发服务器。

- 有证书:HTTP 跑在 `port`(webhook/健康检查),HTTPS 跑在 `ssl_port`(管理页面)。
- 无证书:HTTP 跑在 `port`,并告警
- 无证书:HTTP 跑在 `port`(webhook/健康检查),HTTP 也跑在 `ssl_port`(管理页面,不加密)
"""
ssl_ctx = _ssl_context()
if ssl_ctx is None:
import log
log.logger.warning("SSL cert not found, serving HTTP only on port %s "
"(admin UI will not be encrypted).", port)
log.logger.warning("SSL cert not found, serving HTTP on both ports %s and %s "
"(admin UI will not be encrypted).", port, ssl_port)

# 无证书时,ssl_port 也启动 HTTP 服务
http_thread = threading.Thread(
target=run_simple,
args=("0.0.0.0", ssl_port, app),
kwargs={"threaded": True, "use_reloader": False},
daemon=True,
name="http-admin-server",
)
http_thread.start()

# 主线程跑 webhook/health
run_simple("0.0.0.0", port, app, threaded=True, use_reloader=False)
return

Expand Down
Loading