#!/usr/bin/env bash # 首次建库:把导出的 SQL 灌进 PostgreSQL # # ./init-db.sh /path/to/dump.sql # # 数据库由 1Panel 管理(独立的 postgres 容器,端口不对外发布),所以直接 # docker exec 进那个容器跑 psql —— 服务器上不需要装 psql,也不依赖宿主端口。 # # 容器名在 .env 的 PG_CONTAINER 里;不确定就看: # docker ps --format '{{.Names}}' | grep -i postgres # # 注意:只在库为空时执行一次;已有数据时重跑会与现有行冲突。 set -euo pipefail cd "$(dirname "$0")" [ -f .env ] || { echo "!! 缺少 .env:先 cp .env.example .env 并填写"; exit 1; } set -a; . ./.env; set +a DUMP="${1:-}" if [ -z "$DUMP" ]; then echo "用法:./init-db.sh " echo "" echo " 请传入一份与当前代码匹配的 SQL(含全部新增迁移)。" echo " 导出命令(开发机):go run ./cmd/dbtool dump -with-extension -out db/backups/db_dump.sql" exit 1 fi [ -f "$DUMP" ] || { echo "!! 找不到 dump 文件:$DUMP"; exit 1; } PG_CONTAINER="${PG_CONTAINER:?PG_CONTAINER 未设置:填 .env 里那个 postgres 容器名}" if ! docker inspect "$PG_CONTAINER" >/dev/null 2>&1; then echo "!! 容器不存在:$PG_CONTAINER" echo " docker ps --format '{{.Names}}' | grep -i postgres" exit 1 fi run_psql() { docker exec -i -e PGPASSWORD="${DB_PASSWORD:?DB_PASSWORD 未设置}" "$PG_CONTAINER" \ psql -U "${DB_USER:-fashion}" -d "${DB_NAME:-fashion}" "$@" } echo "==> 检查连接(容器 $PG_CONTAINER)" if ! run_psql -c 'select 1' >/dev/null 2>&1; then echo "!! 连不上。检查 DB_USER / DB_NAME / DB_PASSWORD 是否与该容器一致" exit 1 fi echo "==> 检查 pgvector" if run_psql -tAc "select 1 from pg_available_extensions where name = 'vector'" 2>/dev/null | grep -q 1; then echo " pgvector 可用" else echo " !! 该 Postgres 没有 pgvector:dump 里的 vector 类型会导入失败" echo " 换用带 pgvector 的镜像,或先安装扩展后重试" exit 1 fi echo "==> 导入 $DUMP" run_psql -v ON_ERROR_STOP=1 < "$DUMP" echo "==> 完成。可以执行 ./deploy.sh all 启动全部服务"