ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Redwood 服务器入门指南:掌握 SSH 连接与 Baremetal 部署基础

Redwood 服务器入门指南:掌握 SSH 连接与 Baremetal 部署基础 Redwood 服务器入门指南掌握 SSH 连接与 Baremetal 部署基础【免费下载链接】redwoodRedwoodGraphQL项目地址: https://gitcode.com/gh_mirrors/re/redwoodRedwood 应用从开发机走向真实物理服务器第一步就是学会通过 SSH 连接远程主机。本文以 Redwood 6.x 官方文档《Introduction to Servers》为主体结合仓库中 Baremetal 部署的 CLI 源码与配置模板系统讲解 SSH 的三种认证方式、密钥管理、Agent Forwarding、提示符与别名优化为你后续使用 Baremetal 部署yarn rw deploy baremetal打下坚实基础。为什么需要这篇指南Redwood 框架既支持 Netlify、Vercel、Render 等云托管平台也提供了自建服务器部署选项Baremetal。Baremetal 的部署原理是从你的开发机或 CI 客户端通过 SSH 连接一台或多台远程服务器然后在远程执行git clone、yarn install、数据库迁移、构建和进程重启等一系列命令。因此学会手动用 SSH 连接服务器是成功使用 Baremetal 的前提——如果你自己都连不上服务器Baremetal 也不可能替你连上。在 *nix 系统macOS、Linux上SSH 是系统自带的连接工具在 Windows 上安装 PowerShell 等终端环境后同样可以使用。本文涉及的 SSH 连接策略共有三种用户名 密码Username password私钥Private key公钥Public key术语澄清正式动手之前先厘清几个容易混淆的概念SSHSecure Shell Protocol 的缩写是贯穿本文使用的ssh命令行工具所基于的协议ssh代码字体中的ssh特指实际的命令行工具而非广义的 SSH 协议概念ssh-agent另一个实用工具负责跟踪公钥和私钥并将其提供给ssh工具使用首次连接前的准备工作在能够通过 SSH 连接服务器之前你必须知道目标服务器的用户名。这个用户名由你的云服务商决定不同平台的默认账号各不相同云平台镜像/实例类型默认用户名AWSUbuntu 镜像创建的 EC2 实例ubuntuAWSAmazon 自家 Linux 镜像ec2userDigital OceanDropletroot不同厂商、不同镜像的默认用户可能千差万别务必在连接前从托管/云服务商处确认。指纹提示Fingerprint Prompt无论使用哪种认证方式第一次连接陌生服务器时都会看到如下提示这是因为你从未连接过这台服务器The authenticity of host 192.168.0.122 (192.168.0.122) cant be established. ED25519 key fingerprint is SHA256:FHQDzxsqA68cBhLPUkyN8aAVrznDtekhPg/99JXk8Q. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])?这是一次快速的安全校验用于确认你正在连接的正是你以为的那台机器。只要服务器地址无误输入yes即可。随后你会看到一条提示告知该主机已被加入已知主机列表之后再次连接同一台服务器就不会再被询问Warning: Permanently added 192.168.0.122 (ED25519) to the list of known hosts.所有已知服务器的记录都保存在本机这个文件中~/.ssh/known_hosts复用 IP 地址的坑如果你连接的是云端服务器经常开关实例并复用 IP 地址那么下次连接该 IP 时会报错因为服务器的签名已与known_hosts中记录的旧签名不一致。解决办法是在~/.ssh/known_hosts中找到对应行并删除即可重新连接。Baremetal 首次部署失败如果你从未手动通过 SSH 连接过目标服务器Baremetal 部署很可能失败——因为 Baremetal 没有交互式提示来接受服务器指纹。你需要至少手动连接服务器一次Baremetal 才能正常连接。三种连接方式详解方式一用户名 密码用户名/密码认证最直观用ssh命令指定用户名和服务器地址域名或 IP即可。密码通常是在创建服务器时设置或由服务商随机生成。ssh userserver.com以 Digital Ocean Droplet 为例用户为rootIP 为192.168.0.122ssh root192.168.0.122随后系统会提示输入密码输入时按键不可见root192.168.0.122s password:密码错误允许重试三次。无论连接成功与否都可以跳到下一节 Connected 继续。方式二私钥认证部分服务商如 AWS在创建服务器时不会给密码而是直接给你一个私钥文件这类文件通常以.pem结尾。请务必记住这个文件存放的位置——在放弃密码方案的前提下它是你连接服务器的唯一凭证。一旦丢失只能销毁实例重新创建。作者的习惯是把私钥统一放在~/.ssh目录可再建子目录集中管理所有 SSH 相关文件。关于公钥/私钥对密钥对由一把公钥和一把私钥组成。任一把都可以加密文档但只有对应的私钥能解密。因此公钥可以自由分发这正是它叫公钥的原因而私钥持有者可以验证文档确实是用配套公钥加密的。反过来私钥可以生成文档签名公钥可以验证签名是否由匹配的私钥创建——于是你得到原始消息后验证签名即可信任消息确实来自私钥持有者。注意无法用公钥解密用私钥加密的内容否则公钥分发给任何人的意义就消失了任何人都能读到你的消息。如果双方需要双向加密通信可以互相交换公钥各自用对方的公钥加密。直接用私钥连接时很可能遇到一个吓人的报错ssh -i ~/.ssh/keyname.pem ubuntu192.168.0.122 WARNING: UNPROTECTED PRIVATE KEY FILE! Permissions 0666 for /Users/rob/.ssh/shared/algostake.pem are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored.原因是从互联网下载的文件权限通常过于宽松系统上任何人都可读SSH 要求私钥文件只允许你自己读写。解决办法是用chmod将权限收紧为600仅文件所有者可读写其他人无任何权限chmod 600 ~/.ssh/keyname.pem其中keyname替换为实际文件名。改好权限后用-i标志指定私钥路径连接ssh -i ~/.ssh/keyname.pem ubuntu192.168.0.122方式三公钥认证部分服务商如 Digital Ocean允许在创建服务器时自动把你的公钥放到服务器上从而完全跳过密码和私钥认证。这也是本文最终推荐并会落实到 Baremetal 部署的首选方式。如果你还不清楚公钥是什么、自己的公钥在哪里、或把公钥放到服务器上意味着什么可以先跳到 生成公钥/私钥对 一节。公钥认证只需用户名和服务器地址ssh ubuntu192.168.0.122如果服务器不支持创建时预置公钥则需要手动把公钥添加到服务器见 将 SSH 公钥添加到服务器。Connected连接成功后的检查无论使用哪种认证方式此时你应该已经连上服务器了。如果看到如下错误ubuntu192.168.0.122: Permission denied (publickey,password).通常有四种可能用户名错误密码错误本机尝试使用的公钥不在服务器的~/.ssh/authorized_keys文件中通过-i指定的私钥未被服务器接受此时可以加上-vverbose标志重新运行命令SSH 会详细打印它尝试过的每一种登录方式方便排查。连接成功的典型画面是一段系统欢迎信息以下是 Ubuntu 22.04 示例你的机器可能不同Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.15.0-41-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Wed Aug 3 21:09:41 UTC 2022 System load: 0.25439453125 Users logged in: 0 Usage of /: 6.3% of 24.05GB IPv4 address for eth0: 192.168.0.122 Memory usage: 22% IPv4 address for eth0: 10.48.0.5 Swap usage: 0% IPv4 address for eth1: 10.124.0.2 Processes: 97 0 updates can be applied immediately. ... rootremote-server:~#最后一行rootremote-server:~#就是命令行提示符从这里开始可以输入命令了。断开连接断开连接只需一个exit命令直接关闭终端窗口也会终止连接rootremote-server:~# exit Connection to 192.168.0.122 closed.简化访问把公钥放到服务器上每次都要输入用户名或带-i指定私钥并不愉快。幸运的是 SSH 基于公钥/私钥密码学可以用你的公钥验证身份。你大概已经在 GitHub 的Settings SSH and GPG keys上传过公钥——我们要做的类似把本机公钥放到服务器上让服务器在连接时认出你从而跳过密码。如果你已经在使用公钥认证可以直接跳过本节——你已经在做了。服务器上可以保存多台开发机的公钥这样你能从多台电脑连接。这在团队协作时尤其方便有人离职时只需从服务器移除他的公钥。对比之下密码认证要么把单一部署账号的密码共享给所有队友有人离职就得改密码要么给每人发一份服务器私钥副本每有人离职就要换一遍。维护公钥列表要简单得多。公钥/私钥对你可能已经拥有一对公钥/私钥了检查~/.ssh目录找找扩展名相同前缀的两个文件——一个带.pub后缀例如id_ed25519和id_ed25519.pub。如果你不记得自己创建过这两个文件那它们多半是ssh-keygen之类的程序生成的SSH 已经在使用它们了用下面这个命令查看 SSH 当前已知的密钥ssh-add -L输出为零行或多行公钥形如ssh-ed25519 AAAAB3NzaC1yc2EAAAADAQABREDACTEDCU90x/khqD1sDW robcomputer.local把输出与~/.ssh/id_ed25519.pub的内容对比如果一致说明 SSH 连接时已经在使用你的公钥了。如果没有密钥对呢生成公钥/私钥对生成新密钥对只需一条命令ssh-keygen -t ed25519-t ed25519指定使用 ED25519 算法。可选的算法有很多但并非所有算法在所有系统上都受支持。命令执行后会问你几个问题Generating public/private ed25519 key pair. Enter file in which to save the key (/Users/rob/.ssh/id_ed25519): Enter passphrase (empty for no passphrase): Enter same passphrase again:如果没有任何密钥直接按ENTER采用默认文件名id_ed25519Passphrase口令是密钥上的额外安全层但每次访问私钥都要输入口令反而抵消了把公钥共享给服务器以便快速访问的便利性。只要你能保护好私钥就不必设口令——连按两次 ENTER 跳过即可生成完成后的输出类似Your identification has been saved in id_ed25519 Your public key has been saved in id_ed25519.pub The key fingerprint is: SHA256:6Qg7RQRGp1AtfVIOucEt1HtZWkYMU1LZYBVwBsXwTWQ robcomputer.local The keys randomart image is: --[ED25519 256]-- | .BO .E | | o* .** . o .o| | . o . . . .| | .o o . o ..| | o . A * .| | | | o . * . | | . o | | | ----[SHA256]-----Randomart 是什么密钥校验通常是比较无意义的字符串即密钥指纹的十六进制表示人眼对比起来又慢又容易出错。Randomart 用结构化图像代替字符串让人类能更快、更直观地判断两个公钥是否相同。添加到 ssh-agent密钥存在了但 SSH 知道使用它吗问问管理密钥的ssh-agentssh-add -L如果列表里没有你的新公钥只需告诉ssh-agent密钥位置注意这里传的是私钥路径ssh-add ~/.ssh/id_ed25519再次运行ssh-add -L就应该能看到你的密钥了。电脑重启后密钥丢失某些情况下重启后ssh-agent会忘记密钥。可以在本机不是服务器的~/.zshrc中加一行让每次开启新终端会话时自动添加密钥ssh-add ~/.ssh/id_ed25519将 SSH 公钥添加到服务器SSH 现在会把公钥呈现给服务器但服务器还不知道该怎么处理它。接下来把公钥复制到服务器上让服务器允许来自该公钥的连接。先在终端打印公钥以便复制cat ~/.ssh/id_ed25519.pubmacOS 上可以用这条两段式命令直接复制到剪贴板cat ~/.ssh/id_ed25519.pub | pbcopy然后照常用 ssh 连接服务器用户名/密码或私钥均可打开~/.ssh/authorized_keys文件进行编辑。nano编辑器通常内置且简单易用vi也是选择之一nano ~/.ssh/authorized_keys把公钥粘贴到文件的新行。建议在密钥上方加一条注释注明来源电脑姓名 主机名否则随着电脑升级、同事接入你将很快分不清哪个密钥属于谁# Rob Cameron (optimus-prime) ssh-ed25519 AAAAB3NzaC1yc2EAAAADAQABREDACTEDCU90x/khqD1sDW robcomputer.local保存并退出。现在断开 SSH 会话exit后重新连接这次不需要密码也不需-i指定私钥直接ssh root192.168.0.122就可以登录了SSH Agent Forwarding代理转发连接远程服务器后你可能还想从服务器再 SSH 到其他机器并让对方识别为你本人个人电脑上的你而不是这台服务器。默认情况下这是不成立的从远程服务器发起 SSH 连接时使用的是服务器自身的凭据意味着你需要在服务器上再走一遍前面所有配置公钥的流程。SSH 提供了一个机制解决这个问题SSH Agent Forwarding代理转发。它最典型的应用场景是从 GitHub 部署代码到远程服务器你已经以本人身份连上了远程服务器也已经有权限连接 GitHub那就直接复用这些凭据。可以用下面命令验证是否已生效ssh -T gitgithub.com如果看到类似输出Hi cannikin! Youve successfully authenticated, but GitHub does not provide shell access. Connection to github.com closed.说明代理转发已经生效GitHub 识别出了你的用户名并授予访问权限——远程服务器转发了你的公钥也就是连接远程服务器时用的那把一切顺理成章。如果看到gitgithub.com: Permission denied (publickey).则代理转发尚未开启需要按 GitHub 官方指南完成配置。Deploy Keys部署密钥你可能不想在部署时使用个人 SSH 密钥。代理转发的一个缺点是它要求你本人或代表你的部署系统SSH 进入机器执行部署而不是让 CI/CD 系统独立完成。另一个是安全问题个人 SSH 密钥通常拥有仓库的全部权限远超部署所需的只读权限。基于这些考虑可以改用deploy keys部署密钥生成一对专属于服务器们的密钥对把公钥告诉 GitHub。这样服务器无需你参与即可连接 GitHub 并克隆代码库而且可以把该密钥的访问权限锁定到单个仓库、只读级别。自定义提示符Prompt部署到生产环境时在提示符上时刻提醒自己正连接着哪台服务器非常有帮助——而不是看到一串 IP 或随机主机名rootremote-server:~# # or user192.168.0.122这是生产环境还是预发环境集群里的哪一台提示符完全可以自定义。一个实用的命名约定是应用名 环境 服务器序号。例如应用叫 ruby是生产环境集群的第一台服务器可以期望提示符长这样rootruby-prod1:~#提示符通常定义在以下文件之一~/.bashrc ~/.bash_profile ~/.zshrc ~/.zprofile如果使用 bash/zsh 之外的 shell文件名会不同但思路一致。用nano或vi打开文件找到以PS1开头的行可能不止一行if [ $color_prompt yes ]; then PS1${debian_chroot:($debian_chroot)}\[\033[01;32m\]\u\h\[\033[00m\]:\[\033[01;34m\]\w \$\[\033[00m\] else PS1${debian_chroot:($debian_chroot)}\u\h:\w\$ fi上面的第一段PS1用于彩色提示符第二段用于黑白终端两处都要改。这串字符里有三个特殊转义符\u用户、\h主机名和\w工作目录你可能全部或部分用到。其余如[\033[00m\]之类的都是颜色代码暂时忽略。对于简单场景只需把\h替换为想显示的主机名字符串if [ $color_prompt yes ]; then PS1${debian_chroot:($debian_chroot)}\[\033[01;32m\]\uruby-prod1\[\033[00m\]:\[\033[01;34m\]\w \$\[\033[00m\] else PS1${debian_chroot:($debian_chroot)}\uruby-prod1:\w\$ fi保存文件后用source让变量在当前会话生效source ~/.bashrc提示符立刻变成自定义主机名。这样每次连接服务器都能清楚地知道自己在哪避免在错误的环境里执行危险命令。如果想玩出更多花样市面上还有 PS1 生成器可以生成包含各种高级内容的提示符字符串并轻松定制颜色。用别名实现一键连接看到ruby-prod1能帮你记住当前在哪台服务器但能不能直接把ruby-prod1当作命令来连接当然可以在本机的.zshrc、.bash_profile等配置文件中加一行alias ruby-prod1ssh root192.168.0.122然后执行source ~/.zshrc使其生效。之后只需输入服务器名字即可连接完全跳过 ssh 命令ruby-prod1没有比这更省事的了与 Baremetal 部署的衔接完成以上所有步骤后你就具备了使用 Baremetal 部署的 SSH 基础。Redwood 的 Baremetal 部署正是模拟你手动做的事情SSH 连入远程服务器并执行命令。如果你能手动连上服务器Baremetal 也能。从源码看Baremetal 部署命令定义在 packages/cli/src/commands/deploy/baremetal.js它通过 packages/cli/src/commands/deploy/baremetal/SshExecutor.js 中封装的node-ssh库建立连接。连接参数host、port、username、password、privateKey、privateKeyPath、passphrase、agentForward与本文讲解的认证方式一一对应——例如agentForward: serverConfig.agentForward process.env.SSH_AUTH_SOCK就对应本文的 Agent Forwarding 概念部署时会把本机已加载到ssh-agent的密钥转发到远程服务器用于拉取 GitHub 私有仓库。Baremetal 的初始化配置由 packages/cli/src/commands/setup/deploy/providers/baremetal.js 生成deploy.toml、ecosystem.config.js和web/src/maintenance.html三个文件其中deploy.toml的 SSH 连接选项注释host、port、username、password、privateKey、privateKeyPath、passphrase、agentForward与本文内容完全一致。完成 SSH 学习后下一步可以参考仓库中的 Baremetal 部署指南 或 当前版本的 Baremetal 文档执行yarn rw setup deploy baremetal然后进行首次部署yarn rw deploy baremetal production --first-run小结本文完整覆盖了 SSH 连接远程服务器的全部基础三种认证方式用户名密码、私钥、公钥、首次连接的指纹确认、密钥对的生成与ssh-agent管理、将公钥部署到服务器、Agent Forwarding 与 Deploy Keys 两种 Git 访问方案以及提升日常效率的提示符自定义与连接别名。这些都是使用 Redwood Baremetal 部署自建服务器的必修课——连接服务器的能力决定了你能把应用部署到哪里。【免费下载链接】redwoodRedwoodGraphQL项目地址: https://gitcode.com/gh_mirrors/re/redwood创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表