ChatGPT-academic是一款科研工作专用ChatGPT拓展,具有Paper润色,代码解析等多种功能。最近我想把它部署在远程的服务器上,方便多人使用。在这里记录一下整个部署过程。

环境

除了代理的节点信息外,搭建还需要用到的工具和版本如下:

主机环境

  • Docker
  • Nginx

容器环境

  • Ubuntu 20.04.5 LTS
  • python = 3.8.10
  • Pip 镜像源 index-url = https://mirrors.aliyun.com/pypi/simple/
  • gradio = 3.24.1
  • ssr-command-client

为了不影响主机的网络状态,我是在容器中部署ChatGPT-academic服务。具体来说,我通过

docker run --name=gpt -p 1080:someport0 -p someport1:someport1 ubuntu
  • 将容器中的1080端口(代理,访问外网)和someport0绑定,用来走科学上网的代理
  • 将容器中的someport1和主机的someport2绑定,这样访问主机的someport2就可以接受web服务

整体的配置思路如下:

  • 配置容器内的代理
  • 配置容器内的chatgpt-academic服务
  • 配置主机的nginx设置,进行反向代理

容器代理

加密算法库

我所使用的节点,使用了chacha20加密算法,这个在docker hub拉去的ubuntu是没有的,我手动编译的

wget https://github.com/jedisct1/libsodium/releases/download/1.0.18-RELEASE/libsodium-1.0.18.tar.gz
tar xf libsodium-1.0.18.tar.gz && cd libsodium-1.0.18
configure && make -j2 && make install
ldconfig

也可以

sudo apt-get install -y libsodium-dev

Shadowsocksr客户端

容器中,我使用了基于python命令行式的代理客户端ssr-command-client,来控制代理的解析、开启和关闭。

配置过程见shadowsocks-cli

可能出现的问题

我安装过程中出现最多的问题就是

create encryptor fail at port 1080
这个错误就是算法库缺失,检查一下libsodium是否成功安装

还需要注意的是当前工具shadowsocksr-clipython版本高的时候会报错,见issue 52

ChatGPT-academic配置

安装,config设置见.

在安装依赖的时候,确保gradio库不低于3.23,不然的话无法登录。

另外,参考gradio issue#3716来修改gradio的代码。

主机nginx配置

在当前的nginx的config下面创建一个子文件夹,来进行反向代理。

我的nginx路径是/usr/local/nginx/conf/这样,创建/usr/local/nginx/conf/vhost/路径并添加代理设置

upstream  mychat  {
    server   localhost:someport1;
}

server {
        listen 80;
        server_name your_domain;   # 请填入你设定的域 名

        rewrite ^/(.*) https://$server_name/$1 permanent;

        location / {
                proxy_pass http://127.0.0.1:someport1;   # 注意 端口号
                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_set_header Upgrade $http_upgrade;         # Websocket配置
                proxy_set_header Connection $connection_upgrade;                #Websocket配置
                proxy_max_temp_file_size 0;
                client_max_body_size 10m;
                client_body_buffer_size 128k;
                proxy_connect_timeout 90;
                proxy_send_timeout 90;
                proxy_read_timeout 90;
                proxy_buffer_size 4k;
                proxy_buffers 4 32k;
                proxy_busy_buffers_size 64k;
                proxy_temp_file_write_size 64k;
        }
}

server {
    listen  443 ssl;
    server_name  chat.conscien.top;
    ssl_certificate     pem path;
    ssl_certificate_key key path;
    location / {
        proxy_pass        http://mychat;
        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_set_header Upgrade $http_upgrade;         # Websocket配置
                proxy_set_header Connection $connection_upgrade;                #Websocket配置
    }
}

/usr/local/nginx/conf/nginx.conf的http中添加

include       mime.types;

default_type  application/octet-stream;

    map $http_upgrade $connection_upgrade {
        default          keep-alive;
        'websocket'      upgrade;
    }

include /usr/local/nginx/conf/vhost/*.conf

重新nginx -s reload加载配置进行域名访问。


参考