From b2a0a5483fe5c4805b55591e59b7c1e482a4a4da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9Cmit=20Tun=C3=A7?= Date: Tue, 31 Mar 2026 00:35:32 +0300 Subject: [PATCH] feat: add Apache server support with configuration templates and IPC integration --- config/httpd.conf.template | 5 +++++ settings.json | 2 ++ src/main/ipc/index.ts | 20 ++++++++++++++++++-- src/main/services/ConfigService.ts | 2 +- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/config/httpd.conf.template b/config/httpd.conf.template index 44b9a90..c0eddb9 100644 --- a/config/httpd.conf.template +++ b/config/httpd.conf.template @@ -12,6 +12,11 @@ LoadModule rewrite_module modules/mod_rewrite.so LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so +# Required for PHP-FPM on Windows to avoid "No input file specified" + + ProxyFCGIBackendType GENERIC + + ServerAdmin admin@localhost ServerName localhost:{{PORT}} diff --git a/settings.json b/settings.json index 6ac90a0..c034736 100644 --- a/settings.json +++ b/settings.json @@ -1,5 +1,7 @@ { "nginxPort": "80", + "apachePort": "8081", + "serverType": "nginx", "phpPort": "9001", "mariaDbPort": "3306", "mariaDbPorts": {}, diff --git a/src/main/ipc/index.ts b/src/main/ipc/index.ts index da6b9a6..facfc9b 100644 --- a/src/main/ipc/index.ts +++ b/src/main/ipc/index.ts @@ -159,6 +159,17 @@ async function rebuildApacheConfig(forceProjects: boolean = false): Promise<{ bi const rootPath = path.join(configService.getBasePath(), 'www') if (!fs.existsSync(rootPath)) fs.mkdirSync(rootPath, { recursive: true }) + const configPath = path.join(configService.getBasePath(), 'generated_configs', 'httpd.conf') + + // Check if manual edit exists + if (fs.existsSync(configPath) && !forceProjects) { + const content = fs.readFileSync(configPath, 'utf8') + if (content.includes('# MANUAL_EDIT')) { + console.log('Skipping Apache config generation (Manual Edit detected)') + return { binPath, apacheDir, configPath } + } + } + // Ensure directories exist const projectsConfDir = path.join(configService.getBasePath(), 'generated_configs', 'projects_apache') if (!fs.existsSync(projectsConfDir)) fs.mkdirSync(projectsConfDir, { recursive: true }) @@ -187,7 +198,7 @@ async function rebuildApacheConfig(forceProjects: boolean = false): Promise<{ bi ? `Include "${projectsConfDir.replace(/\\/g, '/')}/*.conf"` : '' - const configPath = await configService.generateConfig('httpd.conf.template', 'httpd.conf', { + await configService.generateConfig('httpd.conf.template', 'httpd.conf', { PORT: settings.apachePort || '8080', LISTEN_ADDRESS: settings.allowRemoteAccess ? '0.0.0.0' : '127.0.0.1', PHP_PORT: settings.phpPort, @@ -778,7 +789,12 @@ export function registerIpcHandlers(): void { ipcMain.handle('apache:config:save', async (_event, content) => { const configPath = path.join(configService.getBasePath(), 'generated_configs', 'httpd.conf') - fs.writeFileSync(configPath, content) + // Ensure manual edit marker is present + let finalContent = content + if (!finalContent.includes('# MANUAL_EDIT')) { + finalContent = `# MANUAL_EDIT\n${finalContent}` + } + fs.writeFileSync(configPath, finalContent) return await restartApache() }) diff --git a/src/main/services/ConfigService.ts b/src/main/services/ConfigService.ts index f8f382d..cfdc6ea 100644 --- a/src/main/services/ConfigService.ts +++ b/src/main/services/ConfigService.ts @@ -51,7 +51,7 @@ export class ConfigService { for (const [key, value] of Object.entries(variables)) { const escapedValue = value.replace(/\\/g, '/') // Use forward slashes for cross-platform compatibility in configs - content = content.replace(new RegExp(`{{${key}}}`, 'g'), escapedValue) + content = content.replace(new RegExp(`{{${key}}}`, 'g'), () => escapedValue) } fs.writeFileSync(targetPath, content)