Excalidraw是一个安全、支持多人协作的手写风格绘图工具。因为是开源项目,可以很方便的进行私有化部署。

前置准备

  • 一个域名:不管是万网、腾讯云、Cloudflare、Godaddy都可以注册。如果部署在国内的话,需要提前进行备案。
  • 一台服务器:腾讯云、阿里云、或者其他香港、日本、美国等地的 VPS 均可。
  • 域名解析平台:可以使用域名注册商自己的,也可以使用 DNSPod 、阿里云、 Cloudflare 。

系统安装准备

  1. 安装 Nginx,以我用的 Debian 系统为例:
apt install nginx
  1. 安装 Docker,还是以我用的 Debian 系统为例
# 删除部分旧的软件
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

# 添加 Docker 官方的 GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# 添加 Apt 仓库源
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

# 安装 Docker 服务
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. 安装 acme.sh ,方便申请 https 证书
curl https://get.acme.sh | sh -s email=my@example.com

申请https证书

我这里为了方便,直接申请通配符证书,这种方式由于需要添加 DNS 解析项,所以需要添加域名解析服务商的凭据,我这里使用的 Cloudflare,就以它为例。

Cloudflare的令牌申请可以参考 https://shiping.date/82.html 这篇文章。

# 上一步申请的令牌
export CF_Token="xxxxxxxxxxxx"
# Cloudflare 账号的邮箱
export CF_Email="xxx@xxx.com"
# 区域 id可以在具体域名管理页面右侧看到
export CF_Zone_ID="xxxxx"
# 用户 id,也可以在具体域名管理页面右侧看到
export CF_Account_ID="xxxx"

# 申请证书
acme.sh --issue --dns dns_cf -d aaa.me -d *.aaa.me

最终证书会存储在/root/.acme.sh/目录下,以我申请的为例,最终主要文件如下:

  • 证书: /root/.acme.sh/aaa.me_ecc/fullchain.cer
  • 证书 key: /root/.acme.sh/aaa.me_ecc/aaa.me.key

部署 Excalidraw-Room 服务

在自己的目录创建并保存如下docker-compose.yml文件:

services:
  excalidraw-room:
    image: excalidraw/excalidraw-room
    container_name: excalidraw-room
    ports:
      - "5001:80"
    restart: on-failure

通过命令启动服务:

docker compose up -d

如果需要关闭,可以运行如下命令:

docker compose down

配置 nginx

找到nginx配置文件目录,如果不知道的话,可以运行nginx -V命令,可以看到--conf-path=/etc/nginx/nginx.conf这样的字符串。

查看nginx.conf文件,可以看到如下的字符串,不同系统可能不一样:

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

我这里就可以添加/etc/nginx/sites-enabled/excalidraw-room配置文件,内容如下:

server {
    listen 80;
    listen [::]:80;

    server_name collab.aaa.me;

    # 所有的 http 请求都跳转到 https
    location / {
        return 301 https://$server_name$request_uri;
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443;

    server_name collab.aaa.me;

    # 配置https相关内容
    ssl_certificate "/root/.acme.sh/aaa.me_ecc/fullchain.cer";
    ssl_certificate_key "/root/.acme.sh/aaa.me_ecc/aaa.me.key";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 10m;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256::!MD5;
    ssl_protocols TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    add_header Strict-Transport-Security "max-age=31536000";

    location / {
        proxy_http_version 1.1;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
        proxy_set_header Host $host;
        proxy_set_header X-real-ip $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection upgrade;
        proxy_pass http://127.0.0.1:5001;
    }
}

然后运行nginx -t查看 nginx 配置文件是否正确。如果没有问题的话,运行nginx -s reload重载 nginx 服务即可。