/api/system/info failed with java.lang.NumberFormatException: Error at index on IPv6 only

hi,

using SonarQube community on IPv6 only network with NAT64.
SonarQube version is Community Build v25.6.0.109173 MQR Mode
Deployed as docker container.

If open in my webbrowser https://sonarqube/admin/system:

sonarqube   | 2025.06.03 10:12:59 ERROR web[4bb32d1d-2c9f-4b9c-a03c-06ce72367665][o.s.s.w.WebServiceEngine] Fail to process request http://127.0.0.1:9000/api/system/info
sonarqube   | java.lang.IllegalStateException: Failed to call HTTP server of process COMPUTE_ENGINE
sonarqube   | 	at org.sonar.server.ce.http.CeHttpClientImpl.call(CeHttpClientImpl.java:133)
sonarqube   | 	at org.sonar.server.ce.http.CeHttpClientImpl.retrieveSystemInfo(CeHttpClientImpl.java:60)
sonarqube   | 	at org.sonar.server.platform.StandaloneSystemInfoWriter.write(StandaloneSystemInfoWriter.java:52)
sonarqube   | 	at org.sonar.server.platform.ws.InfoAction.handle(InfoAction.java:64)
sonarqube   | 	at org.sonar.server.ws.WebServiceEngine.execute(WebServiceEngine.java:114)
sonarqube   | 	at org.sonar.server.platform.web.WebServiceFilter.doFilter(WebServiceFilter.java:84)
sonarqube   | 	at org.sonar.server.platform.web.MasterServletFilter$JavaxFilterAdapter.doFilter(MasterServletFilter.java:194)
sonarqube   | 	at org.sonar.server.platform.web.MasterServletFilter$GodFilterChain.doFilter(MasterServletFilter.java:165)
sonarqube   | 	at org.sonar.server.platform.web.MasterServletFilter$HttpFilterChainAdapter.doFilter(MasterServletFilter.java:208)
sonarqube   | 	at org.sonar.server.platform.web.SonarQubeIdeConnectionFilter.doFilter(SonarQubeIdeConnectionFilter.java:62)
sonarqube   | 	at org.sonar.server.platform.web.MasterServletFilter$JavaxFilterAdapter.doFilter(MasterServletFilter.java:194)
sonarqube   | 	at org.sonar.server.platform.web.MasterServletFilter$GodFilterChain.doFilter(MasterServletFilter.java:165)
sonarqube   | 	at org.sonar.server.platform.web.MasterServletFilter.doFilter(MasterServletFilter.java:126)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
sonarqube   | 	at org.sonar.server.platform.web.UserSessionFilter.doFilter(UserSessionFilter.java:83)
sonarqube   | 	at org.sonar.server.platform.web.UserSessionFilter.doFilter(UserSessionFilter.java:70)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
sonarqube   | 	at org.sonar.server.platform.web.CspFilter.doFilter(CspFilter.java:67)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
sonarqube   | 	at org.sonar.server.platform.web.CacheControlFilter.doFilter(CacheControlFilter.java:76)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
sonarqube   | 	at org.sonar.server.platform.web.SecurityServletFilter.doHttpFilter(SecurityServletFilter.java:60)
sonarqube   | 	at org.sonar.server.platform.web.SecurityServletFilter.doFilter(SecurityServletFilter.java:47)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
sonarqube   | 	at org.sonar.server.platform.web.RedirectFilter.doFilter(RedirectFilter.java:56)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
sonarqube   | 	at org.sonar.server.platform.web.EndpointPathFilter.doFilter(EndpointPathFilter.java:47)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
sonarqube   | 	at org.sonar.server.platform.web.RequestIdFilter.doFilter(RequestIdFilter.java:66)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
sonarqube   | 	at org.sonar.server.platform.web.RootFilter.doFilter(RootFilter.java:65)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
sonarqube   | 	at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:115)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
sonarqube   | 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
sonarqube   | 	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
sonarqube   | 	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
sonarqube   | 	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)
sonarqube   | 	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
sonarqube   | 	at ch.qos.logback.access.tomcat.LogbackValve.invoke(LogbackValve.java:268)
sonarqube   | 	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
sonarqube   | 	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
sonarqube   | 	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
sonarqube   | 	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)
sonarqube   | 	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
sonarqube   | 	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905)
sonarqube   | 	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)
sonarqube   | 	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
sonarqube   | 	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)
sonarqube   | 	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
sonarqube   | 	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
sonarqube   | 	at java.base/java.lang.Thread.run(Unknown Source)
sonarqube   | Caused by: java.net.MalformedURLException: Error at index 1 in: "0:0:0:0:0:0:1:37085"
sonarqube   | 	at java.base/java.net.URL.<init>(Unknown Source)
sonarqube   | 	at java.base/java.net.URL.of(Unknown Source)
sonarqube   | 	at java.base/java.net.URI.toURL(Unknown Source)
sonarqube   | 	at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:2892)
sonarqube   | 	at org.sonar.server.ce.http.CeHttpClientImpl$SystemInfoActionClient.call(CeHttpClientImpl.java:78)
sonarqube   | 	at org.sonar.server.ce.http.CeHttpClientImpl$SystemInfoActionClient.call(CeHttpClientImpl.java:63)
sonarqube   | 	at org.sonar.server.ce.http.CeHttpClientImpl.call(CeHttpClientImpl.java:129)
sonarqube   | 	... 60 common frames omitted
sonarqube   | Caused by: java.lang.NumberFormatException: Error at index 1 in: "0:0:0:0:0:0:1:37085"
sonarqube   | 	at java.base/java.lang.NumberFormatException.forCharSequence(Unknown Source)
sonarqube   | 	at java.base/java.lang.Integer.parseInt(Unknown Source)
sonarqube   | 	at java.base/java.net.URLStreamHandler.parseURL(Unknown Source)
sonarqube   | 	... 67 common frames omitted

Looks for me that there is a problem that an IPv6 Adress is given to an http client without square brackets.

compose file:


services:
  sonarqube:
    restart: unless-stopped
    networks:
      - sonarnet
    image: sonarqube:community
    hostname: sonarqube
    container_name: sonarqube
    depends_on:
      - db
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
      SONAR_SECURITY_REALM: LDAP
      SONAR_SEARCH_HOST: "0.0.0.0"
      SONAR_ES_BOOTSTRAP_CHECKS_DISABLE: "true"
      SONAR_SEARCH_JAVAADDITIONALOPTS: "-Djava.net.preferIPv4Stack=false -Djava.net.preferIPv6Addresses=true -Xmx1024m -Xms1024m"
      SONAR_WEB_JAVAADDITIONALOPTS: "-Djava.net.preferIPv4Stack=false -Djava.net.preferIPv6Addresses=true -Xmx1024m -Xms512m"
      SONAR_CE_JAVAOPTS: "-Djava.net.preferIPv4Stack=false -Djava.net.preferIPv6Addresses=true -Xmx1024m -Xms512m"
      SONAR_SECURITY_SAVEPASSWORD: "false"
      SONAR_AUTHENTICATOR_CREATEUSERS: "true"
      SONAR_AUTHENTICATOR_DOWNCASE: "false"
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
      - /etc/pki/ca-trust/extracted/java/cacerts:/opt/java/openjdk/lib/security/cacerts
    ports:
      - "9000:9000"
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
  db:
    image: postgres:15
    restart: unless-stopped
    networks:
      - sonarnet
    hostname: postgresql
    container_name: postgresql
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
      POSTGRES_DB: sonar
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data

networks:
  sonarnet:
    driver: bridge
    enable_ipv6: true
    ipam:
      driver: default
      config:
      - subnet:  64:ff9b:100::/64
        gateway: 64:ff9b:100::1

volumes:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  postgresql:
  postgresql_data:

Docker config:


{
  "ip6tables": true,
  "experimental": true,
  "ipv6": true,
  "fixed-cidr-v6": "64:ff9b:99::/64"
}

In front nginx as reverse proxy:

        location / {
            expires                -1;
            add_header             Cache-Control "public";
            proxy_hide_header      "X-Powered-By";
            proxy_pass              http://127.0.0.1:9000;
            server_name_in_redirect off;
            proxy_http_version      1.1;
            keepalive_requests      500;
            proxy_ignore_client_abort on;
            proxy_redirect http:// https://;
            proxy_connect_timeout   90;
            proxy_send_timeout      90;
            proxy_read_timeout      90;
            proxy_buffering         on;
            proxy_buffer_size       32k;
            proxy_buffers           32 32k;
            proxy_busy_buffers_size 64k;
            proxy_set_header       X-Real-IP $remote_addr;
            proxy_set_header       X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_set_header       X-Forwarded-Port 443;
            proxy_set_header       X-Forwarded-Proto https;
            proxy_cache            STATIC;
            proxy_cache_convert_head off;
            proxy_cache_key        $server_name$request_uri$request_method;
            }
1 Like

Hello @rherold thanks a lot for participating in the community.

very interesting and thanks a lot for the detailed logs, nonetheless i cannot reproduce the issue.

In my case the auto NAT of docker network works well if i directly access 127.0.0.1:9000 or if i use a docker jwilder proxy.

Do you confirm that a direct curl 127.0.0.1:9000 from the machine works as expected ?

My suspicion here is on the proxy_pass 127.0.0.1 which does not indicate IPv6 usage, could you replace it with [::] ?

Also could you clarify your setup on the reverse-proxy, i guess it is not installed with docker ?

in my case i use a docker jwilder proxy with :

error_log /var/log/nginx/error.log debug;

events {
    worker_connections 1024;
}

http {
    upstream backend {
        server [2001:db8:3::91]:9000;
    }

    server {
        listen 80;
        listen [::]:80;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

and if i IPv4 curl ‘http://127.0.0.1:8080

i do see in my logs:

proxy-1  | 192.168.3.1 - - [24/Jun/2025:14:41:32 +0000] "GET / HTTP/1.1" 200 1698 "-" "curl/8.7.1"
proxy-1  | 2025/06/24 14:41:32 [info] 29#29: *15 client 192.168.3.1 closed keepalive connection

And from sonarqube:

2001:db8:3:0:0:0:0:3 - - [24/Jun/2025:14:41:32 +0000] "GET / HTTP/1.0" 200 - "-" "curl/8.7.1" "b0691181-4042-4a2a-b92c-dc6bf8edc140" 8

This indicates an IPv4 request to nginx, which then send IPv6 to sonarqube.

Happy to debug this further,

Regards,

Jérémy.