orztv commited on
Commit
e41eef9
·
1 Parent(s): dae6979
Files changed (4) hide show
  1. Dockerfile +1 -4
  2. README.md +0 -91
  3. start.sh +0 -29
  4. 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/python /home/pn/app/node /home/pn/app/root /home/pn/app/n8n && \
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: 1
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`)"