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 网页已经是“随时可用服务”了