Port all IPC handlers to HTTP endpoints so the UI and LLM use the same API. Adds routes/projects.js (scan, compare, init), routes/servers.js (CRUD, containers, logs), routes/docker.js (build, deploy, pull, vscode-diff). Enhanced ssh.js with full SSHService class (SFTP upload/download). Updated renderer api.js to use fetch instead of window.api IPC. Added concurrently for npm run dev (API + Vite + Electron). OpenAPI spec now covers all 24 endpoints. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
82 lines
2.3 KiB
JavaScript
82 lines
2.3 KiB
JavaScript
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
import { join, dirname } from 'path';
|
|
import { fileURLToPath } from 'url';
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
const PROJECT_ROOT = join(__dirname, '..', '..');
|
|
|
|
// Shared Coolify config from gitea.repo.management
|
|
const COOLIFY_CONFIG_PATH = join(PROJECT_ROOT, '..', 'gitea.repo.management', 'config.json');
|
|
|
|
// Local deployment config
|
|
const DEPLOY_CONFIG_PATH = join(PROJECT_ROOT, 'deployment-config.json');
|
|
|
|
// SSH credentials from app/.env
|
|
const ENV_PATH = join(PROJECT_ROOT, 'app', '.env');
|
|
|
|
let _coolifyCache = null;
|
|
let _deployCache = null;
|
|
|
|
export function loadConfig() {
|
|
if (_coolifyCache) return _coolifyCache;
|
|
if (!existsSync(COOLIFY_CONFIG_PATH)) {
|
|
throw new Error(`Coolify config not found at ${COOLIFY_CONFIG_PATH}`);
|
|
}
|
|
_coolifyCache = JSON.parse(readFileSync(COOLIFY_CONFIG_PATH, 'utf8'));
|
|
return _coolifyCache;
|
|
}
|
|
|
|
export function reloadConfig() {
|
|
_coolifyCache = null;
|
|
return loadConfig();
|
|
}
|
|
|
|
export function loadDeployConfig() {
|
|
if (_deployCache) return _deployCache;
|
|
if (!existsSync(DEPLOY_CONFIG_PATH)) {
|
|
_deployCache = { servers: [], projectsRoot: 'C:\\.bucket\\repos.gitea', projects: {} };
|
|
return _deployCache;
|
|
}
|
|
_deployCache = JSON.parse(readFileSync(DEPLOY_CONFIG_PATH, 'utf8'));
|
|
return _deployCache;
|
|
}
|
|
|
|
export function saveDeployConfig(config) {
|
|
writeFileSync(DEPLOY_CONFIG_PATH, JSON.stringify(config, null, 2));
|
|
_deployCache = config;
|
|
}
|
|
|
|
export function reloadDeployConfig() {
|
|
_deployCache = null;
|
|
return loadDeployConfig();
|
|
}
|
|
|
|
export function loadEnv() {
|
|
if (!existsSync(ENV_PATH)) return {};
|
|
const content = readFileSync(ENV_PATH, 'utf8');
|
|
const env = {};
|
|
for (const line of content.split('\n')) {
|
|
if (line.startsWith('#') || !line.includes('=')) continue;
|
|
const [key, ...valueParts] = line.split('=');
|
|
if (key && valueParts.length > 0) {
|
|
env[key.trim()] = valueParts.join('=').trim();
|
|
}
|
|
}
|
|
return env;
|
|
}
|
|
|
|
export function getProjectsRoot() {
|
|
return loadDeployConfig().projectsRoot || 'C:\\.bucket\\repos.gitea';
|
|
}
|
|
|
|
export function getServerSshConfig(server) {
|
|
const env = loadEnv();
|
|
return {
|
|
host: server.host,
|
|
port: 22,
|
|
username: env.SSH_USERNAME || server.username,
|
|
password: env.SSH_PASSWORD || server.password,
|
|
useSudo: server.useSudo || false,
|
|
};
|
|
}
|