#!/usr/bin/env bash set -euo pipefail if [ "${EUID}" -ne 0 ]; then echo "需要 root 权限"; exit 1; fi . /etc/os-release || true CODENAME=${VERSION_CODENAME:-} VERSION=${VERSION_ID:-} echo "更新系统软件源..." apt-get update -y echo "安装基础依赖..." apt-get install -y python3 python3-venv python3-pip nginx git ffmpeg rsync curl gnupg echo "安装并启动 MongoDB..." if ! command -v mongod >/dev/null 2>&1; then if [ -n "$CODENAME" ]; then curl -fsSL https://pgp.mongodb.com/server-7.0.asc | gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpg || true echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu ${CODENAME}/mongodb-org/7.0 multiverse" > /etc/apt/sources.list.d/mongodb-org-7.0.list || true apt-get update -y || true apt-get install -y mongodb-org || apt-get install -y mongodb else apt-get install -y mongodb fi fi systemctl enable mongod || true systemctl restart mongod || systemctl start mongod || true echo "安装并启动 Redis..." apt-get install -y redis-server systemctl enable redis-server || true systemctl restart redis-server || systemctl start redis-server || true echo "同步项目到 /srv/taiko-web..." mkdir -p /srv/taiko-web SRC_DIR=$(cd "$(dirname "$0")" && pwd) rsync -a --delete --exclude '.git' --exclude '.venv' "$SRC_DIR/" /srv/taiko-web/ echo "创建并安装 Python 虚拟环境..." python3 -m venv /srv/taiko-web/.venv /srv/taiko-web/.venv/bin/pip install -U pip /srv/taiko-web/.venv/bin/pip install -r /srv/taiko-web/requirements.txt if [ ! -f /srv/taiko-web/config.py ] && [ -f /srv/taiko-web/config.example.py ]; then cp /srv/taiko-web/config.example.py /srv/taiko-web/config.py fi chown -R www-data:www-data /srv/taiko-web echo "创建 systemd 服务..." cat >/etc/systemd/system/taiko-web.service <<'EOF' [Unit] Description=Taiko Web After=network.target mongod.service redis-server.service [Service] Type=simple WorkingDirectory=/srv/taiko-web Environment=PYTHONUNBUFFERED=1 ExecStart=/srv/taiko-web/.venv/bin/gunicorn -b 127.0.0.1:8000 app:app Restart=always User=www-data Group=www-data [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable taiko-web systemctl restart taiko-web echo "配置 Nginx 站点..." cat >/etc/nginx/sites-available/taiko-web <<'EOF' server { listen 80 default_server; server_name _; location / { 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_pass http://127.0.0.1:8000; } } EOF ln -sf /etc/nginx/sites-available/taiko-web /etc/nginx/sites-enabled/taiko-web rm -f /etc/nginx/sites-enabled/default || true nginx -t systemctl restart nginx if command -v ufw >/dev/null 2>&1; then ufw allow 'Nginx Full' || true fi echo "部署完成"