coollabsio/coolify · error · Exception

No public IP address available. Enable at least one of IPv4

Error message

No public IP address available. Enable at least one of IPv4 or IPv6.

What it means

After creating a server via the Hetzner API, HetznerController picks a public IP: IPv4 only when the request set enable_ipv4 and Hetzner returned public_net.ipv4.ip, else IPv6 when enable_ipv6 and an IPv6 was returned. It throws when neither condition holds — both flags false, or the enabled address family has no IP in the Hetzner response (primary-IP allocation failed or quota exhausted, private-network-only server).

Source

Thrown at app/Http/Controllers/Api/HetznerController.php:938

            // Add cloud-init script if provided
            if (! empty($request->cloud_init_script)) {
                $params['user_data'] = $request->cloud_init_script;
            }

            // Create server on Hetzner
            $hetznerServer = $hetznerService->createServer($params);

            // Determine IP address to use (prefer IPv4, fallback to IPv6)
            $ipAddress = null;
            if ($request->enable_ipv4 && isset($hetznerServer['public_net']['ipv4']['ip'])) {
                $ipAddress = $hetznerServer['public_net']['ipv4']['ip'];
            } elseif ($request->enable_ipv6 && isset($hetznerServer['public_net']['ipv6']['ip'])) {
                $ipAddress = $hetznerServer['public_net']['ipv6']['ip'];
            }

            if (! $ipAddress) {
                throw new \Exception('No public IP address available. Enable at least one of IPv4 or IPv6.');
            }

            // Create server in Coolify database
            $server = Server::create([
                'name' => $normalizedServerName,
                'ip' => $ipAddress,
                'user' => 'root',
                'port' => 22,
                'team_id' => $teamId,
                'private_key_id' => $privateKey->id,
                'cloud_provider_token_id' => $token->id,
                'hetzner_server_id' => $hetznerServer['id'],
            ]);

            $server->proxy->set('status', 'exited');
            $server->proxy->set('type', ProxyTypes::TRAEFIK->value);
            $server->save();

View on GitHub (pinned to 70b9acc424)

Solutions

  1. Send enable_ipv4: true (or enable_ipv6: true) in the request body — at least one family must be enabled.
  2. In the Hetzner console, ensure primary IPs can be created (quota, auto-assign enabled) for the target location.
  3. If the server was created without public net, delete it in Hetzner and recreate with a public IP enabled.

Example fix

// before: request disables both address families
$payload = ['name' => 'app-1', 'enable_ipv4' => false, 'enable_ipv6' => false];

// after: enable at least one family
$payload = ['name' => 'app-1', 'enable_ipv4' => true, 'enable_ipv6' => false];
Defensive patterns

Strategy: validation

Validate before calling

// Validate the request before calling Hetzner provisioning
$validated = $request->validate([
    'name' => ['required', 'string', 'max:255'],
    'enable_ipv4' => ['required_without:enable_ipv6', 'boolean'],
    'enable_ipv6' => ['required_without:enable_ipv4', 'boolean'],
]);

if ($validated['enable_ipv4'] === false && ($validated['enable_ipv6'] ?? false) === false) {
    return response()->json(['message' => 'Enable at least one of IPv4 or IPv6.'], 422);
}

Type guard

function requestsPublicAddress(array $payload): bool
{
    return filter_var($payload['enable_ipv4'] ?? false, FILTER_VALIDATE_BOOL)
        || filter_var($payload['enable_ipv6'] ?? false, FILTER_VALIDATE_BOOL);
}

Prevention

When it happens

Trigger: POST to the Hetzner server-create endpoint with enable_ipv4=false and enable_ipv6=false; enable_ipv6=true but the Hetzner project has no IPv6 primary IP available; Hetzner returns a server object without public_net entries (private-network-only creation).

Common situations: API clients copying a payload and disabling both families to save cost; Hetzner projects where the default primary IPs were deleted and auto-assign is off; regional IPv4 exhaustion in the chosen location.

Related errors


AI-assisted analysis of coollabsio/coolify@70b9acc424 (2026-08-17). Data as JSON: /api/errors/003b7c1b1e34dc4a. Report an issue: GitHub.