{"record":{"id":"003b7c1b1e34dc4a","repo":"coollabsio/coolify","slug":"no-public-ip-address-available-enable-at-least-on","errorCode":null,"errorMessage":"No public IP address available. Enable at least one of IPv4 or IPv6.","messagePattern":"No public IP address available\\. Enable at least one of IPv4 or IPv6\\.","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"app/Http/Controllers/Api/HetznerController.php","lineNumber":938,"sourceCode":"\n            // Add cloud-init script if provided\n            if (! empty($request->cloud_init_script)) {\n                $params['user_data'] = $request->cloud_init_script;\n            }\n\n            // Create server on Hetzner\n            $hetznerServer = $hetznerService->createServer($params);\n\n            // Determine IP address to use (prefer IPv4, fallback to IPv6)\n            $ipAddress = null;\n            if ($request->enable_ipv4 && isset($hetznerServer['public_net']['ipv4']['ip'])) {\n                $ipAddress = $hetznerServer['public_net']['ipv4']['ip'];\n            } elseif ($request->enable_ipv6 && isset($hetznerServer['public_net']['ipv6']['ip'])) {\n                $ipAddress = $hetznerServer['public_net']['ipv6']['ip'];\n            }\n\n            if (! $ipAddress) {\n                throw new \\Exception('No public IP address available. Enable at least one of IPv4 or IPv6.');\n            }\n\n            // Create server in Coolify database\n            $server = Server::create([\n                'name' => $normalizedServerName,\n                'ip' => $ipAddress,\n                'user' => 'root',\n                'port' => 22,\n                'team_id' => $teamId,\n                'private_key_id' => $privateKey->id,\n                'cloud_provider_token_id' => $token->id,\n                'hetzner_server_id' => $hetznerServer['id'],\n            ]);\n\n            $server->proxy->set('status', 'exited');\n            $server->proxy->set('type', ProxyTypes::TRAEFIK->value);\n            $server->save();\n","sourceCodeStart":920,"sourceCodeEnd":956,"githubUrl":"https://github.com/coollabsio/coolify/blob/70b9acc42467278373e00de77abb40684e25b395/app/Http/Controllers/Api/HetznerController.php#L920-L956","documentation":"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).","triggerScenarios":"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).","commonSituations":"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.","solutions":["Send enable_ipv4: true (or enable_ipv6: true) in the request body — at least one family must be enabled.","In the Hetzner console, ensure primary IPs can be created (quota, auto-assign enabled) for the target location.","If the server was created without public net, delete it in Hetzner and recreate with a public IP enabled."],"exampleFix":"// before: request disables both address families\n$payload = ['name' => 'app-1', 'enable_ipv4' => false, 'enable_ipv6' => false];\n\n// after: enable at least one family\n$payload = ['name' => 'app-1', 'enable_ipv4' => true, 'enable_ipv6' => false];","handlingStrategy":"validation","validationCode":"// Validate the request before calling Hetzner provisioning\n$validated = $request->validate([\n    'name' => ['required', 'string', 'max:255'],\n    'enable_ipv4' => ['required_without:enable_ipv6', 'boolean'],\n    'enable_ipv6' => ['required_without:enable_ipv4', 'boolean'],\n]);\n\nif ($validated['enable_ipv4'] === false && ($validated['enable_ipv6'] ?? false) === false) {\n    return response()->json(['message' => 'Enable at least one of IPv4 or IPv6.'], 422);\n}","typeGuard":"function requestsPublicAddress(array $payload): bool\n{\n    return filter_var($payload['enable_ipv4'] ?? false, FILTER_VALIDATE_BOOL)\n        || filter_var($payload['enable_ipv6'] ?? false, FILTER_VALIDATE_BOOL);\n}","tryCatchPattern":null,"preventionTips":["Default enable_ipv4 to true in client payloads instead of sending false explicitly.","Before creating, check the Hetzner project can allocate primary IPs for the chosen location.","On failure, clean up the half-created Hetzner server so quota is not leaked."],"tags":["hetzner","cloud-provider","server-provisioning","ipv4","ipv6","api"],"backgroundTag":"no-public-ip-assigned","analyzedSha":"70b9acc42467278373e00de77abb40684e25b395","analyzedAt":"2026-08-17T01:41:01.313Z","schemaVersion":2},"datasetVersion":"2026-08-17T04:17:16.089Z"}