#!/bin/bash # ============================================ # FLNXI素材库 - 修复 DATABASE_URL 脚本 # 用于修复数据库连接字符串问题 # ============================================ set -e echo "========================================" echo " 修复 DATABASE_URL 配置" echo "========================================" echo "" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 检查 .env.production 文件是否存在 if [ ! -f .env.production ]; then echo -e "${RED}错误: 未找到 .env.production 文件${NC}" echo "请先运行 install.sh 进行安装" exit 1 fi # 加载环境变量 source .env.production # 检查是否已有 DATABASE_URL if [ -n "$DATABASE_URL" ]; then echo -e "${GREEN}✓ 检测到 DATABASE_URL 已存在${NC}" echo "当前 DATABASE_URL: ${DATABASE_URL:0:50}..." # 检查是否需要更新(如果密码未编码) if echo "$DATABASE_URL" | grep -q "=="; then echo -e "${YELLOW}警告: DATABASE_URL 中的密码可能未正确编码${NC}" echo "正在重新生成..." NEED_UPDATE=1 else echo -e "${GREEN}✓ DATABASE_URL 格式正确${NC}" NEED_UPDATE=0 fi else echo -e "${YELLOW}未找到 DATABASE_URL,正在生成...${NC}" NEED_UPDATE=1 fi # 如果需要更新,生成新的 DATABASE_URL if [ "$NEED_UPDATE" = "1" ]; then if [ -z "$POSTGRES_PASSWORD" ]; then echo -e "${RED}错误: 未找到 POSTGRES_PASSWORD${NC}" exit 1 fi echo "正在对密码进行 URL 编码..." # URL 编码密码 if command -v python3 &> /dev/null; then POSTGRES_PASSWORD_ENCODED=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$POSTGRES_PASSWORD', safe=''))") elif command -v python &> /dev/null; then POSTGRES_PASSWORD_ENCODED=$(python -c "import urllib.parse; print(urllib.parse.quote('$POSTGRES_PASSWORD', safe=''))") elif command -v perl &> /dev/null; then POSTGRES_PASSWORD_ENCODED=$(perl -MURI::Escape -e "print uri_escape('$POSTGRES_PASSWORD');") else # 如果没有 Python 或 Perl,使用 sed 简单替换常见特殊字符 POSTGRES_PASSWORD_ENCODED=$(echo "$POSTGRES_PASSWORD" | sed 's/+/%2B/g; s/\//%2F/g; s/=/%3D/g; s/@/%40/g; s/:/%3A/g') fi POSTGRES_USER=${POSTGRES_USER:-postgres} POSTGRES_DB=${POSTGRES_DB:-flnxi} NEW_DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD_ENCODED}@postgres:5432/${POSTGRES_DB}" echo -e "${GREEN}✓ 已生成新的 DATABASE_URL${NC}" echo "新 DATABASE_URL: postgresql://${POSTGRES_USER}:***@postgres:5432/${POSTGRES_DB}" # 更新 .env.production 文件 if grep -q "^DATABASE_URL=" .env.production; then # 如果已存在,替换 if [[ "$OSTYPE" == "darwin"* ]]; then # macOS sed -i '' "s|^DATABASE_URL=.*|DATABASE_URL=$NEW_DATABASE_URL|" .env.production else # Linux sed -i "s|^DATABASE_URL=.*|DATABASE_URL=$NEW_DATABASE_URL|" .env.production fi echo -e "${GREEN}✓ 已更新 .env.production 中的 DATABASE_URL${NC}" else # 如果不存在,追加 echo "" >> .env.production echo "# 完整的数据库连接URL(密码已URL编码,自动生成)" >> .env.production echo "DATABASE_URL=$NEW_DATABASE_URL" >> .env.production echo -e "${GREEN}✓ 已添加 DATABASE_URL 到 .env.production${NC}" fi # 更新 .env 文件 cp .env.production .env echo -e "${GREEN}✓ 已同步到 .env 文件${NC}" fi echo "" echo "========================================" echo -e "${GREEN} 修复完成!${NC}" echo "========================================" echo "" echo "下一步操作:" echo " 1. 重启应用容器以应用新配置:" echo " sudo docker compose -f docker-compose.prod.yml restart app" echo "" echo " 2. 等待容器启动后,执行数据库初始化:" echo " sudo docker compose -f docker-compose.prod.yml exec app npx prisma db push" echo "" echo " 3. 如果仍有问题,检查容器内的环境变量:" echo " sudo docker compose -f docker-compose.prod.yml exec app env | grep DATABASE_URL" echo ""