config: 빌드된 .exe 에도 .env 가 적용되도록 보강

- electron-builder.yml
  - dist/shared/** 추가 (env.js 등이 패키지에 들어가도록)
  - extraResources 로 빌드 시점 .env 를 resources/.env 에 배포
- loadEnv: 패키징된 Electron 앱이면 process.resourcesPath/.env 를 먼저 시도하고
  없으면 프로젝트 루트 .env 로 폴백
- docs/admin-site.md: .exe 빌드에도 .env 가 따라가는 동작 설명 추가
This commit is contained in:
2026-05-13 03:29:30 +09:00
parent 69ed4ad744
commit 401d72622e
3 changed files with 38 additions and 6 deletions

View File

@@ -4,16 +4,32 @@ import dotenv from 'dotenv'
import { projectRoot } from './paths.js'
/**
* 프로젝트 루트의 `.env` 를 읽어 `process.env` 에 주입.
* `.env` 를 읽어 `process.env` 에 주입.
*
* - 이미 설정된 환경변수는 덮어쓰지 않음(쉘에서 넘긴 값이 우선).
* - 파일이 없으면 조용히 통과 — 운영 환경에서는 시스템 env 만으로도 동작해야 함.
* 탐색 순서(처음 발견된 것만 사용):
* 1. 패키징된 Electron 앱이면 `process.resourcesPath/.env`
* — electron-builder 의 extraResources 로 빌드 시점 `.env` 가 함께 배포됨.
* 2. `<프로젝트 루트>/.env`
* — 개발 실행(npm start / npm run installer*) 및 서버 운영용.
*
* - 이미 설정된 환경변수는 덮어쓰지 않음(쉘/systemd 에서 넘긴 값이 우선).
* - 파일이 없으면 조용히 통과.
* - 서버/설치기/리소스팩설치기 진입점에서 한 번씩 호출.
*/
export function loadEnv(): void {
const envPath = path.join(projectRoot, '.env')
if (!fs.existsSync(envPath)) return
dotenv.config({ path: envPath, override: false, quiet: true })
const candidates: string[] = []
const resourcesPath = (process as NodeJS.Process & { resourcesPath?: string }).resourcesPath
if (typeof resourcesPath === 'string' && resourcesPath.length > 0) {
candidates.push(path.join(resourcesPath, '.env'))
}
candidates.push(path.join(projectRoot, '.env'))
for (const envPath of candidates) {
if (fs.existsSync(envPath)) {
dotenv.config({ path: envPath, override: false, quiet: true })
return
}
}
}
/**