Skip to content

The workbench failed to connect to the server (Error: WebSocket close with status code 1006) #4443

Closed

Description

@isolume

OS/Web Information

  • Web Browser: Chromium (brave), although I also tested with Firefox and Edge and got the same result.
  • Local OS: Windows 11
  • Remote OS: Ubuntu
  • Remote Architecture: x86-64
  • code-server --version: 3.12.0

Steps to Reproduce

  1. Ran code-server (i also tried using --proxy-domain to see if I got any different results.) I used nginx to reverse proxy to my domain, I also use Cloudflare.
  2. When I open the domain on my browser, I get
The workbench failed to connect to the server (Error: WebSocket close with status code 1006)

Expected

The server would work normally.

Actual

See error above.

Logs

Logs look normal for the remote server, however browser gives error:

[vscode] failed to initialize VS Code vscode.browserified.js:726:13
    [4]< <domain>/static/b37ff28a0a582aee84a8f961755d0cb40a4081db/usr/lib/code-server/out/browser/pages/vscode.browserified.js:726
    o <domain>/static/b37ff28a0a582aee84a8f961755d0cb40a4081db/usr/lib/code-server/out/browser/pages/vscode.browserified.js:1
    r <domain>/static/b37ff28a0a582aee84a8f961755d0cb40a4081db/usr/lib/code-server/out/browser/pages/vscode.browserified.js:1
    <anonymous> <domain>/static/b37ff28a0a582aee84a8f961755d0cb40a4081db/usr/lib/code-server/out/browser/pages/vscode.browserified.js:1

(I replaced my domain with for privacy reasons.)

Error: [vscode] Could not set body background to theme background color. Could not find colorThemeData in localStorage.
    setBodyBackgroundToThemeBackgroundColor <domain>/static/b37ff28a0a582aee84a8f961755d0cb40a4081db/usr/lib/code-server/out/browser/pages/vscode.browserified.js:668
    main <domain>/static/b37ff28a0a582aee84a8f961755d0cb40a4081db/usr/lib/code-server/out/browser/pages/vscode.browserified.js:719
    [4]< <domain>/static/b37ff28a0a582aee84a8f961755d0cb40a4081db/usr/lib/code-server/out/browser/pages/vscode.browserified.js:723
    o <domain>/static/b37ff28a0a582aee84a8f961755d0cb40a4081db/usr/lib/code-server/out/browser/pages/vscode.browserified.js:1
    r <domain>/static/b37ff28a0a582aee84a8f961755d0cb40a4081db/usr/lib/code-server/out/browser/pages/vscode.browserified.js:1
    <anonymous> <domain>/static/b37ff28a0a582aee84a8f961755d0cb40a4081db/usr/lib/code-server/out/browser/pages/vscode.browserified.js:1
vscode.browserified.js:727:13
    [4]< <domain>/static/b37ff28a0a582aee84a8f961755d0cb40a4081db/usr/lib/code-server/out/browser/pages/vscode.browserified.js:727
    o <domain>/static/b37ff28a0a582aee84a8f961755d0cb40a4081db/usr/lib/code-server/out/browser/pages/vscode.browserified.js:1
    r <domain>/static/b37ff28a0a582aee84a8f961755d0cb40a4081db/usr/lib/code-server/out/browser/pages/vscode.browserified.js:1
    <anonymous> <domain>/static/b37ff28a0a582aee84a8f961755d0cb40a4081db/usr/lib/code-server/out/browser/pages/vscode.browserified.js:1

Screenshot

image

Notes

This issue can be reproduced in VS Code: No

Activity

  1. woshilaiba commented on Nov 4, 2021

    @woshilaiba

    i got this too. i ran it in docker.
    i found there must be lines below in the nginx.conf to make it work
    location / {
    proxy_pass http://codeserver.xxx.xxx:8443/;
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection upgrade;
    proxy_set_header Accept-Encoding gzip;
    }
    this is from
    https://github.com/cdr/code-server/blob/main/docs/guide.md#using-lets-encrypt-with-nginx

  2. ChrisKimZHT commented on Nov 4, 2021

    @ChrisKimZHT

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection upgrade;
    proxy_set_header Accept-Encoding gzip;

  3. isolume commented on Nov 4, 2021

    @isolume
    Author

    proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Accept-Encoding gzip;

    Thanks, that seemed to work.

  4. bobbywaz commented on Nov 13, 2021

    @bobbywaz

    Any idea which version broke this? I can't get it to work with Nginx-Proxy-Manager so I'll just downgrade until code-server gets it's sh*t together.

  5. jsjoeio commented on Nov 15, 2021

    @jsjoeio
    Contributor
  6. code-asher commented on Nov 16, 2021

    @code-asher
    Member

    Those headers enable proxying websockets so it is not a code-server issue as far as I can tell.

  7. bsmithio commented on Nov 29, 2021

    @bsmithio

    If anyone is looking for a solution for ingress-nginx on Kubernetes like I was, add this annotation to your ingress

    nginx.org/websocket-services: "code-server"

    Replace code-server with whatever your code-server service name is.

  8. ZandercraftGames commented on Feb 6, 2022

    @ZandercraftGames

    A little late now, but does anyone have a working configuration for Apache2?

  9. tinuh commented on Feb 26, 2022

    @tinuh

    A little late now, but does anyone have a working configuration for Apache2?

    Hey looking for the same thing, having issues proxying code server in apache2

  10. AuthorShin commented on Mar 25, 2022

    @AuthorShin

    When adding the domain or subdomain for code-server on Nginx Proxy Manager make sure to check the Websockets support to solve the problem.
    Screenshot-2022-03-25-175109

  11. leuit commented on Apr 21, 2022

    @leuit

    @tinuh @ZandercraftGames
    For those having issues with reverse proxy in Apache, refer to #4723 (comment)

    I hope this works for you!

  12. 1m188 commented on Apr 26, 2022

    @1m188

    A little late now, but does anyone have a working configuration for caddy2?

  13. bravo-wd commented on Jun 8, 2022

    @bravo-wd

    proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Accept-Encoding gzip;

    Thank you very much. It's very useful to me.

  14. getkub commented on Jun 12, 2022

    @getkub

    for kubernetes, I had to add BOTH suggestions from Link1 and annotations as follows.

    PS: the {{ .Values.user }} etc, are dynamic values from values.yml of helm chart which you need to replace

        nginx.org/websocket-services: code-server-{{ .Values.user }}
        nginx.org/server-snippets: |
          location / {
          proxy_pass http://{{ .Values.host_domain }}:{{ .Values.port }}/;
          proxy_set_header Host $host;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection upgrade;
          proxy_set_header Accept-Encoding gzip;
          }  
    

    Entire example below using helm chart

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: code-server-{{ .Values.user }}
      namespace:  {{ .Values.namespace }}
      annotations:
        cert-manager.io/cluster-issuer: letsencrypt-prod
        nginx.ingress.kubernetes.io/rewrite-target: /
        nginx.org/websocket-services: code-server-{{ .Values.user }}
        nginx.org/server-snippets: |
          location / {
          proxy_pass http://{{ .Values.host_domain }}:{{ .Values.port }}/;
          proxy_set_header Host $host;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection upgrade;
          proxy_set_header Accept-Encoding gzip;
          }   
    spec:
      tls:
      - hosts:
        - {{ .Values.host_domain }}
        secretName: code-server-secret-{{ .Values.user }}
      rules:
      - host: {{ .Values.host_domain }}
        http:
          paths:
          - pathType: Prefix
            path: "/"
            backend:
              service:
                name: code-server-{{ .Values.user }}
                port:
                  number: {{ .Values.port }}
    
  15. 20 remaining items

  16. EITSxiaozhai commented on Jan 1, 2024

    @EITSxiaozhai

    对我来说,下面是工作:(docker run & nginx proxy externals of docker 容器)

    location / {
             add_header Access-Control-Allow-Origin *;
             add_header Access-Control-Allow-Methods *;
             add_header Access-Control-Allow-Headers *;
     
             # proxy_ssl_verify off;
             proxy_set_header Host $host;
             proxy_set_header Accept-Encoding gzip;
             #proxy_set_header X-Forwarded-Host $host;
             proxy_set_header X-Forwarded-Host $host:$server_port;
     
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection $http_connection;
             proxy_http_version 1.1;
     
             proxy_pass http://127.0.0.1:8081/;
     
           }
    

    This config file worked for me. Solved the websock error. Thanks a lot!
    code-server ---> nginx

  17. octopus2181 commented on Jan 31, 2024

    @octopus2181

    Hi, I found an issue where if I set the port to 443:443 in the docker compose of Nginx-Proxy-Manager ,reverse proxies are good. I was able to use code-server in the docker . But If I set a different port mapping 443 in the docker compose of Nginx-Proxy-Manager (such as 9091:443), I can't use linuxserver/code-server . There is an error, "The workbench failed to connect to the server (Error: WebSocket close with status code 1006)" . Because my port 443 is forbidden, I want to use a different port.

  18. code-asher commented on Feb 1, 2024

    @code-asher
    Member

    @octopus2181 Could you open a new issue with a Docker compose I can use to reproduce the issue? I will look into it.

  19. keskinonur commented on Feb 4, 2024

    @keskinonur

    For you referece, with code-server version 4.20.1, my working nginx configuration is:

      location / {
        proxy_pass http://localhost:8080/;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection upgrade;
        proxy_set_header Accept-Encoding gzip;
      }
    
  20. octopus2181 commented on Feb 9, 2024

    @octopus2181

    For you referece, with code-server version 4.20.1, my working nginx configuration is:

      location / {
        proxy_pass http://localhost:8080/;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection upgrade;
        proxy_set_header Accept-Encoding gzip;
      }
    

    Yes, you are right ! Setting proxy_set_header X-Forwarded-Host $http_host , the port 9091 can connect to the code-server .
    Thank you !

  21. hogdanish commented on Feb 13, 2024

    @hogdanish

    Since nearly every solution on this issue refers to non-standard networking configurations without elaborating on what they're supposed to indicate, here's the configuration that worked for my specific local environment (NGINX Proxy Manager + lscr.io's code-server image in separate docker stacks sharing the same 'proxy' bridge network):

    1. Create a new proxy host via NGINX Proxy Manager
    2. Use the 'http' scheme, followed by your domain (i.e, code.mydomain.com), and the code-server port (by default this is 8443 on the lscr.io image)
    3. Enable 'Websockets Support'
    4. In the 'SSL' tab, enable 'Force SSL' and 'HTTP/2 Support'
    5. Navigate to the 'Advanced' tab and paste the following configuration into the input field:
      location / {
        proxy_pass http://192.168.32.52:80/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header Accept-Encoding gzip;
        proxy_set_header Connection upgrade;
      }
    
    1. Replace 192.168.4.58 and 80 with the IP and port that NGINX Proxy Manager is accessible through on your server.

    This configuration uses the default ports that both code-server and NGINX Proxy Manager use out-of-the-box, at least while using lscr.io's code-server image- but it should still work either way.

    If you run into any issues after this point, ensure you haven't incorrectly modified any of code-server's proxy-related environment variables (i.e, CS_DISABLE_PROXY or PROXY_DOMAIN), and ensure that you correctly configured your domain's DNS settings through your DNS provider if applicable (i.e, an A record pointing *.yourdomain.com to your server's IP or tunnel configuration).

    Here's what my final docker-compose.yml file looked like (environment variables redacted):

    version: "3.8"
      code-server:
        image: lscr.io/linuxserver/code-server:latest
        container_name: code-server
        restart: unless-stopped
        environment:
          - "PASSWORD=this_isnt_very_secure"
          - "SUDO_PASSWORD=this_is_extremely_insecure"
          - "DEFAULT_WORKSPACE=/srv" # Makes code-server start in /srv/ by default
        volumes:
          - '/srv/docker/apps/code-server:/config'
          - '/srv:/workspace' 
        ports:
          - '8443:8443'
        secrets:
          - CODE_SERVER_PWD
          - CODE_SERVER_SUDO_PWD
          
    networks:
      default:
        name: proxy
        external: true # Assuming 'proxy' network has already been created and is also used by NPM
    

    Full disclaimer that I have no idea if I'm following the best practices here, I'm just posting what worked for my very specific configuration. Feel free to correct me if there's a better way to go about any of this.

  22. wangyizhi1 commented on May 15, 2024

    @wangyizhi1

    proxy_set_header Host $http_host; should also work if you want to avoid hard-coding the host.

    Edit: Or proxy_set_header X-Forwarded-Host $http_host;.

    @code-asher 's answer works for me, and a faster way:

    ./bin/code-server --host 0.0.0.0 --trusted-origins=* ...
    
  23. freeluo22 commented on May 22, 2024

    @freeluo22

    for me, below is work: (docker run & nginx proxy outside the docker container)

    location / {
             add_header Access-Control-Allow-Origin *;
             add_header Access-Control-Allow-Methods *;
             add_header Access-Control-Allow-Headers *;
     
             # proxy_ssl_verify off;
             proxy_set_header Host $host;
             proxy_set_header Accept-Encoding gzip;
             #proxy_set_header X-Forwarded-Host $host;
             proxy_set_header X-Forwarded-Host $host:$server_port;
     
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection $http_connection;
             proxy_http_version 1.1;
     
             proxy_pass http://127.0.0.1:8081/;
     
           }
    

    This configuration works for me.

  24. Venjy commented on May 24, 2024

    @Venjy

    for me, below is work: (docker run & nginx proxy outside the docker container)

    location / {
             add_header Access-Control-Allow-Origin *;
             add_header Access-Control-Allow-Methods *;
             add_header Access-Control-Allow-Headers *;
     
             # proxy_ssl_verify off;
             proxy_set_header Host $host;
             proxy_set_header Accept-Encoding gzip;
             #proxy_set_header X-Forwarded-Host $host;
             proxy_set_header X-Forwarded-Host $host:$server_port;
     
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection $http_connection;
             proxy_http_version 1.1;
     
             proxy_pass http://127.0.0.1:8081/;
     
           }
    

    This configuration works for me.

    This works for me. I've tried lots of configuration, the key line is proxy_set_header X-Forwarded-Host $host:$server_port;

  25. yifanlu0227 commented on May 29, 2024

    @yifanlu0227

    --host 0.0.0.0 --trusted-origins=*

    @wangyizhi1 Awesome, this works!

  26. kimboslice99 commented on Feb 6, 2025

    @kimboslice99

    For those that may be needing to proxy through IIS, here is a couple rewrite rules for that. This app uses permessage-deflate which ARR does not support, so the request fails with this 1006 error message

    <rule name="removepermessagedeflate">
        <match url=".*" />
        <conditions>
            <add input="{HTTP_SEC_WEBSOCKET_EXTENSIONS}" pattern="permessage-deflate(.*)" />
        </conditions>
        <serverVariables>
            <set name="HTTP_SEC_WEBSOCKET_EXTENSIONS" value="{C:1}" />
        </serverVariables>
        <action type="None" />
    </rule>
    <rule name="proxy">
        <match url=".*" />
        <action type="Rewrite" url="http://10.8.0.4:8080/{R:0}" />
    </rule>
  27. HelloMihai commented on Apr 3, 2025

    @HelloMihai

    where is the nginx.conf file?

    console into the nginx container

    docker ps | grep nginx
    docker exec -it <container_name or ID> /bin/sh
    
    # console in container
    cat /etc/nginx/nginx.conf
    
  28. vector090 commented on Jun 25, 2025

    @vector090

    for me, below is work: (docker run & nginx proxy outside the docker container)对我来说,下面是工作:(docker在docker容器外运行nginx代理)

    location / {
             add_header Access-Control-Allow-Origin *;
             add_header Access-Control-Allow-Methods *;
             add_header Access-Control-Allow-Headers *;
     
             # proxy_ssl_verify off;
             proxy_set_header Host $host;
             proxy_set_header Accept-Encoding gzip;
             #proxy_set_header X-Forwarded-Host $host;
             proxy_set_header X-Forwarded-Host $host:$server_port;
     
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection $http_connection;
             proxy_http_version 1.1;
     
             proxy_pass http://127.0.0.1:8081/;
     
           }
    

    This configuration works for me.这个配置对我来说很有用。

    This works for me. I've tried lots of configuration, the key line is proxy_set_header X-Forwarded-Host $host:$server_port;这对我很有效。我尝试过很多配置,关键行是proxy_set_header X-Forwarded-Host $host:$server_port;

    Worked like a charm.
    Indeed the key line is proxy_set_header X-Forwarded-Host $host:$server_port;

  29. starseaheart commented on Jan 6, 2026

    @starseaheart

    for me, below is work: (docker run & nginx proxy outside the docker container)

    location / {
             add_header Access-Control-Allow-Origin *;
             add_header Access-Control-Allow-Methods *;
             add_header Access-Control-Allow-Headers *;
     
             # proxy_ssl_verify off;
             proxy_set_header Host $host;
             proxy_set_header Accept-Encoding gzip;
             #proxy_set_header X-Forwarded-Host $host;
             proxy_set_header X-Forwarded-Host $host:$server_port;
     
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection $http_connection;
             proxy_http_version 1.1;
     
             proxy_pass http://127.0.0.1:8081/;
     
           }
    

    This configuration works for me.

    This works for me. I've tried lots of configuration, the key line is proxy_set_header X-Forwarded-Host $host:$server_port;

    This is particularly important for those who access other programs on the server through the proxy + nginx, and these programs only listen on the port of 127.0.0.1.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions