#!/bin/bash # 服务器初始化和部署脚本 - Ubuntu 24.04 # 域名: tksea.top # 服务器 IP: 43.155.133.187 set -e echo "========================================" echo "服务器初始化和部署脚本" echo "========================================" # 0. 检查是否是 root 用户 if [ "$EUID" -ne 0 ]; then echo "请使用 root 用户运行此脚本" exit 1 fi # 1. 更新系统 echo "[1/14] 更新系统包..." export DEBIAN_FRONTEND=noninteractive apt update && apt upgrade -y # 2. 安装基础工具 echo "[2/14] 安装基础工具..." apt install -y curl wget vim git htop net-tools unzip certbot python3-certbot-nginx gnupg2 ca-certificates lsb-release # 3. 安装 Docker echo "[3/14] 安装 Docker..." if ! command -v docker &> /dev/null; then install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg chmod a+r /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null apt update apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin systemctl enable docker systemctl start docker fi # 4. 验证 Docker echo "[4/14] 验证 Docker 安装..." docker --version docker compose version # 5. 安装 Nginx echo "[5/14] 安装 Nginx..." if ! command -v nginx &> /dev/null; then apt install -y nginx fi # 6. 配置防火墙 echo "[6/14] 配置防火墙..." ufw allow 22/tcp ufw allow 80/tcp ufw allow 443/tcp echo "y" | ufw enable 2>/dev/null || true # 7. 创建应用目录 echo "[7/14] 创建应用目录..." mkdir -p /opt/gitea mkdir -p /opt/sub2api mkdir -p /opt/nginx/ssl mkdir -p /var/www/html # 8. 配置 DNS 验证(用于 Let's Encrypt) echo "[8/14] 配置 Nginx 用于 SSL..." cat > /etc/nginx/sites-available/tksea.top << 'EOF' server { listen 80; server_name tksea.top www.tksea.top; root /var/www/html; location / { return 200 "Sub2API Server"; } location /.well-known/acme-challenge/ { root /var/www/html; } } EOF ln -sf /etc/nginx/sites-available/tksea.top /etc/nginx/sites-enabled/ nginx -t systemctl reload nginx # 9. 获取 SSL 证书 echo "[9/14] 获取 SSL 证书..." certbot --nginx -d tksea.top -d www.tksea.top --non-interactive --agree-tos --email admin@tksea.top --keep-until-expiring # 10. 配置 Nginx 反向代理 echo "[10/14] 配置 Nginx 反向代理..." cat > /etc/nginx/sites-available/tksea.top << 'EOF' # HTTP 重定向到 HTTPS server { listen 80; server_name tksea.top www.tksea.top; location /.well-known/acme-challenge/ { root /var/www/html; } location / { return 301 https://$server_name$request_uri; } } # HTTPS - Gitea (主域名) server { listen 443 ssl http2; server_name tksea.top www.tksea.top; ssl_certificate /etc/letsencrypt/live/tksea.top/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/tksea.top/privkey.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; add_header Strict-Transport-Security "max-age=63072000" always; # Gitea 反向代理 location / { proxy_pass http://localhost:3000; 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_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } # sub2api 子域名 server { listen 443 ssl http2; server_name api.tksea.top; ssl_certificate /etc/letsencrypt/live/tksea.top/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/tksea.top/privkey.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; add_header Strict-Transport-Security "max-age=63072000" always; underscores_in_headers on; # Sub2API 反向代理 location / { proxy_pass http://localhost:8080; 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; } } EOF ln -sf /etc/nginx/sites-available/tksea.top /etc/nginx/sites-enabled/ nginx -t systemctl reload nginx # 11. 部署 Gitea echo "[11/14] 部署 Gitea..." cat > /opt/gitea/docker-compose.yml << 'EOF' version: '3.8' services: gitea: image: gitea/gitea:latest container_name: gitea restart: unless-stopped ports: - "127.0.0.1:3000:3000" - "127.0.0.1:2222:22" volumes: - gitea-data:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro environment: - USER_UID=1000 - USER_GID=1000 - GITEA__database__DB_TYPE=sqlite3 - GITEA__server__DOMAIN=tksea.top - GITEA__server__ROOT_URL=https://tksea.top/ - GITEA__server__HTTP_PORT=3000 - GITEA__ssh__DOMAIN=tksea.top - GITEA__ssh__PORT=2222 - GITEA__webhook__ALLOWED_HOSTS=tksea.top healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/"] interval: 30s timeout: 10s retries: 3 volumes: gitea-data: name: gitea-data EOF cd /opt/gitea docker compose up -d echo "等待 Gitea 启动..." sleep 10 # 12. 部署 Sub2API echo "[12/14] 部署 Sub2API..." mkdir -p /opt/sub2api/deploy cd /opt/sub2api/deploy # 下载部署脚本 curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/docker-deploy.sh -o docker-deploy.sh chmod +x docker-deploy.sh bash docker-deploy.sh # 修改 docker-compose 使用本地存储 if [ -f docker-compose.yml ]; then # 替换为本地目录版本 curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/docker-compose.local.yml -o docker-compose.local.yml docker compose -f docker-compose.local.yml up -d fi # 13. 配置 SSL 自动续期 echo "[13/14] 配置 SSL 自动续期..." cat > /etc/cron.d/certbot-renew << 'EOF' 0 0 * * * root certbot renew --quiet --deploy-hook "systemctl reload nginx" EOF # 14. 等待服务启动并显示状态 echo "[14/14] 验证服务状态..." sleep 15 echo "" echo "========================================" echo "部署完成!" echo "========================================" echo "" echo "Gitea 状态:" docker ps | grep gitea || echo "Gitea 容器状态待检查" echo "" echo "Sub2API 状态:" docker ps | grep sub2api || echo "Sub2API 容器状态待检查" echo "" echo "Nginx 状态:" systemctl status nginx --no-pager | head -5 echo "" echo "SSL 证书状态:" certbot certificates 2>/dev/null | head -10 echo "" echo "========================================" echo "访问地址:" echo "- Gitea: https://tksea.top" echo "- Sub2API: https://api.tksea.top" echo "" echo "后续步骤:" echo "1. 首次访问 https://tksea.top 完成 Gitea 初始化" echo "2. 访问 https://api.tksea.top 完成 Sub2API 设置向导" echo "3. 在腾讯云控制台添加 DNS 解析: api.tksea.top -> 43.155.133.187" echo "========================================"