Files
inquiry_robot/deploy/_remote_create_local_mysql_pg.ps1
T

127 lines
5.7 KiB
PowerShell
Raw 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.
# 在应用机本机 mysqld 上创建空库 inquiry_robot(表稍后 Flyway)。
# 口令:优先 E:\wwwroot\ops\.mysql_root_stash.tmp,否则尝试现网 application-database-credentials.json 中的 mysql_password。
# 不向 stdout 打印任何口令。副作用:改 E:\wwwroot\.env 的 MYSQL/PG HOST 为 127.0.0.1。
$ErrorActionPreference = "Stop"
$mysql = "C:\yutongda\tools\mysql-8.0.39-winx64\bin\mysql.exe"
$psql = "C:\yutongda\tools\pgsql\bin\psql.exe"
$secrets = Get-Content "E:\wwwroot\ops\inquiry_robot_db_secrets.json" -Raw | ConvertFrom-Json
$dbCred = Get-Content "C:\yutongda\secure\application-database-credentials.json" -Raw | ConvertFrom-Json
function Test-MysqlRoot([string]$pass) {
if ([string]::IsNullOrWhiteSpace($pass)) { return $false }
$out = & $mysql -h 127.0.0.1 -P 3306 -u root "-p$pass" --connect-timeout=8 -e "SELECT 'root_ok' AS r" 2>&1 | Out-String
return ($out -match "root_ok")
}
Write-Output "=== resolve local mysql root ==="
$rootPass = $null
$stash = "E:\wwwroot\ops\.mysql_root_stash.tmp"
if (Test-Path $stash) {
$candidate = (Get-Content $stash -Raw).Trim()
if (Test-MysqlRoot $candidate) {
$rootPass = $candidate
Write-Output ("root_from=stash len=" + $rootPass.Length)
}
}
if (-not $rootPass) {
$candidate = [string]$dbCred.mysql_password
if (Test-MysqlRoot $candidate) {
$rootPass = $candidate
Write-Output ("root_from=app_db_cred.mysql_password len=" + $rootPass.Length)
Set-Content -Path $stash -Value $rootPass -Encoding ascii -NoNewline
}
}
if (-not $rootPass) {
# 再试 postgres 口令等同机复用(少数环境)
$candidate = [string]$dbCred.postgres_password
if (Test-MysqlRoot $candidate) {
$rootPass = $candidate
Write-Output ("root_from=app_db_cred.postgres_password len=" + $rootPass.Length)
Set-Content -Path $stash -Value $rootPass -Encoding ascii -NoNewline
}
}
if (-not $rootPass) { throw "local mysql root auth failed" }
Write-Output "MYSQL_ROOT_OK"
$mysqlPass = [string]$secrets.mysql_password
if ([string]::IsNullOrWhiteSpace($mysqlPass)) { throw "missing inquiry_robot mysql_password in secrets json" }
# 写临时 SQL,避免 PowerShell 对反引号/括号的解析问题
$sqlPath = "E:/wwwroot/ops/sql/_run_create_inquiry_robot_mysql.sql"
$sql = @"
CREATE DATABASE IF NOT EXISTS ``inquiry_robot`` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'inquiry_robot'@'localhost' IDENTIFIED BY '$mysqlPass';
CREATE USER IF NOT EXISTS 'inquiry_robot'@'127.0.0.1' IDENTIFIED BY '$mysqlPass';
CREATE USER IF NOT EXISTS 'inquiry_robot'@'%' IDENTIFIED BY '$mysqlPass';
ALTER USER 'inquiry_robot'@'localhost' IDENTIFIED BY '$mysqlPass';
ALTER USER 'inquiry_robot'@'127.0.0.1' IDENTIFIED BY '$mysqlPass';
ALTER USER 'inquiry_robot'@'%' IDENTIFIED BY '$mysqlPass';
GRANT ALL PRIVILEGES ON ``inquiry_robot``.* TO 'inquiry_robot'@'localhost';
GRANT ALL PRIVILEGES ON ``inquiry_robot``.* TO 'inquiry_robot'@'127.0.0.1';
GRANT ALL PRIVILEGES ON ``inquiry_robot``.* TO 'inquiry_robot'@'%';
FLUSH PRIVILEGES;
SELECT 'mysql_create_ok' AS s;
"@
Set-Content -Path $sqlPath -Value $sql -Encoding ascii
Write-Output "=== create empty MySQL DB/user ==="
$createOut = & $mysql -h 127.0.0.1 -P 3306 -u root "-p$rootPass" --connect-timeout=15 -e "source $sqlPath" 2>&1 | Out-String
$createOut -split "`r?`n" | ForEach-Object {
if ($_ -match 'Using a password|IDENTIFIED BY') { return }
if ($_ -match 'password') { return }
$_
}
if ($createOut -notmatch "mysql_create_ok") { throw "mysql create failed" }
Write-Output "=== smoke as inquiry_robot ==="
$smoke = & $mysql -h 127.0.0.1 -P 3306 -u inquiry_robot "-p$mysqlPass" --connect-timeout=8 inquiry_robot -e "SELECT 'mysql_app_ok' AS s; SHOW TABLES;" 2>&1 | Out-String
$smoke -split "`r?`n" | ForEach-Object {
if ($_ -match 'Using a password') { return }
$_
}
if ($smoke -notmatch "mysql_app_ok") { throw "mysql app smoke failed" }
Write-Output "MYSQL_CREATED_OK"
Write-Output "=== confirm PG app user ==="
$env:PGPASSWORD = [string]$secrets.pg_password
$pgSmoke = & $psql -h 127.0.0.1 -p 5432 -U inquiry_robot_runtime -d inquiry_robot_runtime -tAc "SELECT 'pg_app_ok'" 2>&1
Write-Output ("PG=" + (($pgSmoke | ForEach-Object {"$_"}) -join " "))
if (($pgSmoke | Out-String) -notmatch "pg_app_ok") { throw "pg app smoke failed" }
Remove-Item Env:PGPASSWORD -ErrorAction SilentlyContinue
Write-Output "=== patch .env hosts to 127.0.0.1 ==="
$envPath = "E:\wwwroot\.env"
$lines = Get-Content $envPath
$out = foreach ($line in $lines) {
if ($line -match '^MYSQL_HOST=') { 'MYSQL_HOST=127.0.0.1' }
elseif ($line -match '^PG_HOST=') { 'PG_HOST=127.0.0.1' }
elseif ($line -match '^YTD_MYSQL_URL=') {
'YTD_MYSQL_URL=jdbc:mysql://127.0.0.1:3306/inquiry_robot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&allowPublicKeyRetrieval=true&tinyInt1isBit=false&serverTimezone=Asia/Shanghai'
}
elseif ($line -match '^MYSQL_PASSWORD=') { "MYSQL_PASSWORD=$($secrets.mysql_password)" }
elseif ($line -match '^PG_PASSWORD=') { "PG_PASSWORD=$($secrets.pg_password)" }
else { $line }
}
Set-Content $envPath -Value $out -Encoding UTF8
if (Test-Path "E:\wwwroot\agent\current") {
Copy-Item $envPath "E:\wwwroot\agent\current\.env" -Force
}
# 清理含明文口令的临时 SQL(secrets 已在 json/.env)
Remove-Item $sqlPath -Force -ErrorAction SilentlyContinue
$status = @{
mysqlHost = "127.0.0.1"
mysqlDb = "inquiry_robot"
mysqlCreated = $true
pgHost = "127.0.0.1"
pgDb = "inquiry_robot_runtime"
pgCreated = $true
note = "Empty DBs on APP-SERVER local mysqld/postgres (C:\yutongda\tools), not 10.206.0.14. Tables via Flyway later."
updatedAt = (Get-Date).ToString("o")
needDba = $false
} | ConvertTo-Json
Set-Content "E:\wwwroot\ops\data-plane-status.json" -Value $status -Encoding UTF8
Write-Output $status
Write-Output "CREATE_ALL_DONE"