code-server: [Bug]: Port forwarding with suburl makes the forwarded links corrupted .
Is there an existing issue for this?
- I have searched the existing issues Similar https://github.com/coder/code-server/discussions/5439 ;
OS/Web Information
- Web Browser: Chrome (Version 98.0.4758.102) & Firefox (Version 102.3.0esr )
- Local OS: Debian
- Remote OS: Ubuntu
- Remote Architecture: arm64
code-server --version: 4.8.3 977b853a1e162ab583aed64b1322d1515c57728c with Code 1.72.1
Steps to Reproduce
- Open code-server
- Run
jupyter notebookin terminal , and forward the port (should be forwarded automatically) - Open the forwarded url
Expected
Jupyter notebook shows up a correct UI and works without problems.
Actual
The jupyter notebook showed up with a unformatted UI (because css and js files are requested with a corrupted URL, only the https://192.168.0.114:28080/proxy/8888/login?next=%2Ftree is requested correctly)
if logging in to the notebook it redirected me to https://192.168.0.114:28080/?next=/tree , which is obviously wrong (code-server is serving there)
eg , for the logo.png , it requested for https://192.168.0.114:28080/static/base/images/logo.png?v=<a long string> , but it should request for https://192.168.0.114:28080/proxy/8888/static/base/images/logo.png?v=<a long string>
Logs
Logs
[IPC Library: Pty Host] DEBUG CommandDetectionCapability#handleCommandExecuted 0 1
[IPC Library: Pty Host] DEBUG CommandDetectionCapability#setCommandLine jupyter notebook
[IPC Library: Pty Host] TRACE IPty#onData [I 15:06:55.184 NotebookApp] Serving notebooks from local directory: /home/ubuntu/workspace
[IPC Library: Pty Host] TRACE IPty#onData [I 15:06:55.184 NotebookApp] Jupyter Notebook 6.5.2 is running at:
[I 15:06:55.184 NotebookApp] http://localhost:8888/?token=d5e6bd5bb2af22923a05edf7e2bb29171e26a5ea21988ac8
[I 15:06:55.184 NotebookApp] or http://127.0.0.1:8888/?token=d5e6bd5bb2af22923a05edf7e2bb29171e26a5ea21988ac8
[I 15:06:55.184 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[IPC Library: Pty Host] TRACE IPty#onData [C 15:06:55.197 NotebookApp]
To access the notebook, open this file in a browser:
file:///home/ubuntu/.local/share/jupyter/runtime/nbserver-13720-open.html
Or copy and paste one of these URLs:
http://localhost:8888/?token=d5e6bd5bb2af22923a05edf7e2bb29171e26a5ea21988ac8
or http://127.0.0.1:8888/?token=d5e6bd5bb2af22923a05edf7e2bb29171e26a5ea21988ac8
[IPC Library: Pty Host] DEBUG ChildProcessMonitor: Has child processes changed true
[IPC Library: Pty Host] TRACE IPty#onData [I 15:07:03.317 NotebookApp] 302 GET / (127.0.0.1) 1.440000ms
[IPC Library: Pty Host] TRACE IPty#onData [I 15:07:03.407 NotebookApp] 302 GET /tree (127.0.0.1) 1.770000ms
[15:07:15] [<unknown>][29df24bf][ManagementConnection] The client has disconnected, will wait for reconnection 3h before disposing...
[15:07:17] [<unknown>][29df24bf][ManagementConnection] Another client has connected, will shorten the wait for reconnection 5m before disposing...
[15:07:17] [<unknown>][3473a0f6][ExtensionHostConnection] - startParams language: en
[15:07:17] [<unknown>][3473a0f6][ExtensionHostConnection] - startParams env: {"VSCODE_PROXY_URI":"https://192.168.0.114:28080/proxy/{{port}}/"}
[15:07:17] [<unknown>][3473a0f6][ExtensionHostConnection] The client has reconnected.
[15:07:17] [<unknown>][29df24bf][ManagementConnection] The client has reconnected.
[2022-11-18T15:07:21.474Z] debug 2 active connections
Trace: [2022-11-18T15:07:21.477Z] trace heartbeat
at doLog (/home/ubuntu/code/code-server-4.8.3-linux-arm64/node_modules/@coder/logger/out/logger.js:57:28)
at ServerFormatter.doWrite (/home/ubuntu/code/code-server-4.8.3-linux-arm64/node_modules/@coder/logger/out/logger.js:200:20)
at ServerFormatter.write (/home/ubuntu/code/code-server-4.8.3-linux-arm64/node_modules/@coder/logger/out/logger.js:119:14)
at Logger.handle (/home/ubuntu/code/code-server-4.8.3-linux-arm64/node_modules/@coder/logger/out/logger.js:339:25)
at Logger.trace (/home/ubuntu/code/code-server-4.8.3-linux-arm64/node_modules/@coder/logger/out/logger.js:268:14)
at Heart.<anonymous> (/home/ubuntu/code/code-server-4.8.3-linux-arm64/out/node/heart.js:41:29)
at Generator.next (<anonymous>)
at /home/ubuntu/code/code-server-4.8.3-linux-arm64/out/node/heart.js:8:71
at new Promise (<anonymous>)
at __awaiter (/home/ubuntu/code/code-server-4.8.3-linux-arm64/out/node/heart.js:4:12)
at Heart.beat (/home/ubuntu/code/code-server-4.8.3-linux-arm64/out/node/heart.js:37:16)
at /home/ubuntu/code/code-server-4.8.3-linux-arm64/out/node/heart.js:76:17
at Generator.next (<anonymous>)
at fulfilled (/home/ubuntu/code/code-server-4.8.3-linux-arm64/out/node/heart.js:5:58)
at runMicrotasks (<anonymous>)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
Screenshot/Video
Behavior
Run jupyter:
Forward port:
Access it:

Browser console output

Explaination
The correct URL:
The corrupted URL:

Does this issue happen in VS Code or GitHub Codespaces?
- I cannot reproduce this in VS Code.
- I cannot reproduce this in GitHub Codespaces.
Are you accessing code-server over HTTPS?
- I am using HTTPS.
Notes
Code-server is running on a lxc container , it exposed the port 8888 to the server host , and I used iptables(iptables -t nat -A PREROUTING -p tcp --dport 28080 -j DNAT --to-destination 10.154.46.4:8080 , where 28080 is the server exposed port , and 10.154.46.4:8080 is the container exposed port).
It is using a self-signed certificate with cert and cert-key params in the config file (not serving through nginx/caddy)
Also , this bug makes the pdf viewer from LaTeX workshop not working properly.
Is it because of relative path ? But jupyter and LaTeX workshop aren’t my project , i don’t know where I can make changes.
Subdomains may work , but I don’t have a domain for my server.
About this issue
- Original URL
- State: closed
- Created 2 years ago
- Comments: 40 (15 by maintainers)
@code-asher @jsjoeio Well , I tried a new way today . And , it worked !
Here is the nginx configuration.
Configuration
When accessing
https://server-host.com/proxy/{port}nginx will setproxy_port={port}to the client cookies. And if the client requests forhttps://server-host.com/path/to/the/resourcewith the cookie (proxy_port={port}), nginx willproxy_passit tohttp://127.0.0.1:{port}/path/to/the/resourceso the resource can be loaded correctly. Also nginx will check if the connection is awebsocket, and if it is nginx will automatically configure it . (So it’s able to connect tojupyter kernelthrough nginx)What I have tested :
Screenshots
Yeah I think for advanced proxy configuration it might be better to set up NGINX or Caddy instead of using code-server’s built-in.
Also if all you are looking for is to avoid stripping the base path then we have another proxy endpoint
/absproxyfor that so you could setVSCODE_PROXY_URI=https://my-domain.com/absproxy/{{port}}. It would be cool to have a way to choose between/proxyand/absproxyfrom the UI.I like that! We could add a doc and then in the message that pops up about the forwarded port, add a link below and link to the docs.
I’m having the same browser output when I try using jupyter-lab as well. I’m using code-server in a docker container behind a reverse proxy (caddy). I noticed when I prepend the path of the 404 requests with the path ‘/proxy/8888/’ it fetches the desired resource successfully. In my case it looks like because code-server’s proxy strips the ‘/proxy/<port>/’ portion of the path it fails.
I opened an issue: https://github.com/coder/code-server/issues/6770
Not sure I can get to it any time soon, but happy to take pull requests.
Yup, exactly this.
Are you able to host at a subdomain instead? Something like
code-server.domain.tld.100% agree.
I think it would be reasonable to add a
--base-pathflag that will be prepended to allabsproxyrequests.@jsjoeio thanks for the reply.
I did set the base as
base: "/absproxy/{port}/",in thevite.config.js. at the moment i manually add the/absproxy/{port}/into the url for it to work.For the authorization, i try your suggestion.
@qianchd Just tested. Here’s my nginx configuration
Configuration
Remember to change the
listen 28081to your port ,server nameto your domain (or ip) , the certificate path to your certificate file.Screenshot
It works normally . And the reverse proxy still works , no conflicts.
Actually , since nginx is already forwarding ports at
/proxy/{port}, you can directly access code-server withhttps://host.com/proxy/8080/(while 8080 is the port code-server is using)The site redirected you too many times, you can directly accesshttps://host.com/after accessinghttps://host.com/proxy/{port}/.As you are already using nginx and serving code-server behind subpath , I think you can merge the configuration files . I think…just make your ‘location /code-server’ block at top so the other configurations wont affect it .So I think merging them won’t cause conflicts.
I have tons of homework to do now and I can’t test , I’ll test it this weekend and reply here. Sorry for keep you waiting ~
I wonder if there is a way we can surface help around this, maybe via a tooltip or text underneath the forwarded port? Or something like a “help me” button that triggers a notification or opens documentation?
Yeah many applications use absolute URLs unfortunately and default to
/so they will need to be made aware of the base/proxy/{port}/path, including Jupyter.The sub-domain proxy method is superior since it does not have the same issue but it needs to be enabled via the
--proxy-domainflag. I think it would look like this:(Alternatively the proxy could be implemented via a separate reverse proxy.)
It doens’t need to include the full url , there are descriptions in jupyter’s docs
@jsjoeio Yes , correct .
And , I found this https://jupyter-notebook.readthedocs.io/en/stable/public_server.html#running-the-notebook-with-a-customized-url-prefix, and I followed it. I added
c.NotebookApp.base_url = '/proxy/8888/'to/home/ubuntu(my user name)/.jupyter/jupyter_notebook_config.pyand launched it . This time when I access it , the jupyter icon loaded successfully but the site returned a404Screenshot
And
jupyter notebookoutputLogs
And for
python3 -m http.server, it does workScreenshots
UPD: Figured out , seems jupyter messed the urls up.
Screenshots
accessing from the internal net : (not through code-server proxy)
The reverse proxy server used by code-server makes jupyter thinks that you are accessing path
/while you are actually accessing/proxy/8888, but jupyter only works when it thinks you are accessing/proxy/8888, so in this case you have to double the/proxy/8888. So accessinghttps://192.168.0.114:28080/proxy/8888/proxy/8888/logincan show the login screen , but nothing else (like the logo or css files) loads because they were requested withhttps://192.168.0.114:28080/proxy/8888. Pretty confusing 😭