2026 年如何用树莓派托管网站?4 步操作指南来了!

2026 年如何用树莓派托管网站?4 步操作指南来了!

2026 年 4 月 18 日,博主马丁分享了如何在树莓派上托管网站。他刚好买了个域名,还有个闲置的树莓派,于是开始搭建网站。之前他在 Astro 和 Svelte 之间犹豫,最终选择了 Astro,他觉得用 Astro 搭建简单网站很棒,不过这事儿(也许)以后再说。

有人可能会问,这明明是个静态网站,为啥要用树莓派呢?原来,有个特定的库在 Vercel 上无法使用,而且它实际上是动态的,并非静态。他之前搭建的另一个网站(也托管在这个子域名和树莓派上)就用到了这个库(用于国际化),尽管它没人维护了,但用起来还挺不错。

下面具体讲讲它是如何运行的,这不是一份详尽的指南,而是开始自行托管用 Node.js 框架搭建的网站的参考。

步骤 1:端口转发

首先,要确保路由器设置将 IP 地址转发到树莓派的 IP 地址。可以在谷歌上搜索相关内容,不同路由器的设置方法不同,最好了解所用路由器的具体设置方式。

接下来,将仓库 `git pull` 到树莓派上。

然后,安装 Caddy 并将以下内容添加到 Caddyfile 中(或类似文件):

m4rt.nl {
root * /home/mart/Documents/m4rt.nl # 将此路径改为你网站的实际根目录
file_server
reverse_proxy localhost:4321 # Astro 使用 4321,Svelte/Kit 使用 5173,React 使用 3000
}

确保重新加载 Caddyfile,具体设置方法可在谷歌上查找。

步骤 2:配置 DNS

购买域名后,前往域名提供商处添加一条新记录:

A - yoursite.com - 路由器的公网 IP 地址

这样,路由器就会自动将传入的流量从其 IP 地址重定向到网站。

步骤 3:构建并部署网站

需要将网站打包成 JavaScript 文件,通常运行 `npm run build`(或喜欢的包管理器命令)即可。这会创建一个名为 `dist` 或 `out` 之类的目录。打开这个目录,找到入口文件,通常名为 `entry.cjs` 或 `entry.mjs`。

完成上述操作后,安装 pm2。pm2 是一个服务,可让 Node.js 应用持续运行,直到手动停止。可以使用简单的命令 `npm i -g pm2` 进行安装。

现在,进入 `dist` 目录并运行 `pm2 run entry.mjs`。搞定,网站现在应该已经上线啦!

步骤 4:高级持续集成

和 Vercel 相比,这里有个问题:如果提交了代码,网站不会自动构建。幸运的是,有 GitHub Actions 来解决这个问题。

为此,需要创建一个名为 `.github` 的新目录,在其中再创建一个名为 `workflows` 的目录。在这个目录下创建一个文件,比如 `update_server.yml`,也可以随意命名。在文件中添加以下内容:

name: Update server code and restart the server
on: [push]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Update server code and restart the server
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.HOST }}
username: your-username # 这是树莓派上的 sudo 用户的用户名!
password: ${{ secrets.PASSWORD }}
script: |
~/bin/pull-all.sh

现在,进入仓库设置,点击 Actions secrets(![Actions secrets](/blog-assets/actions-secrets.png))。

点击 New secrets,添加名为 `HOST` 的密钥,其值为树莓派的主机 IP 地址,以及 `PASSWORD`。

然后,在 `bin` 目录下创建一个脚本,命名为 `pull-all.sh`,内容如下:

#!/usr/bin/env bash
set -euo pipefail

BASE_DIR="$HOME/Documents" # 改为常用的目录

# 这些是为两个网站使用的端口,根据需要进行更改。最好手动设置,因为 Linux 系统软件也会使用一些端口,不想覆盖它们。
PORTS=(4321 4322)
PORT_COUNT=${#PORTS[@]}
PORT_INDEX=0

echo "updating git repositories..."

# 检查目录是否为仓库并拉取最新更改
for dir in "$BASE_DIR"/*/ ; do
if [[ -d "$dir/.git" ]]; then
echo "→ Entering $dir"
( cd "$dir" && git pull )
fi
done

echo -e "building websites with assigned ports..."

for dir in "$BASE_DIR"/*/ ; do
# 检查是否为 Node.js 项目,如果你使用 Deno,可能需要更改此条件
if [[ -f "$dir/package.json" ]]; then
CURRENT_PORT=${PORTS[$PORT_INDEX]}

echo "building in $dir using PORT: $CURRENT_PORT"

(
cd "$dir"
npm run build -- --port "$CURRENT_PORT"
)

PORT_INDEX=$(( (PORT_INDEX + 1) % PORT_COUNT ))
fi
done

echo -e "restarting pm2..."
pm2 restart all

就这么多啦!感谢阅读,祝你有美好的一天。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值