fix: 修复 Docker 部署 API 地址与数据库连接问题

This commit is contained in:
2026-05-09 09:29:34 +08:00
parent 86568660a4
commit c2315f68dc
15 changed files with 665 additions and 119 deletions

View File

@@ -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()]