blast_api.py
from fastapi import FastAPI, Form
from fastapi.middleware.cors import CORSMiddleware
import subprocess
import uuid
import os
app = FastAPI()
# -------------------------
# 允许跨域访问(非常重要)
# -------------------------
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 可按需改为前端域名
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.post("/blast")
async def run_blast(
sequence: str = Form(...),
program: str = Form(...), # blastn 或 blastp
database: str = Form(...), # lichen_genome / lichen_protein
):
"""
统一 BLAST 接口
"""
# -------------------------
# 选择数据库路径
# -------------------------
if database == "lichen_genome":
db_path = "/home/ubuntu/genomic/mydb"
elif database == "lichen_protein":
db_path = "/home/ubuntu/pro/protein_db"
else:
return {"error": f"Unknown database: {database}"}
# -------------------------
# 选择序列文件后缀
# -------------------------
if program == "blastn":
ext = ".fna"
elif program == "blastp":
ext = ".faa"
else:
return {"error": f"Unknown program: {program}"}
# -------------------------
# 创建临时序列文件
# -------------------------
query_path = f"/tmp/{uuid.uuid4()}{ext}"
with open(query_path, "w") as f:
f.write(">query\\n" + sequence.strip())
# -------------------------
# 运行 BLAST
# -------------------------
try:
output = subprocess.check_output([
program,
"-query", query_path,
"-db", db_path,
"-outfmt", "6"
], stderr=subprocess.STDOUT).decode()
except subprocess.CalledProcessError as e:
output = e.output.decode()
finally:
# 删除临时文件
if os.path.exists(query_path):
os.remove(query_path)
# 返回给前端
return {"result": output}
/etc/systemd/system/blast.service
[Unit]
Description=BLAST FastAPI Service
After=network.target
[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu
Environment="PATH=/usr/local/bin:/usr/bin:/bin:/home/ubuntu/.local/bin"
ExecStart=/home/ubuntu/.local/bin/uvicorn blast_api:app --host 0.0.0.0 --port 8000
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
设置开机自启动
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl start blast
sudo systemctl enable blast
查看状态
systemctl status blast
如果看到:
Active: active (running)
🎉 你的 BLAST 网页已经是“随时可用服务”了