安装python jupyter docker和kite engine记录

为何要安装这两个东西,是因为我希望用python连接币安的api,进行一些自动化的交易。我不做量化,我只需要运行的程序能够满足我自动对冲某些币种仓位的需求。我还不会编程,所以都要从头开始学,但是这个过程一定很有趣,不是吗?先说下我的需求和条件:

  1. 我希望jupyter安装在家里的服务器;
  2. 家里服务器通过frpc连接外部服务器,这一步就不在这里公开了,不适用大部分人;
  3. 外部服务器通过nginx反向代理将服务暴露在互联网。
  4. 看起来很简单,但做起来就感觉每一步都是坑。好在我喜欢记录,就把过程都记下来了;
  5. 我属于知其然不知其所以然,所有的都是通过trial and error试出来的;
  6. 通过远程server来运行jupyter和kite,我应该是网上贴出方法的第一家,没有看到别人这么做(到)过。好处是部署一次,任意机子都能用了。
  7. ram小的vps安装这个很容易当机。

为何选择python,为何选择jupyter

python应该是简单易用的,学起来很直观。我在过去几年有间断地学习,相信起始不难。jupyter的选择就更简单了,它是我学习python时候安装的环境,用顺手了。jupyter使用时候,我希望能够用上kite engine,kite是一个autocomplete的插件,编写程序时候会自动完成输入,可以省下不少时间在打字上。

因为备份的需要,我要求所有的服务都必须是docker。即使这意味着部分服务官方对docker的不支持,比如kite的这句话:

Dockerfile

所以先开始编译jupyter的docker吧。因为有定制化的需求,所以我在jupyter官方文章中选定了某个image的Dockerfile后,就在后面进行修改。我肯定不会从头开始写Dockerfile,但是修改还是会的。

#拼接 https://raw.githubusercontent.com/jupyter/docker-stacks/master/all-spark-notebook/Dockerfile

...

#安装kite引擎,记得前面dockerfile要安装systemctl
#wget https://linux.kite.com/dls/linux/current 获得kite-installer.sh
USER root
RUN apt-get install --yes --no-install-recommends systemctl
USER ${NB_UID}
COPY kite-installer.sh ./   
COPY kite /home/${NB_USER}/.local/share/kite
RUN ./kite-installer.sh --install
RUN rm kite-installer.sh

#放置于同一个文件夹,里面列出想要安装的pip包名字即可
COPY requirements.txt ./ 
RUN pip install --no-cache-dir --upgrade pip && \
    pip install --no-cache-dir -r requirements.txt
RUN rm requirements.txt

#适用于没有pip包,但是想要单独安装的
RUN git clone https://github.com/Binance-docs/Binance_Futures_python.git && \   
    cd Binance_Futures_python && \
    python3 setup.py install && \
    cd ../.. && \
    rm -rf "/home/${NB_USER}/Binance_Futures_python"

#在terminal开始编译
docker build -t jupyter-test .

docker-compose.yml

version: "2.1"
services:
  jupyter:
    image: jupyter-test:latest  
    container_name: jupyter
    environment:
      - JUPYTER_ENABLE_LAB=yes
    volumes:
      - ./work:/home/jovyan/work
      - ./jupyterconfig:/home/jovyan/.jupyter
    ports:
      - 8888:8888 
      - 46624:46624 #kite 端口
    restart: unless-stopped

nginx中的设置

#文件位置 nginx/conf.d/jupyter.conf
map $http_upgrade $connection_upgrade {
      default upgrade;
      ''      close;
    }

server {
      listen       443 ssl;
      server_name  jupyter.org;
      ssl_certificate /root/ssl/ssl.crt;
      ssl_certificate_key /root/ssl/ssl.key;
      ssl_ciphers "AES128+EECDH:AES128+EDH";
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      ssl_prefer_server_ciphers on;
      ssl_session_cache shared:SSL:10m;
      add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
      add_header X-Content-Type-Options nosniff;
      ssl_stapling on; # Requires nginx >= 1.3.7
      ssl_stapling_verify on; # Requires nginx => 1.3.7                  
      resolver_timeout 5s;
      client_max_body_size 50M;

    location /{
      proxy_redirect off;
      proxy_pass http://localhost:8888;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }  


     location ~* /(api/kernels/[^/]+/(channels|iopub|shell|stdin)|terminals/websocket)/? {
      proxy_pass http://localhost:8888;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      # WebSocket support
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
        }
    }

按这种方式转好后,你的jupyter就能有下面这个效果啦。工欲善其事,必先利其器。就是这个道理。