Ubuntu24云端编程环境一键搭建指南

举报
Prism 发表于 2025/11/13 11:50:11 2025/11/13
【摘要】 概述本文档描述如何在 Ubuntu 主机上部署 code-server(即“网页版 VS Code”),并通过 autossh 将服务反向隧道到跳板机、使用 Nginx 反向代理域名访问、以及使用 certbot 配置 HTTPS。适合在多设备间共享同一开发环境、并解决个人主机动态公网 IP 的访问问题。本文要点:使用 code-server 提供浏览器可访问的开发环境使用 autossh...

概述

本文档描述如何在 Ubuntu 主机上部署 code-server(即“网页版 VS Code”),并通过 autossh 将服务反向隧道到跳板机、使用 Nginx 反向代理域名访问、以及使用 certbot 配置 HTTPS。适合在多设备间共享同一开发环境、并解决个人主机动态公网 IP 的访问问题。

本文要点:

  • 使用 code-server 提供浏览器可访问的开发环境
  • 使用 autossh 建立反向隧道到跳板机,避免暴露个人主机公网地址
  • 在跳板机上用 Nginx 反向代理到域名
  • 用 certbot 配置有效的 TLS/HTTPS
  • 提供必要的安全提示与故障排查方法

先决条件

  • 目标主机:运行 Ubuntu(本文以 Ubuntu 为例)
  • 跳板机:具有固定公网 IP 或已配置域名,可做反向代理
  • 域名:已在 DNS 中解析到跳板机(A 或 CNAME 记录)
  • 本地与跳板机之间可做 SSH 连接(可通过密钥认证)
  • 具有 sudo 权限的用户

一、部署 code-server(目标主机)

建议:将 code-server 绑定到 localhost 或内部端口,再通过跳板机/Nginx 暴露到公网,避免直接把 code-server 绑定到 0.0.0.0(除非有额外防护)。

  1. 安装 code-server(官方脚本)
curl -fsSL https://code-server.dev/install.sh | sh
  1. 打开并编辑配置文件(路径因版本可能不同,常见为 ~/.config/code-server/config.yaml)
nano /home/$USER/.config/code-server/config.yaml
  1. 建议的 config.yaml 关键项(示例)
  • 如果通过跳板机和 Nginx 暴露,建议 bind 到 localhost 并使用内部端口(例如 127.0.0.1:8080)
  • 新版 code-server 常用 auth 字段

示例:

bind-addr: 127.0.0.1:8080
auth: password
password: "请使用强密码或从环境变量/secret 管理" 
cert: false

安全提示:

  • 更安全的做法是使用反向代理的 TLS(Nginx + certbot),并在 code-server 中禁用直接证书管理(cert: false)。
  • 如需更高安全性,可考虑配合 OAuth、OIDC 或组织内反向代理认证。
  1. 启动并管理 systemd 服务(脚本通常已创建 service)
sudo systemctl daemon-reload
sudo systemctl start code-server@${USER}
sudo systemctl enable code-server@${USER}
sudo systemctl status code-server@${USER}

验证(在目标主机上):

addr=$(grep -E '^\s*bind-addr' /home/$USER/.config/code-server/config.yaml | cut -d ':' -f 2- | tr -d ' ')
curl -i http://${addr}
# 如果绑定到 localhost,请用 localhost 替代或先确认端口监听
ss -tlnp | grep 8080

二、使用 autossh 建立反向隧道(目标主机 -> 跳板机)

目标:在目标主机上运行 autossh,将 code-server 的本地端口反向映射到跳板机的某个端口(跳板机上监听该端口,供 Nginx 转发到域名)。

  1. 安装 autossh(目标主机)
sudo apt update
sudo apt install -y autossh
  1. 配置 SSH 密钥(目标主机生成并把公钥拷到跳板机)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_code_server
ssh-copy-id -i ~/.ssh/id_rsa_code_server.pub user@jumphost.example.com
# 测试无密码登录
ssh -i ~/.ssh/id_rsa_code_server user@jumphost.example.com
  1. 在目标主机创建 systemd 服务文件 /etc/systemd/system/autossh-code-server.service(示例)
[Unit]
Description=autossh reverse tunnel for code-server
After=network-online.target
Wants=network-online.target

[Service]
User=your_local_user
# 如果使用特定私钥,确保权限正确
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 0 -N -T \
  -i /home/your_local_user/.ssh/id_rsa_code_server \
  -o "ServerAliveInterval=30" -o "ServerAliveCountMax=3" \
  -R 127.0.0.1:12345:127.0.0.1:8080 user@jumphost.example.com
Restart=always
RestartSec=5
KillMode=process

[Install]
WantedBy=multi-user.target

说明:

  • 把 12345 换成跳板机上要映射的端口(跳板机需保证该端口可用)
  • 如果需要远程任何地址可访问(非仅 localhost),在 -R 中去掉 127.0.0.1 前缀,但这会扩大暴露面,慎用。
  1. 启动并启用服务
sudo systemctl daemon-reload
sudo systemctl start autossh-code-server
sudo systemctl enable autossh-code-server
sudo systemctl status autossh-code-server
  1. 跳板机注意事项
  • 在跳板机上确保所用端口在防火墙/云安全组中已放行(TCP)。
  • 若跳板机使用 OpenSSH 的 GatewayPorts 设置,可能需要在 /etc/ssh/sshd_config 中配置 GatewayPorts yes(重启 sshd)。

三、跳板机:Nginx 反向代理配置

在跳板机上安装 Nginx,并将跳板机上由 autossh 映射出的端口反向代理到你的域名,提供 websocket 支持与 TLS 协议终端。

  1. 安装 Nginx
sudo apt update
sudo apt install -y nginx
  1. 放行防火墙端口(示例使用 ufw)
sudo ufw allow 'Nginx Full'   # 放行 80 和 443
sudo ufw reload
  1. 创建 Nginx 配置文件,例如 /etc/nginx/sites-available/code-server.conf
    示例配置(把 domain.example 和 12345 替换为真实值):
server {
    listen 80;
    server_name domain.example.com;

    # 可选:强制 HTTPS(如果希望自动跳转到 HTTPS,可把下行取消注释)
    # return 301 https://$host$request_uri;

    location / {
        proxy_pass http://127.0.0.1:12345/;

        # websocket & headers
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 关闭缓冲以改善 websocket 实时性
        proxy_buffering off;
    }
}
  1. 启用站点并测试 Nginx 配置
sudo ln -s /etc/nginx/sites-available/code-server.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
  1. 测试(在跳板机上)
curl -i http://domain.example.com/
# 或直接请求映射端口
curl -i http://127.0.0.1:12345/

四、在跳板机上配置 HTTPS(certbot)

使用 certbot 的 nginx 插件自动为 Nginx 站点获取与安装证书。

  1. 安装 certbot 与插件
sudo apt update
sudo apt install -y certbot python3-certbot-nginx
  1. 运行 certbot(交互式,会自动修改 Nginx 配置并重载)
sudo certbot --nginx -d domain.example.com
  1. 自动续期(certbot 会添加系统 timer,亦可手动测试)
sudo certbot renew --dry-run
  1. 验证 HTTPS
curl -I https://domain.example.com/

安全提示:

  • 确保 DNS 指向正确并且 80/443 已被放行,certbot 才能完成域名验证。
  • 确保 Nginx 配置没有开放不必要的代理路径。

五、安全建议与最佳实践

  • 永远使用密钥登录 SSH,禁用密码登录(/etc/ssh/sshd_config)。
  • 把 code-server 绑定到 localhost,只通过受控的跳板机和 TLS 暴露服务。
  • 在跳板机上限制映射端口的访问来源(防火墙规则),如仅允许来自特定 IP 段访问管理端口。
  • 为 code-server 使用强密码或集成 SSO/OAuth。
  • 定期更新系统与相关组件(code-server、nginx、certbot、autossh)。
  • 监控日志(/var/log/nginx、journalctl -u autossh-code-server、systemctl status code-server@${USER})。

六、常见故障排查

  • 无法通过域名访问:
    • 检查 DNS 是否已生效(dig 或 nslookup)。
    • 检查跳板机 Nginx 是否运行(sudo systemctl status nginx)。
    • 检查 autossh 隧道是否建立(在跳板机 ss -tlnp | grep 12345)。
  • code-server 页面空白或认证失败:
    • 确认 code-server 正在目标主机上监听正确端口(ss -tlnp)。
    • 查看 code-server 日志:journalctl -u code-server@${USER} -f
  • certbot 验证失败:
    • 确保 80 端口可访问(临时关闭防火墙或允许来自 Let’s Encrypt 的访问),并确认域名解析到跳板机。

七、示例整体流程(简洁步骤)

  1. 在目标机安装并配置 code-server(bind 到 127.0.0.1:8080)。
  2. 在目标机生成 SSH 密钥并将公钥上送跳板机。
  3. 在目标机用 autossh 建立 -R 隧道到跳板机端口 12345,并把其设为 systemd 服务。
  4. 在跳板机安装 Nginx,配置反向代理 domain.example -> 127.0.0.1:12345。
  5. 在跳板机用 certbot 为 domain.example 申请证书并启用 HTTPS。
  6. 验证并关注日志、定期更新与备份。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。