fix: 修复 Docker 部署 API 地址与数据库连接问题
This commit is contained in:
@@ -106,9 +106,36 @@ function parseEnv(text) {
|
||||
return result
|
||||
}
|
||||
|
||||
const envOverridePrefixes = ['APP_', 'WEB_', 'SERVER_', 'POSTGRES_', 'VITE_', 'LOG_']
|
||||
const envOverrideKeys = new Set([
|
||||
'API_V1_PREFIX',
|
||||
'SETUP_COMPLETED',
|
||||
'COMPANY_NAME',
|
||||
'COMPANY_CODE',
|
||||
'ADMIN_EMAIL',
|
||||
'DATABASE_URL',
|
||||
'SQLALCHEMY_ECHO',
|
||||
'REDIS_URL',
|
||||
'CORS_ORIGINS'
|
||||
])
|
||||
|
||||
function shouldOverlayEnvKey(key) {
|
||||
return envOverrideKeys.has(key) || envOverridePrefixes.some((prefix) => key.startsWith(prefix))
|
||||
}
|
||||
|
||||
function readEnvState() {
|
||||
ensureEnvFile()
|
||||
return parseEnv(fs.readFileSync(envFile, 'utf8'))
|
||||
const state = parseEnv(fs.readFileSync(envFile, 'utf8'))
|
||||
|
||||
for (const [key, value] of Object.entries(process.env)) {
|
||||
if (!shouldOverlayEnvKey(key) || value == null || value === '') {
|
||||
continue
|
||||
}
|
||||
|
||||
state[key] = String(value)
|
||||
}
|
||||
|
||||
return state
|
||||
}
|
||||
|
||||
function readAdminSecret() {
|
||||
@@ -334,9 +361,7 @@ function buildCorsOrigins(payload) {
|
||||
|
||||
function buildApiBaseUrl(payload, currentEnv) {
|
||||
const apiPrefix = currentEnv.API_V1_PREFIX || '/api/v1'
|
||||
const host = resolveBrowserApiHost(payload.server_host, payload.web_host)
|
||||
const port = String(payload.server_port || '').trim()
|
||||
return `http://${host}:${port}${apiPrefix}`
|
||||
return apiPrefix
|
||||
}
|
||||
|
||||
function buildServerHealthUrl(env) {
|
||||
@@ -586,9 +611,21 @@ async function loadPgClient() {
|
||||
|
||||
async function testDatabaseConnection(payload) {
|
||||
const Client = await loadPgClient()
|
||||
const requestedHost = String(payload.postgres_host || '').trim()
|
||||
const requestedHostNormalized = normalizeLoopbackHost(requestedHost)
|
||||
const dockerPostgresHost = String(process.env.POSTGRES_HOST || '').trim()
|
||||
const containerPostgresPort = Number(process.env.POSTGRES_PORT || 5432)
|
||||
const shouldUseDockerPostgres =
|
||||
dockerPostgresHost === 'postgres' &&
|
||||
['127.0.0.1', 'localhost', '0.0.0.0', '::1', '::'].includes(requestedHostNormalized)
|
||||
const effectiveHost =
|
||||
shouldUseDockerPostgres ? 'postgres' : requestedHost
|
||||
const effectivePort =
|
||||
shouldUseDockerPostgres ? containerPostgresPort : Number(payload.postgres_port)
|
||||
|
||||
const client = new Client({
|
||||
host: String(payload.postgres_host || '').trim(),
|
||||
port: Number(payload.postgres_port),
|
||||
host: effectiveHost,
|
||||
port: effectivePort,
|
||||
database: String(payload.postgres_db || '').trim(),
|
||||
user: String(payload.postgres_user || '').trim(),
|
||||
password: String(payload.postgres_password || ''),
|
||||
@@ -738,9 +775,21 @@ async function startBackendAndWait() {
|
||||
|
||||
const stdout = fs.openSync(logFile, 'a')
|
||||
const stderr = fs.openSync(logFile, 'a')
|
||||
const freshEnv = { ...process.env }
|
||||
const envFileContent = fs.readFileSync(envFile, 'utf-8')
|
||||
for (const line of envFileContent.split('\n')) {
|
||||
const trimmed = line.trim()
|
||||
if (!trimmed || trimmed.startsWith('#')) continue
|
||||
const eqIdx = trimmed.indexOf('=')
|
||||
if (eqIdx < 0) continue
|
||||
const key = trimmed.slice(0, eqIdx).trim()
|
||||
const val = trimmed.slice(eqIdx + 1).trim().replace(/^['"]|['"]$/g, '')
|
||||
freshEnv[key] = val
|
||||
}
|
||||
const child = spawn('bash', [path.join(rootDir, 'start.sh'), 'server'], {
|
||||
cwd: rootDir,
|
||||
detached: true,
|
||||
env: freshEnv,
|
||||
stdio: ['ignore', stdout, stderr]
|
||||
})
|
||||
|
||||
@@ -980,6 +1029,12 @@ export default defineConfig({
|
||||
envExampleFile,
|
||||
path.join(rootDir, 'server', 'logs', '**')
|
||||
]
|
||||
},
|
||||
proxy: {
|
||||
'/api': {
|
||||
target: `http://127.0.0.1:${process.env.SERVER_PORT || 8000}`,
|
||||
changeOrigin: true
|
||||
}
|
||||
}
|
||||
},
|
||||
plugins: [vue(), localSetupPlugin()]
|
||||
|
||||
Reference in New Issue
Block a user