nginx_setup
Configure Nginx to set up domain, reverse proxy, and SSL certificates for backend applications. Simplify server management with automated setup on the VPS Initialize platform.
Instructions
Configure Nginx with domain, reverse proxy, and SSL
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain name | |
| port | Yes | Backend port to proxy to | |
| ssl | No | Enable SSL with Certbot |
Implementation Reference
- src/tools/nginx-manager.ts:18-67 (handler)Core handler function that implements the nginx_setup tool logic: creates config, tests/reloads nginx, sets up SSL if requested, configures firewall.async setupNginx(config: NginxConfig): Promise<NginxResult> { try { logger.info('Setting up Nginx configuration', { domain: config.domain, port: config.port }); // Create Nginx configuration const nginxConfigResult = await this.createNginxConfig(config); if (!nginxConfigResult.success) { return nginxConfigResult; } // Test and reload Nginx const testResult = await this.sshService.executeCommand('nginx -t'); if (!testResult.success) { return { success: false, message: `Nginx configuration test failed: ${testResult.stderr}`, }; } const reloadResult = await this.sshService.executeCommand('systemctl reload nginx'); if (!reloadResult.success) { return { success: false, message: `Failed to reload Nginx: ${reloadResult.stderr}`, }; } // Setup SSL if requested if (config.ssl) { const sslResult = await this.setupSSL(config.domain); if (!sslResult.success) { return sslResult; } } // Configure firewall await this.configureFirewall(); return { success: true, message: `Nginx configured successfully for ${config.domain}${config.ssl ? ' with SSL' : ''}`, }; } catch (error) { logger.error('Nginx setup failed', { error, config }); return { success: false, message: `Nginx setup failed: ${error instanceof Error ? error.message : 'Unknown error'}`, }; } }
- src/tools/nginx-manager.ts:112-163 (helper)Helper function that generates the complete Nginx server block configuration as a template string.private generateNginxConfig(config: NginxConfig): string { return `server { listen 80; server_name ${config.domain} www.${config.domain}; # Security headers add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always; # Gzip compression gzip on; gzip_vary on; gzip_min_length 1024; gzip_proxied expired no-cache no-store private must-revalidate auth; gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json; location / { proxy_pass http://127.0.0.1:${config.port}; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_cache_bypass $http_upgrade; proxy_read_timeout 86400; } # Deny access to hidden files location ~ /\\. { deny all; } # Optimize static file serving location ~* \\.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; try_files $uri @proxy; } location @proxy { proxy_pass http://127.0.0.1:${config.port}; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }`;
- src/services/mcp-server.ts:246-266 (handler)MCP server handler that validates input using Zod schema and delegates to NginxManager.setupNginx.private async handleNginxSetup( args: unknown ): Promise<{ content: Array<{ type: 'text'; text: string }> }> { if (!this.nginxManager) { throw new Error('SSH connection not established. Please connect first.'); } const config = NginxConfigSchema.parse(args); const result = await this.nginxManager.setupNginx(config); return { content: [ { type: 'text', text: result.success ? `Nginx configured successfully for ${config.domain}` : `Nginx setup failed: ${result.message}`, }, ], }; }
- src/services/mcp-server.ts:109-121 (registration)Tool registration in the MCP server's listTools handler, defining name, description, and input schema.{ name: 'nginx_setup', description: 'Configure Nginx with domain, reverse proxy, and SSL', inputSchema: { type: 'object', properties: { domain: { type: 'string', description: 'Domain name' }, port: { type: 'number', description: 'Backend port to proxy to' }, ssl: { type: 'boolean', description: 'Enable SSL with Certbot' }, }, required: ['domain', 'port'], }, },
- src/services/mcp-server.ts:34-38 (schema)Zod schema used for input validation in the nginx_setup handler.const NginxConfigSchema = z.object({ domain: z.string().describe('Domain name for Nginx configuration'), port: z.number().describe('Backend port to proxy to'), ssl: z.boolean().optional().default(true).describe('Enable SSL with Certbot'), });