Files
ai-code-app/etc/servers/work-server/src/config/env.ts

106 lines
4.1 KiB
TypeScript

import path from 'node:path';
import dotenv from 'dotenv';
import { z } from 'zod';
dotenv.config({ override: true, quiet: true });
const envSchema = z.object({
PORT: z.coerce.number().default(3100),
APP_TIME_ZONE: z.string().default('Asia/Seoul'),
DB_TIME_ZONE: z.string().default('Asia/Seoul'),
DB_CLIENT: z.string().default('pg'),
DB_HOST: z.string().default('localhost'),
DB_PORT: z.coerce.number().default(5432),
DB_NAME: z.string().default('work_db'),
DB_USER: z.string().default('work_user'),
DB_PASSWORD: z.string().default('change-me'),
DB_SSL: z
.string()
.default('false')
.transform((value) => value === 'true'),
PLAN_WORKER_ENABLED: z
.string()
.default('true')
.transform((value) => value === 'true'),
PLAN_WORKER_INTERVAL_MS: z.coerce.number().default(10000),
PLAN_WORKER_ID: z.string().optional(),
PLAN_GIT_REPO_PATH: z.string().default('/workspace/repo'),
PLAN_MAIN_PROJECT_REPO_PATH: z.string().optional(),
PLAN_RELEASE_BRANCH: z.string().default('release'),
PLAN_MAIN_BRANCH: z.string().default('main'),
PLAN_GIT_USER_NAME: z.string().default('how2ice'),
PLAN_GIT_USER_EMAIL: z.string().default('how2ice@naver.com'),
PLAN_CODEX_RUNNER_PATH: z.string().default('/workspace/repo-scripts/run-plan-codex-once.mjs'),
PLAN_CODEX_ENABLED: z
.string()
.default('true')
.transform((value) => value === 'true'),
PLAN_LOCAL_MAIN_MODE: z
.string()
.default('true')
.transform((value) => value === 'true'),
PLAN_CODEX_BIN: z.string().default('codex'),
PLAN_CODEX_TEMPLATE_HOME: z.string().optional(),
PLAN_PREVIEW_BASE_URL: z.string().optional(),
PLAN_PREVIEW_URL_TEMPLATE: z.string().optional(),
IOS_NOTIFICATION_ENABLED: z
.string()
.default('false')
.transform((value) => value === 'true'),
WEB_PUSH_ENABLED: z
.string()
.default('false')
.transform((value) => value === 'true'),
WEB_PUSH_VAPID_PUBLIC_KEY: z.string().optional(),
WEB_PUSH_VAPID_PRIVATE_KEY: z.string().optional(),
WEB_PUSH_SUBJECT: z.string().default('mailto:how2ice@naver.com'),
APNS_KEY_ID: z.string().optional(),
APNS_TEAM_ID: z.string().optional(),
APNS_BUNDLE_ID: z.string().optional(),
APNS_PRIVATE_KEY: z.string().optional(),
APNS_PRIVATE_KEY_PATH: z.string().optional(),
APNS_PRODUCTION: z
.string()
.default('false')
.transform((value) => value === 'true'),
SERVER_COMMAND_ACCESS_TOKEN: z.string().default('usr_7f3a9c2d8e1b4a6f'),
SERVER_COMMAND_API_BASE_URL: z.string().optional(),
SERVER_COMMAND_API_ACCESS_TOKEN: z.string().optional(),
SERVER_COMMAND_API_RESTART_PATH_TEMPLATE: z.string().default('/api/server-commands/{key}/actions/restart'),
SERVER_COMMAND_PROJECT_ROOT: z.string().default(path.resolve(process.cwd(), '../../..')),
SERVER_COMMAND_MAIN_PROJECT_ROOT: z.string().default('/workspace/main-project'),
SERVER_COMMAND_TEST_URL: z.string().default('https://test.sm-home.cloud/'),
SERVER_COMMAND_REL_URL: z.string().default('https://rel.sm-home.cloud/'),
SERVER_COMMAND_PROD_URL: z.string().default('https://sm-home.cloud/'),
SERVER_COMMAND_WORK_SERVER_URL: z.string().default('http://127.0.0.1:3100/health'),
SERVER_COMMAND_RUNNER_URL: z.string().default('http://host.docker.internal:3211/health'),
SERVER_COMMAND_RUNNER_ACCESS_TOKEN: z.string().default('local-server-command-runner'),
SERVER_COMMAND_RUNNER_HEARTBEAT_FILE: z.string().optional(),
SERVER_COMMAND_TEST_SERVICE: z.string().default('app'),
SERVER_COMMAND_REL_SERVICE: z.string().default('release-app'),
SERVER_COMMAND_PROD_SERVICE: z.string().default('prod-app'),
SERVER_COMMAND_WORK_SERVER_SERVICE: z.string().default('work-server'),
});
function parseEnv() {
dotenv.config({ override: true, quiet: true });
const parsedEnv = envSchema.parse(process.env);
return {
...parsedEnv,
PLAN_MAIN_PROJECT_REPO_PATH: parsedEnv.PLAN_MAIN_PROJECT_REPO_PATH ?? parsedEnv.PLAN_GIT_REPO_PATH,
};
}
export function getEnv() {
const parsedEnv = parseEnv();
if (!process.env.TZ?.trim()) {
process.env.TZ = parsedEnv.APP_TIME_ZONE;
}
return parsedEnv;
}
export const env = getEnv();