- DatabaseConfig: Host/Port/User/Password/Name/DBName/SSLMode → 单个 DSN 字段 - RedisConfig: Host/Port/Password/DB/URL → 单个 DSN 字段 - 环境变量: GOCHAT_DATABASE_* (7个) → GOCHAT_DATABASE_DSN, GOCHAT_REDIS_* (5个) → GOCHAT_REDIS_DSN - validator.go: DSN URL 解析校验 (scheme + host) - redis.go: redis.ParseURL(cfg.DSN) 直连 - 所有 docker-compose / CI / shell 脚本 / .env 同步更新 - 删除 deploy/helm/ 整个目录 (20个文件) - CI 删除 helm-validate / deploy-staging / deploy-production 三个 job - 文档同步更新 (README, 架构设计, PRD, 滚动升级)
122 lines
4.1 KiB
Bash
Executable File
122 lines
4.1 KiB
Bash
Executable File
#!/bin/bash
|
|
# GoChat Database Seed Script
|
|
# Reference: Chatwoot db:seed pattern — creates super admin + test account + test inbox
|
|
#
|
|
# Usage:
|
|
# ./scripts/seed.sh # Seed with defaults
|
|
# ./scripts/seed.sh --clean # Clean all data before seeding (DANGEROUS in production)
|
|
#
|
|
# Environment variables:
|
|
# GOCHAT_SEED_ADMIN_EMAIL — admin user email (default: admin@gochat.local)
|
|
# GOCHAT_SEED_ADMIN_PASSWORD — admin user password (default: changeme)
|
|
# GOCHAT_SEED_ADMIN_NAME — admin display name (default: Super Admin)
|
|
# GOCHAT_SEED_ACCOUNT_NAME — test account name (default: Test Account)
|
|
# GOCHAT_SEED_INBOX_NAME — test inbox name (default: Test Website Inbox)
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
|
|
# --- Defaults ---
|
|
ADMIN_EMAIL="${GOCHAT_SEED_ADMIN_EMAIL:-admin@gochat.local}"
|
|
ADMIN_PASSWORD="${GOCHAT_SEED_ADMIN_PASSWORD:-changeme}"
|
|
ADMIN_NAME="${GOCHAT_SEED_ADMIN_NAME:-Super Admin}"
|
|
ACCOUNT_NAME="${GOCHAT_SEED_ACCOUNT_NAME:-Test Account}"
|
|
INBOX_NAME="${GOCHAT_SEED_INBOX_NAME:-Test Website Inbox}"
|
|
ENV="${GOCHAT_ENV:-development}"
|
|
|
|
# --- Colors ---
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
log_info() { echo -e "${GREEN}[SEED]${NC} $1"; }
|
|
log_warn() { echo -e "${YELLOW}[SEED]${NC} $1"; }
|
|
log_error() { echo -e "${RED}[SEED]${NC} $1"; }
|
|
|
|
# --- Clean mode ---
|
|
if [[ "${1:-}" == "--clean" ]]; then
|
|
if [[ "$ENV" == "production" ]]; then
|
|
log_error "Cannot use --clean in production environment!"
|
|
exit 1
|
|
fi
|
|
log_warn "Cleaning all data before seeding..."
|
|
# Parse DSN for psql connection
|
|
DB_HOST=$(echo "$GOCHAT_DATABASE_DSN" | sed 's|.*@||; s|:.*||')
|
|
DB_PORT=$(echo "$GOCHAT_DATABASE_DSN" | sed 's|.*@.*:||; s|/.*||')
|
|
DB_USER=$(echo "$GOCHAT_DATABASE_DSN" | sed 's|.*://||; s|:.*||')
|
|
DB_PASS=$(echo "$GOCHAT_DATABASE_DSN" | sed 's|.*://[^:]*:||; s|@.*||')
|
|
DB_NAME=$(echo "$GOCHAT_DATABASE_DSN" | sed 's|.*/||; s|\?.*||')
|
|
psql_cmd="PGPASSWORD=${DB_PASS} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME}"
|
|
$psql_cmd -c "
|
|
TRUNCATE TABLE
|
|
messages,
|
|
conversations,
|
|
contacts,
|
|
contact_inboxes,
|
|
inboxes,
|
|
inbox_members,
|
|
users,
|
|
accounts,
|
|
attachments,
|
|
reporting_events,
|
|
reporting_events_rollups,
|
|
dashboard_apps,
|
|
captain_assistants,
|
|
captain_documents,
|
|
captain_scenarios,
|
|
captain_custom_tools,
|
|
notifications,
|
|
notification_preferences
|
|
CASCADE;
|
|
"
|
|
log_info "All data cleaned."
|
|
fi
|
|
|
|
# --- Seed via GoChat CLI ---
|
|
# The seed command is built into the GoChat binary to avoid raw SQL maintenance.
|
|
# It creates:
|
|
# 1. Super Admin user (role=super_admin)
|
|
# 2. Test Account owned by the admin
|
|
# 3. Test Website Inbox under the account
|
|
# 4. Agent user (role=agent) in the account
|
|
|
|
BINARY="${PROJECT_ROOT}/bin/gochat"
|
|
|
|
if [[ ! -f "$BINARY" ]]; then
|
|
log_warn "GoChat binary not found at $BINARY, building..."
|
|
cd "$PROJECT_ROOT"
|
|
make build
|
|
fi
|
|
|
|
log_info "Seeding GoChat database (env=$ENV)..."
|
|
log_info " Admin: $ADMIN_EMAIL / $ADMIN_PASSWORD"
|
|
log_info " Account: $ACCOUNT_NAME"
|
|
log_info " Inbox: $INBOX_NAME"
|
|
|
|
cd "$PROJECT_ROOT"
|
|
GOCHAT_ENV="$ENV" \
|
|
GOCHAT_SEED_ADMIN_EMAIL="$ADMIN_EMAIL" \
|
|
GOCHAT_SEED_ADMIN_PASSWORD="$ADMIN_PASSWORD" \
|
|
GOCHAT_SEED_ADMIN_NAME="$ADMIN_NAME" \
|
|
GOCHAT_SEED_ACCOUNT_NAME="$ACCOUNT_NAME" \
|
|
GOCHAT_SEED_INBOX_NAME="$INBOX_NAME" \
|
|
"$BINARY" seed
|
|
|
|
if [[ $? -eq 0 ]]; then
|
|
log_info "Seeding completed successfully!"
|
|
log_info ""
|
|
log_info "Created resources:"
|
|
log_info " ✅ Super Admin: $ADMIN_EMAIL"
|
|
log_info " ✅ Account: $ACCOUNT_NAME"
|
|
log_info " ✅ Inbox: $INBOX_NAME (web_widget channel)"
|
|
log_info ""
|
|
log_info "You can now log in at: http://localhost:3000"
|
|
log_info " Email: $ADMIN_EMAIL"
|
|
log_info " Password: $ADMIN_PASSWORD"
|
|
else
|
|
log_error "Seeding failed! Check the logs above."
|
|
exit 1
|
|
fi |