feat: 初始提交 - 科创企业特有风险的识别与管理 (数智风控系统)
This commit is contained in:
@@ -0,0 +1,175 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
部署系统到远程服务器 159.75.81.121
|
||||
"""
|
||||
import os
|
||||
import tarfile
|
||||
import paramiko
|
||||
import time
|
||||
|
||||
SERVER_IP = "159.75.81.121"
|
||||
SSH_PORT = 22
|
||||
SSH_USER = "root"
|
||||
SSH_PASS = "sp-cc123"
|
||||
REMOTE_DIR = "/opt/risk_system"
|
||||
DOMAIN = "risk.aiformat.cn"
|
||||
|
||||
LOCAL_BASE = r"d:\code\XH-202626_科创企业特有风险的识别与管理"
|
||||
ARCHIVE_NAME = os.path.join(LOCAL_BASE, "deploy_package.tar.gz")
|
||||
|
||||
def make_archive():
|
||||
print("📦 正在打部署压缩包...")
|
||||
includes = [
|
||||
"🏠_系统首页.py",
|
||||
"app.py",
|
||||
"config.py",
|
||||
"requirements.txt",
|
||||
"agents",
|
||||
"collectors",
|
||||
"data",
|
||||
"knowledge_graph",
|
||||
"lib",
|
||||
"pages",
|
||||
"risk_engine",
|
||||
"utils",
|
||||
".streamlit"
|
||||
]
|
||||
|
||||
with tarfile.open(ARCHIVE_NAME, "w:gz") as tar:
|
||||
for item in includes:
|
||||
full_path = os.path.join(LOCAL_BASE, item)
|
||||
if os.path.exists(full_path):
|
||||
print(f" + 打包: {item}")
|
||||
tar.add(full_path, arcname=item)
|
||||
else:
|
||||
print(f" - 跳过(不存在): {item}")
|
||||
print(f"✅ 压缩完成: {ARCHIVE_NAME}")
|
||||
|
||||
def run_remote_cmd(ssh, cmd):
|
||||
print(f"\n🚀 [远程命令] {cmd}")
|
||||
stdin, stdout, stderr = ssh.exec_command(cmd)
|
||||
out = stdout.read().decode('utf-8', errors='ignore')
|
||||
err = stderr.read().decode('utf-8', errors='ignore')
|
||||
if out:
|
||||
print(f"[STDOUT]\n{out.strip()}")
|
||||
if err:
|
||||
print(f"[STDERR]\n{err.strip()}")
|
||||
return out, err
|
||||
|
||||
def deploy():
|
||||
make_archive()
|
||||
|
||||
print(f"\n🔌 正在连接服务器 {SERVER_IP}...")
|
||||
ssh = paramiko.SSHClient()
|
||||
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||
try:
|
||||
ssh.connect(SERVER_IP, port=SSH_PORT, username=SSH_USER, password=SSH_PASS, timeout=15)
|
||||
print("✅ SSH 连接成功!")
|
||||
except Exception as e:
|
||||
print(f"❌ SSH 连接失败: {e}")
|
||||
return
|
||||
|
||||
sftp = ssh.open_sftp()
|
||||
|
||||
# 1. 创建远程目录
|
||||
run_remote_cmd(ssh, f"mkdir -p {REMOTE_DIR}")
|
||||
|
||||
# 2. 上传压缩包
|
||||
remote_archive = f"{REMOTE_DIR}/deploy_package.tar.gz"
|
||||
print(f"📤 正在上传压缩包到 {remote_archive}...")
|
||||
sftp.put(ARCHIVE_NAME, remote_archive)
|
||||
print("✅ 压缩包上传成功!")
|
||||
sftp.close()
|
||||
|
||||
# 3. 解压并配置 Python 环境与依赖
|
||||
run_remote_cmd(ssh, f"cd {REMOTE_DIR} && tar -xzf deploy_package.tar.gz")
|
||||
|
||||
# 检查并安装系统依赖 (nginx, python3, python3-pip, python3-venv 等)
|
||||
setup_env_cmd = """
|
||||
if command -v apt-get &> /dev/null; then
|
||||
apt-get update -y && apt-get install -y python3 python3-pip python3-venv nginx
|
||||
elif command -v yum &> /dev/null; then
|
||||
yum install -y python3 python3-pip nginx
|
||||
fi
|
||||
"""
|
||||
run_remote_cmd(ssh, setup_env_cmd)
|
||||
|
||||
# 创建 virtualenv 并安装依赖
|
||||
venv_cmd = f"""
|
||||
cd {REMOTE_DIR}
|
||||
python3 -m venv venv || python3 -m venv venv --without-pip
|
||||
source venv/bin/activate
|
||||
pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
|
||||
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
|
||||
"""
|
||||
run_remote_cmd(ssh, venv_cmd)
|
||||
|
||||
# 4. 配置 Systemd 服务
|
||||
systemd_service = f"""[Unit]
|
||||
Description=Risk Management Streamlit Web App
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
User=root
|
||||
WorkingDirectory={REMOTE_DIR}
|
||||
ExecStart={REMOTE_DIR}/venv/bin/streamlit run {REMOTE_DIR}/🏠_系统首页.py --server.port 8501 --server.address 127.0.0.1 --server.headless true --server.enableCORS false --server.enableXsrfProtection false
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
"""
|
||||
create_service_cmd = f"cat << 'EOF' > /etc/systemd/system/risk_app.service\n{systemd_service}\nEOF"
|
||||
run_remote_cmd(ssh, create_service_cmd)
|
||||
|
||||
run_remote_cmd(ssh, "systemctl daemon-reload && systemctl enable risk_app && systemctl restart risk_app")
|
||||
time.sleep(3)
|
||||
run_remote_cmd(ssh, "systemctl status risk_app --no-pager")
|
||||
|
||||
# 5. 配置 Nginx 反向代理
|
||||
nginx_conf = f"""server {{
|
||||
listen 80;
|
||||
server_name {DOMAIN};
|
||||
|
||||
location / {{
|
||||
proxy_pass http://127.0.0.1:8501;
|
||||
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;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_read_timeout 86400;
|
||||
}}
|
||||
|
||||
location /_stcore/stream {{
|
||||
proxy_pass http://127.0.0.1:8501/_stcore/stream;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host $host;
|
||||
}}
|
||||
}}
|
||||
"""
|
||||
create_nginx_cmd = f"cat << 'EOF' > /etc/nginx/conf.d/risk.aiformat.cn.conf\n{nginx_conf}\nEOF"
|
||||
run_remote_cmd(ssh, create_nginx_cmd)
|
||||
|
||||
# 兼容 Ubuntu/Debian sites-enabled
|
||||
run_remote_cmd(ssh, f"mkdir -p /etc/nginx/sites-enabled && ln -sf /etc/nginx/conf.d/risk.aiformat.cn.conf /etc/nginx/sites-enabled/risk.aiformat.cn.conf")
|
||||
|
||||
run_remote_cmd(ssh, "nginx -t && systemctl restart nginx")
|
||||
time.sleep(2)
|
||||
run_remote_cmd(ssh, "systemctl status nginx --no-pager")
|
||||
|
||||
# 6. 测试应用连通性
|
||||
run_remote_cmd(ssh, "curl -I http://127.0.0.1:8501")
|
||||
run_remote_cmd(ssh, f"curl -H 'Host: {DOMAIN}' -I http://127.0.0.1/")
|
||||
|
||||
ssh.close()
|
||||
print("\n🎉 部署完成!")
|
||||
print(f"🌐 域名访问地址: http://{DOMAIN}")
|
||||
print(f"🖥️ 服务器 IP 直连防护端口验证: http://{SERVER_IP}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
deploy()
|
||||
Reference in New Issue
Block a user