HAL 제어 평면(릴리스·서버·Agent·작업·모듈 배포·운영자 계정·긴급 복구·재해복구·공개 상태), Node Agent, 배포 스크립트·유닛·nginx 템플릿, 릴리스 도구, 포털 HAL 클라이언트 (§28·§29·§32~§34)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
403d0fb845
commit
6b5a014041
@@ -0,0 +1,32 @@
|
||||
/**
|
||||
* agent/config.mjs — Node Agent 설정과 경로.
|
||||
* 데이터 디렉터리(기본 /srv/ariweb/agent/data)의 agent.json 에 id·HAL 주소·역할·사이트(외부 모드)를 두고, 비밀은 같은 디렉터리의 보관소(lib/vault)에 'agent-secret' 로 둔다.
|
||||
* 실제 시스템 경로는 환경 변수로 바꿀 수 있어 테스트는 임시 디렉터리에서 돈다.
|
||||
*/
|
||||
import { readFileSync, writeFileSync, existsSync, mkdirSync, renameSync } from 'node:fs';
|
||||
import { join } from 'node:path';
|
||||
import { openVault } from '../lib/vault.mjs';
|
||||
|
||||
export function loadAgentConfig(env = process.env) {
|
||||
const dataDir = env.ARIWEB_AGENT_DATA || '/srv/ariweb/agent/data'; mkdirSync(dataDir, { recursive: true, mode: 0o700 });
|
||||
const file = join(dataDir, 'agent.json'); let saved = {}; try { saved = existsSync(file) ? JSON.parse(readFileSync(file, 'utf8')) : {}; } catch (_) {}
|
||||
const cfg = {
|
||||
dataDir, file, ...saved,
|
||||
roots: {
|
||||
sites: env.ARIWEB_SITES_ROOT || '/var/www/ariweb-sites', // 사이트 파일: <sites>/<siteId>/releases/<n>, current, data(uploads)
|
||||
srv: env.ARIWEB_SRV_ROOT || '/srv/ariweb', // 모듈 설치: <srv>/<module>/releases/<ver>, current
|
||||
nginx: env.ARIWEB_NGINX_DIR || '/etc/nginx', // sites-available/sites-enabled
|
||||
backups: env.ARIWEB_BACKUP_ROOT || '/srv/ariweb/backups', // 백업 저장소
|
||||
logs: env.ARIWEB_LOG_DIR || '/var/log/nginx', // 사이트별 접속 로그 aw-<siteId>.access.log
|
||||
acme: env.ARIWEB_ACME_WEBROOT || '/var/www/letsencrypt', // certbot webroot
|
||||
letsencrypt: env.ARIWEB_LE_DIR || '/etc/letsencrypt/live',
|
||||
wildcardCert: env.ARIWEB_WILDCARD_CERT || '', // 플랫폼 와일드카드 인증서 디렉터리(예: /etc/letsencrypt/live/wh-wild-ariweb.net)
|
||||
platformDomain: env.ARIWEB_PLATFORM_DOMAIN || 'ariweb.net',
|
||||
maintPage: env.ARIWEB_MAINT_PAGE || '/var/www/ariweb-maint.html',
|
||||
},
|
||||
heartbeatMs: Number(env.ARIWEB_AGENT_HEARTBEAT_MS || 30000),
|
||||
save(patch) { Object.assign(cfg, patch); const out = {}; for (const k of ['id', 'halUrl', 'serverId', 'kind', 'siteId', 'groupId', 'registeredAt', 'label']) if (cfg[k] !== undefined) out[k] = cfg[k]; const tmp = file + '.tmp'; writeFileSync(tmp, JSON.stringify(out, null, 1), { mode: 0o600 }); renameSync(tmp, file); },
|
||||
vault: () => openVault(dataDir),
|
||||
};
|
||||
return cfg;
|
||||
}
|
||||
Reference in New Issue
Block a user