Docker部署chaoxing自动签到指南

本文最后更新于:2024年8月11日 晚上

Docker Guide

拉取镜像

下载docker镜像,国内站点会比较慢

1
docker pull ghcr.io/cxorz/chaoxing-sign-cli:latest

(待更新国内站点)

本机部署

1
docker run --name chaoxing -d -p 80:80 -p 5000:5000 chaoxing-sign-cli

你可以直接通过这个方式创建一个容器,然后使用服务器的IP访问,但直接暴露你服务器的公网IP并不安全(局域网服务器除外),且IP地址不方便记忆,你可以使用一个域名来指向他。

且容器默认使用localhost地址来访问API,因此你的容器的服务端很可能出现本地(内网)登录没问题,外网访问无法登录的奇妙问题。如果你希望你的服务能在外网被访问而不是只在内网访问的话,建议使用下面的方案。

Docker化部署

如果你应用如下的解决方案,请不要使用上面的部署指令。一般使用:

1
docker run --name chaoxing -d --network 你的网桥 chaoxing-sign-cli

也就是说不需要进行端口映射,但你必须把这个容器加入网桥,Docker提供了一个默认的网桥Bridge

为了方便,最好同时指定这个容器的IP,否则服务器重启或容器重启后可能导致IP发生变化

1
docker run --name chaoxing -d --network 你的网桥 --ip 你的容器IP chaoxing-sign-cli

还有一些复杂的指令例如--restart你可以按需使用

解决方案I

我们首先关注你的服务器的拓扑结构,以我的服务器为例的话。他的访问顺序是【服务器->Docker化的NGINX->chaoxing容器的NGINX】来完成整个访问流程,当你访问他的UI界面时,登录使用的地址是localhost,因此你必须修改他的后台。

1
2
3
4
5
6
7
# 进入你的容器
docker exec -it chaoxing /bin/bash
# 以下指令在容器内执行
>vi /app/apps/web/src/config/api.ts
# 然后修改
const baseUrl = 'https://chaoxing.yourDomain.com:5000';
# 这个baseUrl在之前是另一个文件中的,现在已经更改到web/src

此时你登录会通过你的域名的5000端口进行,你的域名应当指向这个服务器的IP地址,同时服务器开启5000端口的访问,并在nginx内对5000端口进行反代理。

一个nginx文件示例(这里只展示Server块):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
listen 80;
listen 443 ssl;
server_name yourDomain.com;
location / {
proxy_pass http://你的超星容器的IP;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
ssl_certificate /your/domain/ssl;
ssl_certificate_key /your/domain/ssl_key;
}
server {
listen 5000;
server_name yourDomain.com;
location / {
proxy_pass http://你的超星容器IP:5000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
ssl_certificate /your/domain/ssl;
ssl_certificate_key /your/domain/ssl_key;
}

解决方案II

这样非常的不优雅,而且使用域名也会暴露你的服务器IP,如果你想套CDN的话,使用5000端口的服务方法显然是不被接受的。如何只通过一个域名访问呢?

我们首先来看原来的拓扑图:

一个非常自然的想法就是通过反代理部分文件路径的方式来完成5000端口的访问,这是调整后的拓扑图:

实际上还有一种办法,就是使用一个域名(或者子域名、字路径)指向5000端口,然后baseUrl使用这个域名即可。但这依然需要开放两个端口,对我来说我并不喜欢(而且5000端口已经被占用了)

就是说,将baseUrl的地址改为从yourDomain.com:5000改成yourDomain.com/allinone,但是这样的话他真实的访问地址是https://yourDomain.com/allinone/login...,你必须把allinone剔除掉才能保证访问正常,这个可以很简单的通过Nginx设置实现。这是示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen 443 ssl; # 这里拒绝了80端口访问,按照你的需求设置
server_name chaoxing.yourDomain.com;
#access_log /var/log/nginx/chaoxing_acss; 这个是自定义日志地址,按照你的需要来设置
#error_log /var/log/nginx/chaoxing_err; 我是拿来排障用的
location / {
proxy_pass http://你的超星容器IP;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
location /allinone/ {
rewrite ^/allinone/(.*)$ /$1 break; # 这个是去除网址中的allinone路径
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://你的超星容器IP:5000;
}
ssl_certificate /ssl/yourDomain.com/cert.pem;
ssl_certificate_key /ssl/yourDomain.com/cert.key;
}

收尾

上面两种方案你只需要采用一种即可,在这之后你也许得注意下面的内容:

  • 刷新NGINX:在nginx容器中使用nginx -t检查你的配置是否有误,如果看到两个OK!就行,之后运行nginx -s reload,你的反代理程序就应用上去了。更多nginx的排障内容请移步到官方文档。

  • 重新构建

    你配置完成NGINX、修改完baseURL后还必须重新在容器中执行构建指令才能应用你的设置:

    1
    2
    # 在容器里
    pnpm build

    等待构建完成后访问前端进行测试即可。


Docker部署chaoxing自动签到指南
https://qlozin.top/2022/10/09/chaoxing的docker化部署/
作者
QLozin
发布于
2022年10月10日
更新于
2024年8月11日
许可协议