orztv
commited on
Commit
·
e41eef9
1
Parent(s):
dae6979
update
Browse files- Dockerfile +1 -4
- README.md +0 -91
- start.sh +0 -29
- traefik/dynamic.yml +1 -1
Dockerfile
CHANGED
@@ -23,7 +23,7 @@ USER pn
|
|
23 |
WORKDIR /home/pn/app
|
24 |
|
25 |
# 创建必要的目录
|
26 |
-
RUN mkdir -p /home/pn/app/traefik /home/pn/app/
|
27 |
chown -R pn:pn /home/pn /home/pn/app
|
28 |
|
29 |
# 复制配置文件和启动脚本
|
@@ -39,8 +39,5 @@ ENV TRAEFIK_PORT=7860 \
|
|
39 |
NODE_PORT=8001 \
|
40 |
N8N_PORT=5678
|
41 |
|
42 |
-
# 暴露 Traefik 和后端服务端口
|
43 |
-
EXPOSE $TRAEFIK_PORT $PYTHON_PORT $NODE_PORT $N8N_PORT
|
44 |
-
|
45 |
# 启动容器时运行启动脚本
|
46 |
CMD ["/home/pn/app/start.sh"]
|
|
|
23 |
WORKDIR /home/pn/app
|
24 |
|
25 |
# 创建必要的目录
|
26 |
+
RUN mkdir -p /home/pn/app/traefik /home/pn/app/node /home/pn/app/n8n && \
|
27 |
chown -R pn:pn /home/pn /home/pn/app
|
28 |
|
29 |
# 复制配置文件和启动脚本
|
|
|
39 |
NODE_PORT=8001 \
|
40 |
N8N_PORT=5678
|
41 |
|
|
|
|
|
|
|
42 |
# 启动容器时运行启动脚本
|
43 |
CMD ["/home/pn/app/start.sh"]
|
README.md
CHANGED
@@ -6,95 +6,4 @@ colorTo: pink
|
|
6 |
sdk: docker
|
7 |
pinned: false
|
8 |
---
|
9 |
-
jc21/nginx-proxy-manager:latest
|
10 |
-
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
11 |
|
12 |
-
Traefik 作为反向代理,使用 YAML 或 TOML 文件。Traefik 将监听 7860 端口,并根据路径前缀将请求转发到相应的服务。
|
13 |
-
反代两个服务:
|
14 |
-
1. `python -m http.server 8000`
|
15 |
-
2. `sudo npm install -g http-server` 后 `http-server -p 8001`
|
16 |
-
|
17 |
-
帮我写一个完整的 Dockerfile 程序。使用 `nikolaik/python-nodejs:python3.10-nodejs20` 镜像。
|
18 |
-
本镜像已经安装好 Node 及 Python 的了,容器启动默认使用 `pn` 用户,UID 为 1000。容器中需要使用这个用户。
|
19 |
-
|
20 |
-
## 程序特点及用法
|
21 |
-
|
22 |
-
本程序采用了动态配置和服务管理的方式,具有以下特点和用法:
|
23 |
-
|
24 |
-
1. **易用性**:
|
25 |
-
- 通过修改 `services.json` 文件,可以轻松添加、删除或修改服务,无需更改其他配置文件。
|
26 |
-
- 使用环境变量来配置端口号和其他可变参数,增加了灵活性。
|
27 |
-
|
28 |
-
2. **扩展性**:
|
29 |
-
- 新服务可以通过在 `services.json` 中添加一个新条目来增加,包括其命令、端口和路径前缀。
|
30 |
-
- Dockerfile 中预装了常用工具,如 `jq`,方便进行 JSON 解析和处理。
|
31 |
-
|
32 |
-
3. **复用性**:
|
33 |
-
- `start.sh` 脚本可以处理任意数量的服务,无需为每个新服务修改脚本。
|
34 |
-
- 使用通用的健康检查函数,适用于所有服务。
|
35 |
-
|
36 |
-
4. **逻辑性**:
|
37 |
-
- 配置生成和服务启动的逻辑集中在 `start.sh` 脚本中,使得整个流程更加清晰。
|
38 |
-
- 使用 Traefik 作为反向代理,通过动态配置文件实现路由规则的灵活管理。
|
39 |
-
|
40 |
-
## 如何使用
|
41 |
-
|
42 |
-
1. **添加新服务**:
|
43 |
-
在 `services.json` 文件中添加新的服务配置,例如:
|
44 |
-
```json
|
45 |
-
{
|
46 |
-
"name": "new-service",
|
47 |
-
"command": "new-service-command",
|
48 |
-
"port": 8002,
|
49 |
-
"path_prefix": "/new-service",
|
50 |
-
"health_check_path": "/health"
|
51 |
-
}
|
52 |
-
```
|
53 |
-
|
54 |
-
2. **修改现有服务**:
|
55 |
-
直接在 `services.json` 文件中修改相应服务的配置。
|
56 |
-
|
57 |
-
3. **自定义端口**:
|
58 |
-
通过环境变量设置 `TRAEFIK_PORT`、`PYTHON_PORT` 和 `NODE_PORT` 来自定义端口。
|
59 |
-
|
60 |
-
4. **配置 HTTPS**:
|
61 |
-
- 修改 `traefik.yml` 中的 `certificatesResolvers` 部分,配置有效的电子邮件地址以使用 Let’s Encrypt。
|
62 |
-
- 确保端口 80 和 443 对外开放,以便 Let’s Encrypt 能够验证和获取证书。
|
63 |
-
|
64 |
-
5. **构建和运行**:
|
65 |
-
```bash
|
66 |
-
docker build -t my-traefik-app .
|
67 |
-
docker run -p 7860:7860 -p 80:80 -p 443:443 my-traefik-app
|
68 |
-
```
|
69 |
-
|
70 |
-
6. **访问服务**:
|
71 |
-
- Python 服务:`http://localhost:7860/python` 或 `https://localhost/python`
|
72 |
-
- Node 服务:`http://localhost:7860/node` 或 `https://localhost/node`
|
73 |
-
- Traefik 仪表板:`https://localhost/dashboard/`
|
74 |
-
|
75 |
-
7. **查看日志和监控**:
|
76 |
-
使用 Docker 日志命令查看容器日志,包括服务启动状态和健康检查结果。
|
77 |
-
```bash
|
78 |
-
docker logs -f <container_id>
|
79 |
-
```
|
80 |
-
|
81 |
-
8. **健康检查和失败处理**:
|
82 |
-
- `start.sh` 脚本中已集成健康检查功能,确保所有服务正常运行。
|
83 |
-
- 若某个服务未能通过健康检查,容器将输出相应的错误信息,便于及时修复。
|
84 |
-
|
85 |
-
## 进一步优化建议
|
86 |
-
|
87 |
-
1. **配置管理**:
|
88 |
-
- 使用配置管理工具(如 `consul` 或 `etcd`)进行集中式配置管理,提升配置的可维护性和一致性。
|
89 |
-
|
90 |
-
2. **日志管理**:
|
91 |
-
- 集成集中式日志管理系统(如 ELK Stack),便于日志的收集、分析和监控。
|
92 |
-
|
93 |
-
3. **容器编排**:
|
94 |
-
- 考虑使用 Kubernetes 进行容器编排,提升系统的扩展性和可靠性。
|
95 |
-
|
96 |
-
4. **安全增强**:
|
97 |
-
- 配置 Traefik 的访问控制,如基本认证或 OAuth,保护敏感服务和仪表板的访问。
|
98 |
-
- 定期更新基础镜像和依赖,以减少安全漏洞。
|
99 |
-
|
100 |
-
通过以上优化,您的程序在易用性、扩展性、复用性和逻辑性等方面将得到显著提升,能够更好地满足实际业务需求。如果您有任何进一步的问题或需要更多的帮助,请随时与我联系。
|
|
|
6 |
sdk: docker
|
7 |
pinned: false
|
8 |
---
|
|
|
|
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
start.sh
CHANGED
@@ -39,34 +39,5 @@ done
|
|
39 |
# 等待服务启动
|
40 |
sleep 5
|
41 |
|
42 |
-
# 健康检查函数
|
43 |
-
check_health() {
|
44 |
-
local port=$1
|
45 |
-
local service=$2
|
46 |
-
local health_check_path=$3
|
47 |
-
for i in {1..30}; do
|
48 |
-
if curl -s "http://localhost:$port$health_check_path" > /dev/null; then
|
49 |
-
log "$service is up"
|
50 |
-
return 0
|
51 |
-
fi
|
52 |
-
sleep 2
|
53 |
-
done
|
54 |
-
log "ERROR: $service failed to start"
|
55 |
-
return 1
|
56 |
-
}
|
57 |
-
|
58 |
-
# 执行健康检查
|
59 |
-
echo "$services" | while read -r service; do
|
60 |
-
name=$(echo $service | jq -r '.name')
|
61 |
-
port=$(echo $service | jq -r '.port')
|
62 |
-
health_check_path=$(echo $service | jq -r '.health_check_path')
|
63 |
-
|
64 |
-
if ! check_health $port "$name" "$health_check_path"; then
|
65 |
-
log "ERROR: 健康检查失败,退出程序"
|
66 |
-
kill ${pids[@]} 2>/dev/null
|
67 |
-
exit 1
|
68 |
-
fi
|
69 |
-
done
|
70 |
-
|
71 |
# 启动 Traefik
|
72 |
exec traefik --configFile=$TRAEFIK_CONFIG_FILE
|
|
|
39 |
# 等待服务启动
|
40 |
sleep 5
|
41 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
# 启动 Traefik
|
43 |
exec traefik --configFile=$TRAEFIK_CONFIG_FILE
|
traefik/dynamic.yml
CHANGED
@@ -3,7 +3,7 @@ http:
|
|
3 |
root:
|
4 |
rule: "PathPrefix(`/`) && !PathPrefix(`/python`) && !PathPrefix(`/node`) && !PathPrefix(`/traefik`) && !PathPrefix(`/dashboard`)"
|
5 |
service: n8n-service
|
6 |
-
priority:
|
7 |
|
8 |
node-service:
|
9 |
rule: "PathPrefix(`/node`)"
|
|
|
3 |
root:
|
4 |
rule: "PathPrefix(`/`) && !PathPrefix(`/python`) && !PathPrefix(`/node`) && !PathPrefix(`/traefik`) && !PathPrefix(`/dashboard`)"
|
5 |
service: n8n-service
|
6 |
+
priority: 10
|
7 |
|
8 |
node-service:
|
9 |
rule: "PathPrefix(`/node`)"
|