#!/bin/bash # PostgreSQL 数据库部署脚本 # 使用方法:bash deploy-database.sh set -e # 遇到错误立即退出 echo "🚀 开始部署 PostgreSQL 数据库..." echo "" # 服务器信息 SERVER="root@45.249.208.118" SERVER_PASSWORD="lxvhNYFZ4160" # 从聊天记录中获取 REMOTE_DIR="/opt/flnxi-website" DB_NAME="flnxi_db" DB_USER="flnxi_user" DB_PASSWORD="Flnxi@2025!SecurePassword" # 生成的强密码 # 颜色定义 GREEN='\033[0;32m' BLUE='\033[0;34m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color # 检查是否安装 sshpass if ! command -v sshpass &> /dev/null; then echo -e "${YELLOW}⚠️ sshpass 未安装,正在安装...${NC}" if [[ "$OSTYPE" == "darwin"* ]]; then # macOS brew install hudochenkov/sshpass/sshpass 2>/dev/null || { echo -e "${RED}❌ 请先安装 Homebrew,然后运行:${NC}" echo "brew install hudochenkov/sshpass/sshpass" exit 1 } else # Linux sudo apt-get install -y sshpass || sudo yum install -y sshpass fi echo -e "${GREEN}✅ sshpass 已安装${NC}" fi # SSH 执行函数 ssh_exec() { sshpass -p "$SERVER_PASSWORD" ssh -o StrictHostKeyChecking=no $SERVER "$1" } # 步骤1:检查系统类型 echo -e "${BLUE}步骤 1/10: 检查服务器系统...${NC}" OS_INFO=$(ssh_exec "cat /etc/os-release 2>/dev/null || cat /etc/redhat-release 2>/dev/null || echo 'Unknown'") echo "$OS_INFO" | head -3 echo "" # 步骤2:安装 Docker Compose PostgreSQL 方案(推荐) echo -e "${BLUE}步骤 2/10: 使用 Docker 部署 PostgreSQL...${NC}" ssh_exec "cd $REMOTE_DIR && cat > docker-compose-db.yml << 'EOFDB' version: '3.8' services: postgres: image: postgres:15-alpine container_name: flnxi-postgres environment: POSTGRES_DB: ${DB_NAME} POSTGRES_USER: ${DB_USER} POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_INITDB_ARGS: '--encoding=UTF-8 --lc-collate=C --lc-ctype=C' volumes: - postgres_data:/var/lib/postgresql/data ports: - '127.0.0.1:5432:5432' restart: unless-stopped healthcheck: test: ['CMD-SHELL', 'pg_isready -U ${DB_USER}'] interval: 10s timeout: 5s retries: 5 volumes: postgres_data: driver: local EOFDB " echo -e "${GREEN}✅ Docker Compose 配置已创建${NC}" echo "" # 步骤3:启动 PostgreSQL echo -e "${BLUE}步骤 3/10: 启动 PostgreSQL 数据库...${NC}" ssh_exec "cd $REMOTE_DIR && docker-compose -f docker-compose-db.yml up -d" echo -e "${GREEN}✅ PostgreSQL 已启动${NC}" echo "" # 等待数据库启动 echo -e "${BLUE}等待数据库启动... (10秒)${NC}" sleep 10 # 步骤4:验证数据库连接 echo -e "${BLUE}步骤 4/10: 验证数据库连接...${NC}" ssh_exec "docker exec flnxi-postgres psql -U $DB_USER -d $DB_NAME -c 'SELECT version();'" || { echo -e "${RED}❌ 数据库连接失败${NC}" exit 1 } echo -e "${GREEN}✅ 数据库连接成功${NC}" echo "" # 步骤5:更新环境变量 echo -e "${BLUE}步骤 5/10: 配置数据库连接字符串...${NC}" DATABASE_URL="postgresql://${DB_USER}:${DB_PASSWORD}@localhost:5432/${DB_NAME}?schema=public" ssh_exec "cd $REMOTE_DIR && cat >> .env.local << EOFENV # PostgreSQL 数据库配置 DATABASE_URL=\"${DATABASE_URL}\" EOFENV " echo -e "${GREEN}✅ 环境变量已配置${NC}" echo "" # 步骤6:创建用户表 SQL echo -e "${BLUE}步骤 6/10: 创建用户表...${NC}" ssh_exec "docker exec -i flnxi-postgres psql -U $DB_USER -d $DB_NAME << 'EOFSQL' -- 创建用户表 CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, email_verified BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 创建索引 CREATE INDEX IF NOT EXISTS idx_users_email ON users(email); CREATE INDEX IF NOT EXISTS idx_users_created_at ON users(created_at); -- 查看表结构 \d users -- 显示成功消息 SELECT '✅ 用户表创建成功' as message; EOFSQL " echo -e "${GREEN}✅ 用户表已创建${NC}" echo "" # 步骤7:显示数据库信息 echo -e "${BLUE}步骤 7/10: 数据库信息汇总...${NC}" echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${GREEN}📊 数据库连接信息${NC}" echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo "" echo "容器名称: flnxi-postgres" echo "数据库名: $DB_NAME" echo "用户名: $DB_USER" echo "密码: $DB_PASSWORD" echo "端口: 5432 (仅本地访问)" echo "连接字符串: $DATABASE_URL" echo "" echo -e "${YELLOW}⚠️ 请妥善保管数据库密码!${NC}" echo "" # 步骤8:保存数据库信息到文件 echo -e "${BLUE}步骤 8/10: 保存配置信息...${NC}" cat > DATABASE_CONFIG.md << EOFCONFIG # PostgreSQL 数据库配置信息 ## 连接信息 - **容器名称**: \`flnxi-postgres\` - **数据库名**: \`$DB_NAME\` - **用户名**: \`$DB_USER\` - **密码**: \`$DB_PASSWORD\` - **端口**: \`5432\` (仅本地访问) - **连接字符串**: \`\`\` $DATABASE_URL \`\`\` ## 管理命令 ### 连接数据库 \`\`\`bash # 在服务器上执行 docker exec -it flnxi-postgres psql -U $DB_USER -d $DB_NAME \`\`\` ### 查看表 \`\`\`sql \dt \`\`\` ### 查看用户数据 \`\`\`sql SELECT id, name, email, email_verified, created_at FROM users; \`\`\` ### 备份数据库 \`\`\`bash docker exec flnxi-postgres pg_dump -U $DB_USER $DB_NAME > backup_\$(date +%Y%m%d).sql \`\`\` ### 恢复数据库 \`\`\`bash docker exec -i flnxi-postgres psql -U $DB_USER $DB_NAME < backup_20250101.sql \`\`\` ## 表结构 ### users 表 | 字段 | 类型 | 说明 | |------|------|------| | id | SERIAL | 主键 | | name | VARCHAR(255) | 用户名 | | email | VARCHAR(255) | 邮箱(唯一) | | password | VARCHAR(255) | 密码(bcrypt加密) | | email_verified | BOOLEAN | 邮箱是否验证 | | created_at | TIMESTAMP | 创建时间 | | updated_at | TIMESTAMP | 更新时间 | ## 安全建议 1. ✅ 数据库仅监听 localhost,外部无法访问 2. ✅ 使用强密码 3. ⚠️ 定期备份数据 4. ⚠️ 定期更新密码 5. ⚠️ 监控数据库日志 ## 下一步 1. 安装 Prisma ORM 2. 更新注册 API 使用数据库 3. 更新登录 API 使用数据库 4. 添加密码加密(bcrypt) --- 生成时间: $(date) EOFCONFIG echo -e "${GREEN}✅ 配置已保存到 DATABASE_CONFIG.md${NC}" echo "" # 步骤9:测试数据库 echo -e "${BLUE}步骤 9/10: 测试数据库功能...${NC}" ssh_exec "docker exec -i flnxi-postgres psql -U $DB_USER -d $DB_NAME << 'EOFSQL' -- 插入测试数据 INSERT INTO users (name, email, password, email_verified) VALUES ('测试管理员', 'admin@flnxi.com', 'temp_password_will_be_hashed', true) ON CONFLICT (email) DO NOTHING; -- 查询测试 SELECT id, name, email, email_verified, created_at FROM users; EOFSQL " echo -e "${GREEN}✅ 数据库功能正常${NC}" echo "" # 步骤10:完成 echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${GREEN}🎉 PostgreSQL 数据库部署完成!${NC}" echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo "" echo -e "${YELLOW}📝 下一步操作:${NC}" echo "1. 查看数据库配置:cat DATABASE_CONFIG.md" echo "2. 安装依赖:bash deploy-prisma-setup.sh" echo "3. 更新代码使用数据库" echo "4. 重新部署应用" echo "" echo -e "${YELLOW}🔍 快速测试:${NC}" echo "ssh $SERVER 'docker exec flnxi-postgres psql -U $DB_USER -d $DB_NAME -c \"SELECT * FROM users;\"'" echo ""