安装python jupyter docker和kite engine记录
为何要安装这两个东西,是因为我希望用python连接币安的api,进行一些自动化的交易。我不做量化,我只需要运行的程序能够满足我自动对冲某些币种仓位的需求。我还不会编程,所以都要从头开始学,但是这个过程一定很有趣,不是吗?先说下我的需求和条件:
- 我希望jupyter安装在家里的服务器;
- 家里服务器通过frpc连接外部服务器,这一步就不在这里公开了,不适用大部分人;
- 外部服务器通过nginx反向代理将服务暴露在互联网。
- 看起来很简单,但做起来就感觉每一步都是坑。好在我喜欢记录,就把过程都记下来了;
- 我属于知其然不知其所以然,所有的都是通过trial and error试出来的;
- 通过远程server来运行jupyter和kite,我应该是网上贴出方法的第一家,没有看到别人这么做(到)过。好处是部署一次,任意机子都能用了。
- 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就能有下面这个效果啦。工欲善其事,必先利其器。就是这个道理。