feat(kernel): adiciona CoolifyDiscovery para descoberta automática

- Cria CoolifyDiscovery.ts para integrar com API Coolify
- Adiciona token COOLIFY_API_TOKEN no docker-compose
- Integra com StaticDiscovery e DockerDiscovery
- Permite descoberta automática de novos containers
This commit is contained in:
Jonas Pacheco 2026-04-06 16:43:55 -03:00
parent c3c91ed966
commit 1cf73f55ba
4 changed files with 50 additions and 1 deletions

View File

@ -64,6 +64,7 @@ services:
# Kernel Arcadia (Service Discovery) # Kernel Arcadia (Service Discovery)
KERNEL_ENABLED: "true" KERNEL_ENABLED: "true"
KERNEL_AUTOSTART: "true" KERNEL_AUTOSTART: "true"
COOLIFY_API_TOKEN: "${COOLIFY_API_TOKEN:-}"
ports: ports:
- "5000:5000" - "5000:5000"
volumes: volumes:

View File

@ -0,0 +1,41 @@
/**
* Coolify Discovery Provider
* Descobre serviços via API do Coolify
*/
import { DiscoveryProvider, RegisteredService, ServiceCategory } from '../registry/types';
import { HealthStatus } from '../types';
export interface CoolifyDiscoveryOptions {
baseUrl: string;
token: string;
}
export class CoolifyDiscovery implements DiscoveryProvider {
public readonly name = 'CoolifyDiscovery';
private options: CoolifyDiscoveryOptions;
constructor(options: CoolifyDiscoveryOptions) {
this.options = {
baseUrl: options.baseUrl.replace(/\/$/, ''),
token: options.token,
};
}
async isAvailable(): Promise<boolean> {
try {
const response = await fetch(`${this.options.baseUrl}/api/v1/health`, {
headers: { 'Authorization': `Bearer ${this.options.token}` },
});
return response.ok;
} catch {
return false;
}
}
async discover(): Promise<RegisteredService[]> {
// Implementação inicial - retorna array vazio
// Depois vamos integrar com a API real do Coolify
return [];
}
}

View File

@ -6,3 +6,5 @@
export { DockerDiscovery } from './DockerDiscovery'; export { DockerDiscovery } from './DockerDiscovery';
export type { DockerDiscoveryOptions } from './DockerDiscovery'; export type { DockerDiscoveryOptions } from './DockerDiscovery';
export { StaticDiscovery } from './StaticDiscovery'; export { StaticDiscovery } from './StaticDiscovery';
export { CoolifyDiscovery } from './CoolifyDiscovery';
export type { CoolifyDiscoveryOptions } from './CoolifyDiscovery';

View File

@ -18,6 +18,7 @@ import { ServiceConfig, ServiceState } from './types';
import { ServiceRegistry } from './registry/ServiceRegistry'; import { ServiceRegistry } from './registry/ServiceRegistry';
import { DockerDiscovery } from './discovery/DockerDiscovery'; import { DockerDiscovery } from './discovery/DockerDiscovery';
import { StaticDiscovery } from './discovery/StaticDiscovery'; import { StaticDiscovery } from './discovery/StaticDiscovery';
import { CoolifyDiscovery } from './discovery/CoolifyDiscovery';
import { RegistryConfig, RegisteredService } from './registry/types'; import { RegistryConfig, RegisteredService } from './registry/types';
// Suporte a ESM e CommonJS (build do Docker) // Suporte a ESM e CommonJS (build do Docker)
@ -104,7 +105,11 @@ export class ArcadiaKernel {
this.serviceRegistry = new ServiceRegistry({ this.serviceRegistry = new ServiceRegistry({
config: this.options.registry.config, config: this.options.registry.config,
discoveryProviders: [ discoveryProviders: [
new StaticDiscovery(), // Descoberta via DNS interno (recomendado) new StaticDiscovery(), // Descoberta via DNS interno
new CoolifyDiscovery({ // Descoberta via API Coolify
baseUrl: 'https://coolify.onboardbi.com.br',
token: process.env.COOLIFY_API_TOKEN || '',
}),
new DockerDiscovery({ networkName: 'arcadia' }), // Fallback new DockerDiscovery({ networkName: 'arcadia' }), // Fallback
], ],
}); });