如何使用 SST 和 Docker 将 Nextjs 应用程序部署到 Hetzner VPS

我的原创博文:https://www.prudkohliad.com/articles/deploy-next-js-to-vps-using-sst-2024-08-11

sst 是一个框架,可以让您轻松在自己的基础设施上构建现代全栈应用程序。 sst v3 使用 pulumi 和 terraform – sst 文档

在本指南中,我们将使用 sst 和 docker 在 hetzner vps 上部署 next.js 应用程序。本指南是我上一篇文章的后续内容。如果您在这里发现一些没有意义的内容,您很有可能会在那里找到答案 – 如何使用 docker 和 github actions 将 next.js 应用程序部署到 hetzner 上的 vps。

将sst添加到项目中

要将 sst 添加到项目中,请运行以下命令:

pnpx sst@ion init

这将显示一个交互式提示。选择“是”,然后选择“aws”:

如何使用 SST 和 Docker 将 Nextjs 应用程序部署到 Hetzner VPS

sst 初始化输出 – 终端

确保安装了所有必需的软件包:

pnpm install

这将创建 sst.config.ts 文件,我们将在其中添加所有配置。

此外,还会创建一些其他文件/目录。让我们将它们添加到 .dockerignore,我们不希望它们最终成为 docker 镜像:

# sst.sstsst.config.tstsconfig.json

这就是 sst 配置文件当前的样子:

/// export default $config({  app(input) {    return {      name: "next-self-hosted",      removal: input?.stage === "production" ? "retain" : "remove",      home: "aws",    };  },  async run() {},});

我们不打算使用aws,所以让我们将home参数设置为“local”:

/// export default $config({  app(input) {    return {      name: "next-self-hosted",      removal: input?.stage === "production" ? "retain" : "remove",      home: "local",    };  },  async run() {},});

现在可以开始向 run() 函数添加东西​​了。

在 hetzner 上创建 api 令牌

为了使用 sst 在 hetzner 上创建 vps,我们需要一个 hetzner api 令牌。让我们生成一个新的。

在 hetzner 控制台中打开项目,导航到“安全”选项卡:

如何使用 SST 和 Docker 将 Nextjs 应用程序部署到 Hetzner VPS

项目安全设置 – hetzner cloud ui

生成 api 令牌:

如何使用 SST 和 Docker 将 Nextjs 应用程序部署到 Hetzner VPS

生成 api 令牌 – hetzner cloud ui

新的代币将添加到您的项目中:

如何使用 SST 和 Docker 将 Nextjs 应用程序部署到 Hetzner VPS

api 令牌 – hetzner cloud ui

令牌只会显示一次,请确保不要丢失。

添加 tls 和 hetzner 提供商:

pnpm sst add tlspnpm sst add hcloudpnpm install

生成 ssh 密钥

为了在创建 hetzner vps 后执行进一步的命令,我们需要确保在创建过程中添加了 ssh 密钥。为此,我们将在本地创建一个 ssh 令牌,然后将其公共部分添加到 hetzner。在run函数中添加以下代码:

// in the run() function:// generate an ssh keyconst sshkeylocal = new tls.privatekey("ssh key - local", {  algorithm: "ed25519",});// add the ssh key to hetznerconst sshkeyhetzner = new hcloud.sshkey("ssh key - hetzner", {  publickey: sshkeylocal.publickeyopenssh,});

部署应用程序:

pnpm sst deploysst ❍ ion 0.1.90  ready!➜  app:        next-self-hosted   stage:      antonprudkohliad~  deploy|  created     ssh key - local tls:index:privatekey|  created     ssh key - hetzner hcloud:index:sshkey✓  complete

您将看到一个新的 ssh 密钥已添加到 hetzner 中:

如何使用 SST 和 Docker 将 Nextjs 应用程序部署到 Hetzner VPS

ssh 密钥 – hetzner cloud ui

现在我们可以继续创建 vps 了。

创建服务器

以下命令将确保在您的项目中创建新的 vps:

// in the run() function:// create a server on hetznerconst server = new hcloud.server("server", {  image: "docker-ce",  servertype: "cx22",  location: "nbg1",  sshkeys: [sshkeyhetzner.id],});

这里我使用 docker-ce 镜像,因为它已经安装了 docker。您可以使用 hetzner cloud api 列出所有可用的图像、服务器类型和数据中心。

验证服务器是否正确创建:

pnpm sst deploysst ❍ ion 0.1.90  ready!➜  app:        next-self-hosted   stage:      antonprudkohliad~  deploy|  created     server hcloud:index:server (34.5s)✓  complete

您还应该能够在控制台中看到新创建的服务器:

如何使用 SST 和 Docker 将 Nextjs 应用程序部署到 Hetzner VPS

服务器 – hetzner cloud ui

连接到 vps 上的 docker 服务器

为了在 vps 上构建应用程序 docker 镜像并能够创建网络、卷和容器,我们需要在本地计算机和 vps 上的 docker server 之间建立一座桥梁。为此,我们需要 docker 提供商:

pnpm sst add dockerpnpm install

将 ssh 私钥存储在磁盘上,以便 ssh 客户端可以访问它。创建与 vps 上 docker 服务器的连接:

// at the top of the file:import { resolve as pathresolve } from "node:path";import { writefilesync as fswritefilesync } from "node:fs";// in the run() function:// store the private ssh key on disk to be able to pass it to the docker// providerconst sshkeylocalpath = sshkeylocal.privatekeyopenssh.apply((k) => {  const path = "id_ed25519_hetzner";  fswritefilesync(path, k, { mode: 0o600 });  return pathresolve(path);});// connect to the docker server on the hetzner serverconst dockerserverhetzner = new docker.provider("docker server - hetzner", {  host: $interpolate`ssh://root@${server.ipv4address}`,  sshopts: ["-i", sshkeylocalpath, "-o", "stricthostkeychecking=no"],});

确保还将 ssh 私钥 id_ed25519_hetzner 添加到 .gitignore 和 .dockerignore,这样它就不会进入您的 github 存储库和 docker 镜像。

触发部署以验证更改:

pnpm sst deploysst ❍ ion 0.1.90  ready!➜  app:        next-self-hosted   stage:      antonprudkohliad~  deploy|  created     docker server - hetzner pulumi:providers:docker✓  complete

构建 docker 镜像

现在我们可以在删除的 docker 服务器上构建 docker 镜像了:

// in the run() function:// build the docker imageconst dockerimagehetzner = new docker.image(  "docker image - app - hetzner",  {    imagename: "next-self-hosted/next-self-hosted:latest",    build: {      context: pathresolve("./"),      dockerfile: pathresolve("./dockerfile"),      target: "production",      platform: "linux/amd64",    },    skippush: true,  },  {    provider: dockerserverhetzner,    dependson: [server],  });

让我们触发部署看看一切是否正常:

pnpm sst deploysst ❍ ion 0.1.90  ready!➜  app:        next-self-hosted   stage:      antonprudkohliad~  deploy|  log         starting docker build|  log         image built successfully, local id "sha256:629a6cdfc298c74599a3056278e31c64197a87f6d11aab09573bc9171d2f3362"|  created     docker image - app - hetzner docker:index:image (36.0s)✓  complete

现在,让我们检查 docker 镜像是否已到达服务器:

ssh root@116.203.183.180 -i ./id_ed25519_hetzner -o stricthostkeychecking=no -c "docker image ls"repository                          tag       image id       created              sizenext-self-hosted/next-self-hosted   latest    629a6cdfc298   about a minute ago   712mb

太棒了!

docker 网络

我们将创建两个网络:公共网络和内部网络。公共网络用于 nginx 连接的服务,即必须暴露于外部的服务(例如 next.js 应用程序或 api 服务器)。内部网络用于不应该暴露给外部的服务,例如postgres数据库、redis缓存:

// in the run() function:// setup docker networksconst dockernetworkpublic = new docker.network(  "docker network - public",  { name: "app_network_public" },  { provider: dockerserverhetzner, dependson: [server] });const dockernetworkinternal = new docker.network(  "docker network - internal",  { name: "app_network_internal" },  { provider: dockerserverhetzner, dependson: [server] });

触发部署:

pnpm sst deploysst ❍ ion 0.1.90  ready!➜  app:        next-self-hosted   stage:      antonprudkohliad~  deploy|  created     docker network - public docker:index:network (2.3s)|  created     docker network - internal docker:index:network (3.1s)✓  complete

检查网络 app_network_internal 和 app_network_public 是否存在于远程:

ssh root@116.203.183.180 -i ./id_ed25519_hetzner -o stricthostkeychecking=no -c "docker network ls"network id     name                   driver    scope0590360bd4ae   app_network_internal   bridge    locale3bd8be72506   app_network_public     bridge    local827fa5ca5de2   bridge                 bridge    localdc8880514199   host                   host      localf1481867db18   none                   null      local

docker 卷

我们将创建一个卷来存储应用程序构建文件(.next 文件夹):

// in the run() function:// setup docker volumesconst dockervolumeappbuild = new docker.volume(  "docker volume - app build",  { name: "app_volume_build" },  { provider: dockerserverhetzner, dependson: [server] });

部署并验证 docker 卷 app_volume_build 是否存在于 vps 上:

pnpm sst deploysst ❍ ion 0.1.90  ready!➜  app:        next-self-hosted   stage:      antonprudkohliad~  deploy|  created     docker volume - app build docker:index:volume✓  completessh root@116.203.183.180 -i ./id_ed25519_hetzner -o stricthostkeychecking=no -c "docker volume ls"driver    volume namelocal     app_volume_build

构建容器

我们将运行一个一次性容器(也称为 init 容器)来构建 next.js 应用程序并将结果存储在 .next 文件夹中,该文件夹将通过我们上面创建的卷与主应用程序容器共享:

// in the run() function:// run a one-off container to build the appconst dockerappbuildcontainer = new docker.container(  "docker container - app build",  {    name: "app_container_build",    image: dockerimagehetzner.imagename,    volumes: [      {        volumename: dockervolumeappbuild.name,        containerpath: "/app/.next",      },    ],    command: ["pnpm", "build"],    mustrun: true,  },  {    provider: dockerserverhetzner,  });

部署并通过日志验证构建是否成功:

pnpm sst deploysst ❍ ion 0.1.90  ready!➜  app:        next-self-hosted   stage:      antonprudkohliad~  deploy|  created     docker container - app build docker:index:container (1.1s)✓  completessh root@116.203.183.180 -i ./id_ed25519_hetzner -o stricthostkeychecking=no -c "docker logs -f app_container_build"> next-self-hosted@ build /app> next build  ▲ next.js 14.2.5   creating an optimized production build ... ✓ compiled successfully   linting and checking validity of types ...   collecting page data ...   generating static pages (0/4) ...   generating static pages (1/4)   generating static pages (2/4)   generating static pages (3/4) ✓ generating static pages (4/4)   finalizing page optimization ...   collecting build traces ...route (app)                              size     first load js┌ ○ /                                    142 b          87.2 kb└ ○ /_not-found                          871 b          87.9 kb+ first load js shared by all            87 kb  ├ chunks/52d5e6ad-40eff88d15e66edb.js  53.6 kb  ├ chunks/539-e1fa9689ed3badf0.js       31.5 kb  └ other shared chunks (total)          1.84 kb○  (static)  prerendered as static content

应用程序容器

现在我们将添加一个“runner”容器,它将使用构建容器的构建输出,并在下次启动时运行:

// in the run() function:const dockerappcontainer = new docker.container(  "docker container - app",  {    name: "app",    image: dockerimagehetzner.imagename,    volumes: [      {        volumename: dockervolumeappbuild.name,        containerpath: "/app/.next",      },    ],    networksadvanced: [      { name: dockernetworkpublic.id },      { name: dockernetworkinternal.id },    ],    command: ["pnpm", "start"],    restart: "always",  },  { provider: dockerserverhetzner, dependson: [dockerappbuildcontainer] });

部署并验证应用是否启动成功:

pnpm sst deploysst ❍ ion 0.1.90  ready!➜  app:        next-self-hosted   stage:      antonprudkohliad~  deploy|  created     docker container - app docker:index:container (1.1s)✓  completessh root@116.203.183.180 -i ./id_ed25519_hetzner -o stricthostkeychecking=no -c "docker logs -f app"> next-self-hosted@ start /app> next start  ▲ next.js 14.2.5  - local:        http://localhost:3000 ✓ starting... ✓ ready in 497ms

应用程序容器可能会失败,因为构建容器尚未完成构建,但它很快就会恢复并正常运行。

添加 cloudflare 证书

为了将文件上传到vps,我们需要安装命令提供程序和polumi包:

pnpm sst add @pulumi/commandpnpm add -d @pulumi/pulumipnpm install

确保 vps 上存在 /root/app 和 /root/app/certs 目录并上传 cloudflare origin server 证书:

// at the top of the fileimport { asset as pulumiasset } from "@pulumi/pulumi";// in the run() function:// make sure that app directory existsnew command.remote.command("command - ensure app directory", {  create: "mkdir -p /root/app",  connection: {    host: server.ipv4address,    user: "root",    privatekey: sshkeylocal.privatekeyopenssh,  },});// make sure that app/certs directory existsnew command.remote.command("command - ensure app/certs directory", {  create: "mkdir -p /root/app/certs",  connection: {    host: server.ipv4address,    user: "root",    privatekey: sshkeylocal.privatekeyopenssh,  },});// copy certificates to the vpsnew command.remote.copytoremote(  "copy - certificates - key",  {    source: new pulumiasset.fileasset(      pathresolve("./certs/cloudflare.key.pem")    ),    remotepath: "/root/app/certs/cloudflare.key.pem",    connection: {      host: server.ipv4address,      user: "root",      privatekey: sshkeylocal.privatekeyopenssh,    },  });new command.remote.copytoremote(  "copy - certificates - cert",  {    source: new pulumiasset.fileasset(      pathresolve("./certs/cloudflare.cert.pem")    ),    remotepath: "/root/app/certs/cloudflare.cert.pem",    connection: {      host: server.ipv4address,      user: "root",      privatekey: sshkeylocal.privatekeyopenssh,    },  });new command.remote.copytoremote(  "copy - certificates - authenticated origin pull",  {    source: new pulumiasset.fileasset(      pathresolve("./certs/authenticated_origin_pull_ca.pem")    ),    remotepath: "/root/app/certs/authenticated_origin_pull_ca.pem",    connection: {      host: server.ipv4address,      user: "root",      privatekey: sshkeylocal.privatekeyopenssh,    },  });

启动 nginx

复制 nginx 配置文件到 vps 并启动 nginx 容器:

// in the run() function:// copy nginx config to the vpsconst commandcopynginxconfig = new command.remote.copytoremote(  "copy - nginx config",  {    source: new pulumiasset.fileasset(      pathresolve("./nginx/production.conf")    ),    remotepath: "/root/app/nginx.conf",    connection: {      host: server.ipv4address,      user: "root",      privatekey: sshkeylocal.privatekeyopenssh,    },  });// run the nginx containerconst dockernginxcontainer = new docker.container(  "docker container - nginx",  {    name: "app_container_nginx",    image: "nginx:1.27.0-bookworm",    volumes: [      {        hostpath: "/root/app/nginx.conf",        containerpath: "/etc/nginx/nginx.conf",      },      {        hostpath: "/root/app/certs",        containerpath: "/certs",      },    ],    command: ["nginx", "-g", "daemon off;"],    networksadvanced: [{ name: dockernetworkpublic.id }],    restart: "always",    ports: [      {        external: 443,        internal: 443,      },    ],    healthcheck: {      tests: ["cmd", "service", "nginx", "status"],      interval: "30s",      timeout: "5s",      retries: 5,      startperiod: "10s",    },  },  { provider: dockerserverhetzner, dependson: [dockerappcontainer] });return { ip: server.ipv4address };

部署并验证 nginx 容器是否正在运行:

pnpm sst deploysst ❍ ion 0.1.90  ready!➜  app:        next-self-hosted   stage:      antonprudkohliad~  deploy|  deleted     docker container - app build docker:index:container|  created     command - ensure app/certs directory command:remote:command|  created     command - ensure app directory command:remote:command|  created     docker container - app build docker:index:container|  created     copy - certificates - cert command:remote:copytoremote (1.2s)|  created     copy - nginx config command:remote:copytoremote (1.2s)|  created     copy - certificates - key command:remote:copytoremote (1.2s)|  created     copy - certificates - authenticated origin pull command:remote:copytoremote (1.2s)|  deleted     docker container - app docker:index:container|  created     docker container - app docker:index:container (1.2s)|  created     docker container - nginx docker:index:container (7.1s)✓  complete   ip: 116.203.183.180ssh root@116.203.183.180 -i ./id_ed25519_hetzner -o stricthostkeychecking=no -c "docker ps -a"container id   image                                      command                  created         status                     ports                          names9c2cb18db304   nginx:1.27.0-bookworm                      "/docker-entrypoint.…"   3 minutes ago   up 3 minutes (healthy)     80/tcp, 0.0.0.0:443->443/tcp   app_container_nginx32e6a4cee8bc   next-self-hosted/next-self-hosted:latest   "docker-entrypoint.s…"   4 minutes ago   up 3 minutes               3000/tcp                       appf0c50aa32493   next-self-hosted/next-self-hosted:latest   "docker-entrypoint.s…"   4 minutes ago   exited (0) 3 minutes ago                                  app_container_build

可以看到,nginx 和应用程序运行顺利。

最后检查

是时候确保 dns 记录指向正确的 ip 地址了(是的,也可以通过 cloudflare 提供商将其添加到 sst 配置中):

dns settings – cloudflare ui

dns 设置 – cloudflare ui

然后,我们可以打开应用程序并验证它是否有效:

如何使用 SST 和 Docker 将 Nextjs 应用程序部署到 Hetzner VPS

浏览器中的应用程序

恭喜!我们现在已经完成了 sst 潜水,可以享受新部署的应用程序了?

清理

sst 使得清理变得非常容易 – 只需运行 pnpm sst remove ,整个设置就会消失:

pnpm sst removeSST ❍ ion 0.1.90  ready!➜  App:        next-self-hosted   Stage:      antonprudkohliad~  Remove|  Deleted     Docker Container - Nginx docker:index:Container (1.9s)|  Deleted     Docker Container - App docker:index:Container|  Deleted     Docker Container - App Build docker:index:Container|  Deleted     Docker Image - App - Hetzner docker:index:Image|  Deleted     Docker Volume - App Build docker:index:Volume (2.1s)|  Deleted     Docker Network - Public docker:index:Network (3.1s)|  Deleted     Docker Network - Internal docker:index:Network (3.2s)|  Deleted     Copy - Nginx Config command:remote:CopyToRemote|  Deleted     Docker Server - Hetzner pulumi:providers:docker|  Deleted     Copy - Certificates - Authenticated Origin Pull command:remote:CopyToRemote|  Deleted     Command - Ensure app/certs directory command:remote:Command|  Deleted     Copy - Certificates - Key command:remote:CopyToRemote|  Deleted     Command - Ensure app directory command:remote:Command|  Deleted     Copy - Certificates - Cert command:remote:CopyToRemote|  Deleted     Server hcloud:index:Server (16.8s)|  Deleted     SSH Key - Hetzner hcloud:index:SshKey|  Deleted     SSH Key - Local tls:index:PrivateKey✓  Removed

以上就是如何使用 SST 和 Docker 将 Nextjs 应用程序部署到 Hetzner VPS的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1490313.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
使用 Nextjs 构建中间件
上一篇 2025年12月19日 13:05:41
掌握 JavaScript:了解调用、应用和绑定
下一篇 2025年12月19日 13:05:53

相关推荐

  • sublime怎么分屏对比两个文件_Sublime多窗口分屏进行文件内容对比技巧

    sublime怎么分屏对比两个文件_Sublime多窗口分屏进行文件内容对比技巧sublime怎么分屏对比两个文件_Sublime多窗口分屏进行文件内容对比技巧sublime怎么分屏对比两个文件_Sublime多窗口分屏进行文件内容对比技巧sublime怎么分屏对比两个文件_Sublime多窗口分屏进行文件内容对比技巧

    最直接的方法是使用Sublime Text的分屏布局功能,通过View → Layout选择Columns: 2等布局,将两个文件分别拖入不同面板进行对比;为进一步提升效率,可安装SublimeFileDiffs插件实现差异高亮比对,并结合快捷键、多视图管理与项目保存优化工作流。 Sublime T…

    2026年9月28日 • 用户投稿
    000
  • linux怎么运行脚本

    linux怎么运行脚本linux怎么运行脚本linux怎么运行脚本linux怎么运行脚本

    要在 Linux 中运行脚本,请先确保脚本具有可执行权限(ls -l script_name),然后通过以下几种方法运行脚本:命令行(./script_name)、Bash 命令(bash script_name)、Python 命令(python script_name.py)。脚本可以从命令行接…

    2026年9月28日 • 用户投稿
    000
  • sublime怎么设置默认语法高亮_Sublime为不同文件类型设置默认语法

    sublime怎么设置默认语法高亮_Sublime为不同文件类型设置默认语法sublime怎么设置默认语法高亮_Sublime为不同文件类型设置默认语法sublime怎么设置默认语法高亮_Sublime为不同文件类型设置默认语法sublime怎么设置默认语法高亮_Sublime为不同文件类型设置默认语法

    可通过点击右下角语法名称并选择“Open all with current extension as…”为相同扩展名文件设置默认高亮;2. 编辑Preferences.sublime-settings用户配置添加extensions映射可实现全局绑定,如将.myjs关联至JavaScri…

    2026年9月28日 • 用户投稿
    000
  • PS5Pro强劲表现!《生化9》与《虚实万象》均稳60帧

    PS5Pro强劲表现!《生化9》与《虚实万象》均稳60帧PS5Pro强劲表现!《生化9》与《虚实万象》均稳60帧PS5Pro强劲表现!《生化9》与《虚实万象》均稳60帧PS5Pro强劲表现!《生化9》与《虚实万象》均稳60帧

    在2025年德国科隆举行的gamescom游戏展上,技术分析权威团队digital foundry(df)亲临现场,试玩了多款即将推出的大作。其中,capcom旗下两款备受关注的新作——《生化危机:安魂曲》与《虚实万象》——在ps5 pro开发机上的表现尤为亮眼。 据DF成员约翰·林尼曼(John …

    2026年9月28日 • 用户投稿
    100
  • 如何通过容器化技术提升应用部署效率?

    如何通过容器化技术提升应用部署效率?如何通过容器化技术提升应用部署效率?如何通过容器化技术提升应用部署效率?如何通过容器化技术提升应用部署效率?

    容器化技术通过打包应用及所有依赖,实现环境一致性,彻底解决“在我机器上能跑”的问题。Docker将应用封装为独立镜像,在任何服务器上都能可靠运行;Kubernetes则通过声明式配置实现自动化部署、扩缩容和自愈,极大提升效率与可靠性。实践中需避免镜像过大、网络配置复杂、持久化存储处理不当、资源限制缺…

    2026年9月28日 • 用户投稿
    000
  • linux怎么安装docker

    linux怎么安装dockerlinux怎么安装dockerlinux怎么安装dockerlinux怎么安装docker

    如何在 Linux 上安装 Docker?步骤如下:检查先决条件:内核版本 3.10+、RAM ≥ 2GB、稳定网络。安装依赖项:Ubuntu/Debian:apt-get install apt-transport-https…;CentOS/Red Hat:yum install y…

    2026年9月28日 • 用户投稿
    000
  • sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符

    sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符

    在Sublime Text中替换换行需启用正则模式,用n或R表示换行符。开启”.*”按钮后,查找用n、rn或R匹配不同换行格式,替换时用n插入换行,如将逗号替换为n可实现分行效果。 在Sublime Text中进行查找替换时,如果需要使用换行符,可以通过正则表达式模式来实现。…

    2026年9月28日 • 用户投稿
    100
  • linux怎么进入shell

    linux怎么进入shelllinux怎么进入shelllinux怎么进入shelllinux怎么进入shell

    有五种方法可以进入 Linux shell:打开终端窗口、使用 shell 命令、从桌面环境切换、通过 SSH、从引导菜单进入。 如何进入 Linux Shell Linux shell 是一个命令行界面,用户可以使用文本命令与操作系统交互。以下是一些进入 Linux shell 的方法: 1. 打…

    2026年9月28日 • 用户投稿
    000
  • sublime prettier插件配置_Prettier代码格式化插件配置指南

    sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南

    首先安装JsPrettier插件并配置prettier_cli_path和node_path路径,设置format_on_save_enabled为true以实现保存时自动格式化,确保prettier_options与项目规则一致,推荐在项目中本地安装Prettier并通过快捷键Ctrl+Alt+F…

    2026年9月28日 • 用户投稿
    000
  • 玩家请愿《往日不再2》签名近24万 索尼续作决策引争议!

    玩家请愿《往日不再2》签名近24万 索尼续作决策引争议!玩家请愿《往日不再2》签名近24万 索尼续作决策引争议!玩家请愿《往日不再2》签名近24万 索尼续作决策引争议!玩家请愿《往日不再2》签名近24万 索尼续作决策引争议!

    《往日不再》被广泛视为索尼旗下最具潜力却遭冷遇的ip之一,近期因续作迟迟未现再度引发玩家热议。这款原本规划为三部曲的开放世界游戏,因索尼对项目缺乏支持而止步于首作,甚至连开发团队bend studio都因顾虑被拒,未曾正式提交续作提案。 与此同时,Bend Studio曾被指派开发一款实时服务型游戏…

    2026年9月28日 • 用户投稿
    000
  • linux换行符怎么打

    linux换行符怎么打linux换行符怎么打linux换行符怎么打linux换行符怎么打

    在 Linux 中,换行符表示当前行结束,通常用 ASCII 码 10 (LF) 表示。在命令行中,可以通过按 Enter 键、使用 “n” 字符串或按 Shift+Enter 来打换行符。换行符用于将输出分隔到新行、创建多行命令,或在文本文件中创建新行。 Linux 中的换…

    2026年9月28日 • 用户投稿
    000
  • linux怎么在jvm启动参数

    linux怎么在jvm启动参数linux怎么在jvm启动参数linux怎么在jvm启动参数linux怎么在jvm启动参数

    在 Linux 中设置 JVM 启动参数可以通过编辑启动脚本,使用 -javaagent 或 -D 标记添加参数。常用参数包括:-Xmx(设置最大堆内存大小)、-Xms(设置初始堆内存大小)、-XX:+UseG1GC(指定 G1 垃圾收集器)、-Dlog4j.configurationFile=lo…

    2026年9月28日 • 用户投稿
    100
  • sublime怎么多行编辑_Sublime多光标与多行编辑技巧详解

    sublime怎么多行编辑_Sublime多光标与多行编辑技巧详解sublime怎么多行编辑_Sublime多光标与多行编辑技巧详解sublime怎么多行编辑_Sublime多光标与多行编辑技巧详解sublime怎么多行编辑_Sublime多光标与多行编辑技巧详解

    掌握Sublime Text多光标与列编辑技巧可大幅提升效率:1. 按Ctrl/Cmd点击或Ctrl+Alt+方向键添加多光标;2. 用Ctrl+D选相同词,Ctrl+Shift+L拆分多行;3. Shift+Alt拖动实现列选择;4. 应用于批量加符号、生成代码、对齐数据等场景。 Sublime …

    2026年9月28日 • 用户投稿
    100
  • linux怎么显示隐藏文件

    linux怎么显示隐藏文件linux怎么显示隐藏文件linux怎么显示隐藏文件linux怎么显示隐藏文件

    可以通过以下方法在 Linux 中显示隐藏文件:使用 ls 命令:ls -a 或 ls -al;使用 grep 命令:ls | grep .;使用 find 命令:find . -name “.*”;使用文件管理器:通过启用显示隐藏文件的选项。 如何显示 Linux 中的隐藏…

    2026年9月28日 • 用户投稿
    000
  • 如何用豆包AI生成Python环境配置代码

    如何用豆包AI生成Python环境配置代码如何用豆包AI生成Python环境配置代码如何用豆包AI生成Python环境配置代码如何用豆包AI生成Python环境配置代码

    豆包ai可辅助生成python环境配置代码。1. 首先明确项目需求,如python版本、依赖库和虚拟环境类型;2. 向豆包ai输入具体提示词,获取创建venv和requirements.txt的命令;3. 如需复杂配置,可要求生成开发与生产环境分离的依赖文件;4. 注意版本控制、输出验证及通过多轮交…

    2026年9月28日 • 用户投稿
    100
  • 【Linux笔记】系统目录结构

    【Linux笔记】系统目录结构【Linux笔记】系统目录结构【Linux笔记】系统目录结构【Linux笔记】系统目录结构

    前言 在Linux或Unix操作系统中,所有的文件和目录都是以一个根节点开始的倒置树状结构组织起来的。文件系统的最高层是根目录,用/表示。根目录下可以包含目录和文件,每个目录又可以包含子目录和文件,这样反复构建起一个庞大的文件系统。 在超级用户模式下,在根目录/下执行ls命令,输出如下(本文演示的L…

    2026年9月28日 • 用户投稿
    200
  • sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作

    sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作

    Sublime Text中行注释快捷键为Ctrl + /(Windows/Linux)或Cmd + /(macOS),用于单行或多行代码的快速注释与取消;块注释快捷键为Ctrl + Shift + / 或Cmd + Shift + /,可将选中代码块用语言特定符号包裹。 在Sublime Text中…

    2026年9月28日 • 用户投稿
    100
  • linux怎么连接服务器

    linux怎么连接服务器linux怎么连接服务器linux怎么连接服务器linux怎么连接服务器

    使用 SSH 命令连接到服务器的方法有:使用命令行提示符输入“ssh username@server_address”并提供密码。使用密钥认证生成密钥对,将公钥添加到服务器,下次连接时无需输入密码。使用 GUI 工具(如 PuTTY)来管理 SSH 连接和存储密钥。 如何通过 Linux 连接到服务…

    2026年9月28日 • 用户投稿
    100
  • 如何通过服务禁用减少系统启动时间?

    如何通过服务禁用减少系统启动时间?如何通过服务禁用减少系统启动时间?如何通过服务禁用减少系统启动时间?如何通过服务禁用减少系统启动时间?

    精简开机自启动服务可显著缩短系统启动时间。通过禁用非必要的第三方或冗余服务,减轻系统引导负担,释放CPU、内存等资源,提升整体响应速度与电池续航。在Windows中使用services.msc或任务管理器管理服务与启动项,Linux下则用systemctl命令控制服务启停。操作时应从第三方软件入手,…

    2026年9月28日 • 用户投稿
    300
  • sublime怎么显示函数列表_Sublime Text快速跳转到函数或符号定义

    sublime怎么显示函数列表_Sublime Text快速跳转到函数或符号定义sublime怎么显示函数列表_Sublime Text快速跳转到函数或符号定义sublime怎么显示函数列表_Sublime Text快速跳转到函数或符号定义sublime怎么显示函数列表_Sublime Text快速跳转到函数或符号定义

    使用Ctrl+R或Cmd+R调用内置符号跳转功能,可快速定位当前文件的函数、类等定义;通过安装CTags、Symbol Browser或SublimeCodeIntel等插件,能实现跨文件跳转与更精准识别;配合LSP插件启用Goto Definition(F12),可获得类似IDE的智能跳转体验,显…

    2026年9月28日 • 用户投稿
    400

发表回复

登录后才能评论
关注微信