Files
logan f8740d27f7 feat: OpsxDB 桌面数据库客户端首版入库
含工作台/连库多引擎字段与 SSH·SSL、结果编辑、Redis 键浏览、
Tauri 桌面与 docs/落地页;排除本地构建产物与 sidecar 二进制。
2026-09-19 22:43:45 +08:00

201 lines
6.5 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# 按需启停测试库,禁止一次全开。
set -euo pipefail
cd "$(dirname "$0")"
ALIASES_HELP='mysql|a mariadb|b postgres|c mssql|d oracle|e redis|f zookeeper|g elasticsearch|h influxdb|i'
ALL_PROFILES=(mysql mariadb postgres mssql oracle redis zookeeper elasticsearch influxdb)
# 国内加速(DaoCloud 镜像站)。可用 DOCKER_MIRROR 覆盖,例如 docker.1ms.run
DOCKER_MIRROR="${DOCKER_MIRROR:-docker.m.daocloud.io}"
DOCKER_MIRROR_FALLBACK="${DOCKER_MIRROR_FALLBACK:-docker.1ms.run}"
resolve() {
case "$1" in
a|mysql) echo mysql ;;
b|mariadb|maria) echo mariadb ;;
c|postgres|pg|postgresql) echo postgres ;;
d|mssql|sqlserver|sqlsrv) echo mssql ;;
e|oracle) echo oracle ;;
f|redis) echo redis ;;
g|zk|zookeeper) echo zookeeper ;;
h|es|elastic|elasticsearch) echo elasticsearch ;;
i|influx|influxdb) echo influxdb ;;
*) echo ""; return 1 ;;
esac
}
compose_all_profiles() {
local args=()
local p
for p in "${ALL_PROFILES[@]}"; do
args+=(--profile "$p")
done
echo "${args[@]}"
}
# 国内源路径 → 本地短名。拉完摘掉带源前缀的 tag,层仍在。
# zookeeper:3.9 ← docker.m.daocloud.io/library/zookeeper:3.9
# mssql/server:2022-latest ← mcr.m.daocloud.io/mssql/server:2022-latest
mirror_src() {
case "$1" in
mssql/server:*|mssql/*) echo "mcr.m.daocloud.io/$1" ;;
*) echo "${DOCKER_MIRROR}/library/$1" ;;
esac
}
mirror_src_fallback() {
case "$1" in
mssql/server:*|mssql/*) echo "mcr.microsoft.com/$1" ;;
*) echo "${DOCKER_MIRROR_FALLBACK}/library/$1" ;;
esac
}
pull_mirrored() {
local official="$1"
if docker image inspect "$official" >/dev/null 2>&1; then
echo "[OK] 已有本地镜像 $official"
return 0
fi
local src
for src in "$(mirror_src "$official")" "$(mirror_src_fallback "$official")"; do
echo "[INFO] 从 $src 拉取 …"
if docker pull "$src"; then
docker tag "$src" "$official"
if [[ "$src" != "$official" ]]; then
docker rmi "$src" >/dev/null 2>&1 || true
fi
echo "[OK] $official"
return 0
fi
echo "[WARN] $src 失败,尝试下一个"
done
echo "[ERR] 无法拉取 $official"
return 1
}
running_profiles() {
docker compose ps --services --status running 2>/dev/null || true
}
cmd_up() {
local svc
svc=$(resolve "${1:-}") || { echo "用法: $0 up <${ALIASES_HELP}>"; exit 1; }
local cur
cur=$(running_profiles)
if [[ -n "$cur" ]]; then
local other
other=$(echo "$cur" | grep -v "^${svc}$" || true)
if [[ -n "$other" ]]; then
echo "[WARN] 已有其它测试库在跑,先停以免抢资源: $other"
# shellcheck disable=SC2086
docker compose $(compose_all_profiles) stop $other || true
fi
fi
echo "[INFO] 启动 $svc …"
docker compose --profile "$svc" up -d "$svc"
echo "[OK] $svc 已请求启动。连接参数见 README.md"
docker compose --profile "$svc" ps
}
cmd_down() {
if [[ -z "${1:-}" ]]; then
echo "[INFO] 停止全部 opsxdb-tests 服务"
# shellcheck disable=SC2046
docker compose $(compose_all_profiles) down
return
fi
local svc
svc=$(resolve "$1") || { echo "未知库: $1"; exit 1; }
docker compose --profile "$svc" stop "$svc"
echo "[OK] 已停止 $svc(数据卷保留;要清数据用: $0 reset $svc)"
}
cmd_reset() {
local svc
svc=$(resolve "${1:-}") || { echo "用法: $0 reset <服务>"; exit 1; }
docker compose --profile "$svc" stop "$svc" || true
docker compose --profile "$svc" rm -f "$svc" || true
case "$svc" in
mysql) docker volume rm -f opsxdb-tests_opsxdb_mysql_data 2>/dev/null || true ;;
mariadb) docker volume rm -f opsxdb-tests_opsxdb_mariadb_data 2>/dev/null || true ;;
postgres) docker volume rm -f opsxdb-tests_opsxdb_pg_data 2>/dev/null || true ;;
mssql) docker volume rm -f opsxdb-tests_opsxdb_mssql_data 2>/dev/null || true ;;
oracle) docker volume rm -f opsxdb-tests_opsxdb_oracle_data 2>/dev/null || true ;;
redis) ;;
zookeeper)
docker volume rm -f opsxdb-tests_opsxdb_zk_data opsxdb-tests_opsxdb_zk_datalog 2>/dev/null || true
;;
elasticsearch) docker volume rm -f opsxdb-tests_opsxdb_es_data 2>/dev/null || true ;;
influxdb) docker volume rm -f opsxdb-tests_opsxdb_influx_data 2>/dev/null || true ;;
esac
echo "[OK] $svc 已重置(下次 up 会重新初始化)"
}
cmd_status() {
echo "=== 运行中的测试库 ==="
docker compose ps 2>/dev/null || docker ps --filter name=opsxdb- --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
}
cmd_logs() {
local svc
svc=$(resolve "${1:-}") || { echo "用法: $0 logs <服务>"; exit 1; }
docker compose --profile "$svc" logs -f --tail=100 "$svc"
}
cmd_pull() {
local target="${1:-new}"
case "$target" in
new|ghi|extra)
echo "[INFO] 拉取 ZooKeeper / Elasticsearch / InfluxDB(国内加速,本地短 tag)"
pull_mirrored zookeeper:3.9
pull_mirrored elasticsearch:8.15.3
pull_mirrored influxdb:2.7
;;
d|mssql|sqlserver) pull_mirrored mssql/server:2022-latest ;;
g|zk|zookeeper) pull_mirrored zookeeper:3.9 ;;
h|es|elastic|elasticsearch) pull_mirrored elasticsearch:8.15.3 ;;
i|influx|influxdb) pull_mirrored influxdb:2.7 ;;
*)
local svc
svc=$(resolve "$target") || { echo "用法: $0 pull [new|zookeeper|elasticsearch|influxdb]"; exit 1; }
case "$svc" in
mssql) pull_mirrored mssql/server:2022-latest ;;
zookeeper) pull_mirrored zookeeper:3.9 ;;
elasticsearch) pull_mirrored elasticsearch:8.15.3 ;;
influxdb) pull_mirrored influxdb:2.7 ;;
*) echo "请直接 docker compose pull,或: $0 pull new"; exit 1 ;;
esac
;;
esac
echo
docker images --format 'table {{.Repository}}\t{{.Tag}}\t{{.Size}}' | grep -E 'REPOSITORY|zookeeper|elasticsearch|influxdb' || true
}
usage() {
cat <<USAGE
OpsxDB 测试库控制(一次只建议开一个)
./dbctl.sh up <服务>
./dbctl.sh down [服务] # 省略则停全部
./dbctl.sh reset <服务> # 删容器+数据卷
./dbctl.sh pull [new] # 国内加速拉取 ZK / ES / InfluxDB
./dbctl.sh status
./dbctl.sh logs <服务>
a–i: a=MySQL b=MariaDB c=PostgreSQL d=SQL Server e=Oracle
f=Redis g=ZooKeeper h=Elasticsearch i=InfluxDB
USAGE
}
case "${1:-}" in
up) shift; cmd_up "$@" ;;
down|stop) shift; cmd_down "$@" ;;
reset) shift; cmd_reset "$@" ;;
pull) shift; cmd_pull "$@" ;;
status|ps) cmd_status ;;
logs) shift; cmd_logs "$@" ;;
help|-h|--help|"") usage ;;
*) echo "未知命令: $1"; usage; exit 1 ;;
esac