如何在Digital Ocean云主机部署Jupyter并实现Web表单处理
嘿,既然你已经有Jupyter和Python脚本的使用经验,那把Jupyter生态和Web后端结合起来其实挺顺畅的。下面我分两种方案来给你讲,一种是贴合Jupyter原生的Kernel Gateway方案,另一种是更灵活的Flask+Python脚本方案(毕竟Jupyter也能帮你快速调试这些脚本)。
前提准备:DigitalOcean云主机基础配置
首先你得在DigitalOcean上创建一个Droplet,推荐选Ubuntu 22.04 LTS镜像,配置根据你的需求选(最低配足够测试用)。创建好后用SSH登录,先更新系统并安装基础依赖:
sudo apt update && sudo apt upgrade -y sudo apt install python3-pip python3-dev nginx -y # nginx可选,用于后续反向代理
方案1:用Jupyter Kernel Gateway把Notebook转成API
Kernel Gateway是Jupyter官方的工具,能把你的Notebook直接变成可调用的API,完美贴合你的Jupyter使用习惯。
1. 安装Jupyter Kernel Gateway
pip3 install jupyter_kernel_gateway
2. 编写处理表单的Notebook
创建一个name_processor.ipynb文件(用Jupyter编写或直接文本编辑都可以),内容如下:
# 导入依赖库 import json from flask import request # 定义POST接口,接收表单数据 @post('/process-name') def process_name(): # 获取表单中的姓名参数 name = request.form.get('name', '') if not name.strip(): return json.dumps({'error': '请输入有效的姓名'}), 400 # 这里写你的自定义处理逻辑,比如生成个性化问候语 result = f'你好,{name}!很高兴收到你的输入😊' # 返回JSON格式的处理结果 return json.dumps({'result': result}), 200, {'Content-Type': 'application/json'}
3. 启动Kernel Gateway服务
运行命令将Notebook转为可外部访问的API服务:
jupyter kernelgateway --KernelGatewayApp.ip=0.0.0.0 --KernelGatewayApp.port=5000 --KernelGatewayApp.notebook=name_processor.ipynb
这里0.0.0.0允许外部访问,5000是服务端口,你可以改成其他未被占用的端口。
4. 配置后台自动运行(systemd服务)
为了让服务在服务器重启后自动启动,创建一个systemd服务文件:
sudo nano /etc/systemd/system/jupyter-api.service
写入以下内容(记得替换成你的用户名和文件路径):
[Unit] Description=Jupyter Kernel Gateway API Service After=network.target [Service] User=your-username # 替换为你的Droplet用户名 WorkingDirectory=/home/your-username # 替换为Notebook所在目录 ExecStart=/usr/local/bin/jupyter kernelgateway --KernelGatewayApp.ip=0.0.0.0 --KernelGatewayApp.port=5000 --KernelGatewayApp.notebook=name_processor.ipynb Restart=always [Install] WantedBy=multi-user.target
然后启动并启用服务:
sudo systemctl daemon-reload sudo systemctl start jupyter-api sudo systemctl enable jupyter-api
5. 开放端口
在DigitalOcean的Droplet防火墙设置中,开放5000端口(或你自定义的端口),允许HTTP访问。
方案2:用Flask写Web服务(更灵活,Jupyter可调试)
如果你需要更复杂的Web逻辑,Flask这类轻量框架会更合适,而且你可以先用Jupyter调试好处理逻辑,再写成脚本部署。
1. 安装Flask和Gunicorn
pip3 install flask gunicorn
2. 编写Flask应用脚本
创建一个app.py文件(可以先在Jupyter里调试处理逻辑,再复制过来):
from flask import Flask, request, jsonify, render_template_string app = Flask(__name__) # 前端表单页面 @app.route('/') def index(): return render_template_string(''' <form method="POST" action="/process-name"> <label for="name">请输入你的姓名:</label> <input type="text" id="name" name="name" required> <button type="submit">提交</button> </form> ''') # 表单处理接口 @app.route('/process-name', methods=['POST']) def process_name(): name = request.form.get('name', '').strip() if not name: return jsonify({'error': '请输入有效的姓名'}), 400 # 这里是你的自定义处理逻辑,比如调用Jupyter中调试好的函数 processed_result = f'Hello {name}! 你的输入已成功处理。' # 返回HTML格式的结果页面 return render_template_string(''' <h2>处理结果:</h2> <p>{{ result }}</p> <a href="/">返回输入页面</a> ''', result=processed_result) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
3. 测试运行
先本地测试服务是否正常:
python3 app.py
访问http://你的DropletIP:5000就能看到表单,提交后会返回处理结果。
4. 用Gunicorn部署生产环境
Flask内置服务器不适合生产环境,用Gunicorn替代:
gunicorn --workers=2 --bind=0.0.0.0:5000 app:app
--workers=2是启动的进程数,可根据你的CPU核心数调整。
5. 配置systemd服务和Nginx反向代理(可选但推荐)
和方案1类似,创建systemd服务让Gunicorn后台运行,再用Nginx做反向代理,可处理静态文件和配置HTTPS(可用Let's Encrypt免费证书)。
安全注意事项
- 输入验证:一定要对用户输入做校验,防止恶意输入导致的问题
- HTTPS配置:如果是公开服务,务必配置HTTPS,避免数据明文传输
- 端口限制:DigitalOcean防火墙只开放必要端口(如80、443、5000),关闭不必要的端口
- 权限控制:运行服务的用户尽量用非root用户,降低安全风险
内容的提问来源于stack exchange,提问作者Zion Oyemade

