在云服务器上托管 Map Blueprint

把你的实例放到一台常开的服务器上,一台在数据中心 7×24 全天候运行的电脑,这样远程队友就能从任何地方访问它,并拥有你自己的网址和免费的 HTTPS(那把加密连接的小锁)。本指南使用 Oracle Cloud 的永久免费套餐,它能让 Map Blueprint 零月费运行,不过同样的步骤适用于任何 Ubuntu 云服务器。

你最终将得到: 一台小型 Linux 服务器全天候运行 Map Blueprint,可通过类似 https://maps.yourdomain.com 的网址访问,由你的团队密码保护,并在重启后自动恢复运行。预计约需 20–30 分钟。下文凡是出现 YOUR_… 的地方,都请替换成你自己的值。

更想直接在自己的笔记本上运行它?请看本地托管指南

你会遇到的几个词: 服务器是一台始终运行、让别人能连接进来的电脑;SSH 是一种从你自己电脑安全地在那台远程电脑上输入命令的方式;域名是你的网址(如 yourdomain.com);DNS 是互联网的通讯录,负责把域名指向某台服务器;HTTPS 是网址的加密、带锁版本;反向代理隧道是给应用加上 HTTPS 的两种方式。别担心,下面每一步都会准确告诉你该怎么做。

第 1 步,创建一台免费服务器

  1. Oracle Cloud 免费套餐注册并登录控制台(Oracle 用来管理服务器的网站)。
  2. 进入 Compute → Instances → Create instance。「instance(实例)」不过是 Oracle 对服务器的叫法。
  3. 选择一个符合永久免费资格的 shape(服务器的规格,「shape」是 Oracle 的叫法)。两者皆可:VM.Standard.E2.1.Micro,或者内存更大的 Ampere Arm 规格。保持默认的 Ubuntu 镜像,Ubuntu 就是本指南所用的 Linux 版本。
  4. Add SSH keys 下,选择 Generate a key pair for me,并下载私钥,这个小文件是你登录时证明身份的凭证,所以请妥善保管。(已经有自己的密钥了?那就改为粘贴它的公钥部分。)
  5. 点击 Create。服务器运行起来后,复制它的公网 IP 地址(服务器在互联网上的编号),本指南称之为 YOUR_SERVER_IP

第 2 步,打开防火墙

防火墙会拦截意料之外的网络连接。Oracle 默认拦截入站的网页流量,所以你需要在两个标准的网页端口上放行它,80(普通网页)和 443(安全网页):

  1. 打开你的实例 → 点击它的 Virtual Cloud Network / subnetSecurity Lists → 默认列表。(这就是 Oracle 的防火墙。)
  2. 添加 Ingress Rules(「ingress」就是入站的意思),允许来自 0.0.0.0/0(意为「来自任何地方」)的 TCP 流量到达端口 80443
Oracle 上的 Ubuntu 还有它自己的本地防火墙。在第 3 步连接上之后,粘贴下面这三行来放行同样的两个端口(每一行是一条命令;第三行保存规则,让它在重启后依然有效):
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 443 -j ACCEPT
sudo netfilter-persistent save
如果你在第 5 步采用 Cloudflare Tunnel 方案,就完全可以跳过打开 80/443 端口这一步。

第 3 步,连接到服务器

现在你将用 SSH 从自己的电脑登录服务器并在上面输入命令。打开一个终端(在 Windows 上用 PowerShell,它已经自带 ssh),运行下面这条命令,把 -i 指向你下载的私钥文件:

ssh -i /path/to/YOUR_PRIVATE_KEY ubuntu@YOUR_SERVER_IP

在 Mac 或 Linux 上,如果你遇到关于密钥「权限过于开放」的错误,先运行 chmod 600 /path/to/YOUR_PRIVATE_KEY,它会收紧文件,使其只有你能读取,这正是 SSH 所要求的。

连接成功后(命令提示符现在显示的是服务器),安装最新的系统更新:

sudo apt update && sudo apt upgrade -y

sudo 的意思是「以管理员身份运行这条命令」;apt 是 Ubuntu 内置的应用安装器。

第 4 步,上传并启动 Map Blueprint

服务器上没有什么需要安装,不用 Docker,不用 Node,也不用 .env。它就是一个自包含的单一程序。从你自己的电脑(一个新的终端窗口,而不是 SSH 会话)里,在你解压下载文件的那个文件夹中运行下面命令,把 Linux 程序上传到服务器。scp 是「安全复制」,它通过同一条安全的 SSH 连接发送文件:

scp -i /path/to/YOUR_PRIVATE_KEY ./map-blueprint-linux ubuntu@YOUR_SERVER_IP:~/

回到 SSH 会话,把程序设为可运行并启动它。HOST=0.0.0.0 告诉它接受来自外部的连接,这样下一步的 HTTPS 才能访问到它:

chmod +x ~/map-blueprint-linux
HOST=0.0.0.0 ~/map-blueprint-linux

现在它正在端口 8080 上监听。等到 HTTPS 就位后(下一步),你会从浏览器里设置团队密码。眼下先按 Ctrl-C 停止它,第 6 步会把它变成一个 7×24 全天候运行的服务。

config.json 和你的 data/ 地图会被创建在你主文件夹(~/)里的程序旁边。所有设置都在应用内的设置页面里,没有任何文件需要编辑。

第 5 步,添加你的域名和免费 HTTPS

这款应用使用普通的 HTTP,并被设计为放在某个能为它加上 HTTPS(加密小锁)的东西后面。在下面这两种方案中选一个,方案 A 最容易保证安全。

方案 A,Cloudflare Tunnel(无需开放端口,最易保证安全)

隧道会让你的服务器主动连出到 Cloudflare,这样访问者就能通过 Cloudflare 访问应用,而你的服务器上无需开放任何端口。

  1. 把你的域名添加到一个免费的 Cloudflare 账户。
  2. 在服务器上,安装 cloudflared(Cloudflare 的隧道工具)并登录:
    curl -fsSL https://pkg.cloudflare.com/install.sh | sudo bash
    sudo apt install -y cloudflared
    cloudflared tunnel login
  3. 创建一个隧道,并把你选定的网址指向应用的本地端口:
    cloudflared tunnel create mapblueprint
    cloudflared tunnel route dns mapblueprint maps.YOURDOMAIN.com
  4. 在它的配置里让隧道把流量发送到 http://localhost:8080,然后把它安装为后台服务,使其始终运行:
    sudo cloudflared service install

Cloudflare 会自动为你创建并续期 HTTPS 证书,而且你服务器上没有任何东西被直接暴露,你可以让 80/443 端口保持关闭。

方案 B,Caddy 反向代理(自动证书)

Caddy 是一个小巧的网页服务器,它位于应用前面,为其加上 HTTPS,并把访问者转发给它,这正是反向代理所做的事。

  1. maps.YOURDOMAIN.com 设置一条 DNS A 记录,指向 YOUR_SERVER_IP。(「A 记录」就是把一个名称映射到服务器 IP 的 DNS 条目,在你的域名注册商或 DNS 提供商处设置。)
  2. 在服务器上安装 Caddy
  3. 把下面内容放进文件 /etc/caddy/Caddyfile(它告诉 Caddy:为这个网址提供服务,并把访问者转发给端口 8080 上的应用):
    maps.YOURDOMAIN.com {
        reverse_proxy localhost:8080
    }
  4. 重新加载 Caddy 以使更改生效:
    sudo systemctl reload caddy

Caddy 会自动为你获取并续期一份免费的 Let's Encrypt 证书。此方案需要打开 80 和 443 端口(第 2 步)。

一旦请求经由 HTTPS 到达,Map Blueprint 会自动把它的登录 cookie 标记为 Secure(它会读取上面两种方案都会设置的 X-Forwarded-Proto 头),因此登录无需额外设置即受保护。

访问 https://maps.YOURDOMAIN.com,你应该会看到登录页面。登录后把这个链接分享给你的团队。


可选,用 Cloudflare Zero Trust 进一步锁定

想要第二道、更强的锁?Cloudflare Zero Trust 的「Access」会把一个登录界面放在你的应用前面,这样陌生人根本接触不到 Map Blueprint,Cloudflare 会先核实你的身份。它与上面的方案 A(Cloudflare Tunnel)配合得最好,并且能让你按邮箱逐人授予访问权限,而不必共享同一个密码。对小团队来说它是免费的。

  1. 在 Cloudflare 控制台中,打开 Zero Trust(如果是第一次,先设置好免费套餐)。
  2. 进入 Access → Applications → Add an application → Self-hosted
  3. 把该应用的域名设为隧道所服务的同一个网址(maps.YOURDOMAIN.com)。
  4. 添加一条 Access policy,只允许你队友的邮箱地址(或一整个邮箱域名,如 @yourstudio.com),然后保存。
  5. 现在访问该站点时会显示一个 Cloudflare 登录界面,它会发送一次性 PIN 码到邮箱(或使用 Google / GitHub 登录)。只有被批准的人才能进入应用。

这与 Map Blueprint 的开发者在自己内部地图上所用的身份门禁是同一类。即使有人知道了你的网址,没有通过身份核验也无法加载应用,非常适合一张私密的工作室地图。


第 6 步,让它在重启后继续运行

最后,把应用变成一个服务,让它开机自启,并在它万一停止时自我重启。(「服务」是 Linux 在后台照看的一个程序。)把下面的文本保存为文件 /etc/systemd/system/map-blueprint.service

[Unit]
Description=Map Blueprint
After=network.target

[Service]
WorkingDirectory=/home/ubuntu
Environment=HOST=0.0.0.0
ExecStart=/home/ubuntu/map-blueprint-linux
Restart=always
User=ubuntu

[Install]
WantedBy=multi-user.target

然后把它打开,重新加载服务列表,启用并启动它,再检查它是否在运行:

sudo systemctl daemon-reload
sudo systemctl enable --now map-blueprint.service
sudo systemctl status map-blueprint.service

WorkingDirectory=/home/ubuntu 会把 config.json 和你的 data/ 地图保留在主文件夹里,就在程序旁边。现在打开 https://maps.YOURDOMAIN.com,完成首次运行的设置界面,并立刻设置你的团队密码。(更想提前设好?那就在服务文件里加上 Environment=APP_PASSWORD=YOUR_PASSWORD。)


安全清单

更新到新版本

当你拿到更新后的程序时,停止服务,替换程序文件,再重新启动它,你的 config.jsondata/ 地图会原封不动。从你的电脑上传新的 map-blueprint-linux(用 scp,如第 4 步),然后在服务器上运行:

sudo systemctl stop map-blueprint.service
chmod +x ~/map-blueprint-linux
sudo systemctl start map-blueprint.service