如何在 Ubuntu 22.04 上安装标准 Notes 服务器
在此页
- 先决条件
- 第 1 步 - 配置防火墙
- 第 2 步 - 安装 Docker 和 Docker Compose
- 第 3 步 - 安装 Nginx
- 第 4 步 - 安装 SSL
- 第 5 步 - 下载和配置标准注释
- 第 6 步 - 启动标准 Notes 服务器
- 第 7 步 - 配置 Nginx
- 第 8 步 - 使用标准注释
- 第 9 步 - 启用付费功能
- 第 10 步 - 为文件上传配置服务器
- 第 11 步 - 测试文件上传
- 结论
Standard Notes 是一款开源且完全加密的笔记应用程序。它提供免费和付费计划,并提供云托管和将其托管在您的服务器上的选项。您可以使用您的服务器来同步存储在不同设备之间的笔记。 Standard Notes 为所有桌面操作系统和移动平台提供应用程序。
在本教程中,您将学习如何在 Ubuntu 22.04 机器上自行托管您的标准笔记服务器。您还将了解如何在自托管实例上激活付费计划功能和文件上传。
先决条件
-
A server running Ubuntu 22.04 with a minimum of 2 GB of RAM.
-
A non-root user with sudo privileges.
-
The Uncomplicated Firewall(UFW) is enabled and running.
-
A Fully Qualified domain name pointed to the server. For our tutorial, we will be using the domain
standardnotes.example.com
. You will need another domain name for your file server. We will be using the domainsnotes-files.example.com
. -
Everything is updated.
$ sudo apt update && sudo apt upgrade
第 1 步 - 配置防火墙
安装任何包之前的第一步是配置防火墙以允许 HTTP 和 HTTPS 连接。
检查防火墙的状态。
$ sudo ufw status
您应该会看到如下内容。
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
允许 HTTP 和 HTTPs 端口。
$ sudo ufw allow http
$ sudo ufw allow https
再次检查状态以确认。
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
第 2 步 - 安装 Docker 和 Docker Compose
添加 Dockers 官方 GPG 密钥。
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
运行以下命令以添加 Docker 存储库。
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
更新系统以包含 Dockers 存储库。
$ sudo apt update
安装泊坞窗。
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
本教程将使用 Docker Compose v2 插件而不是旧的遗留二进制文件。因此,运行它的命令从 docker-compose
更改为 docker compose
,这反映在这里。
Docker 以提升的权限运行,因此您需要经常使用 sudo
来运行命令。更好的选择是将您的 Linux 用户帐户添加到 docker
用户组。
$ sudo usermod -aG docker ${USER}
$ {USER}
变量获取当前登录的系统帐户。如果您未使用要授予权限的用户登录,请将 $ {USER}
替换为用户名。
要申请新的组成员资格,请退出服务器并重新登录,或使用以下命令。系统将提示您输入用户密码。
$ su - $(USER)
第 3 步 - 安装 Nginx
Ubuntu 22.04 附带旧版本的 Nginx。要安装最新版本,您需要下载官方 Nginx 存储库。
导入 Nginx 签名密钥。
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
添加 Nginx 稳定版本的存储库。
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
更新系统存储库。
$ sudo apt update
安装 Nginx。
$ sudo apt install nginx
验证安装。
$ nginx -v
nginx version: nginx/1.22.0
第 4 步 - 安装 SSL
我们需要安装 Certbot 来生成 SSL 证书。您可以使用 Ubuntu 存储库安装 Certbot,也可以使用 Snapd 工具获取最新版本。我们将使用 Snapd 版本。
Ubuntu 22.04 默认安装了 Snapd。运行以下命令以确保您的 Snapd 版本是最新的。
$ sudo snap install core
安装 Certbot。
$ sudo snap install --classic certbot
使用以下命令通过创建指向 /usr/bin
目录的符号链接来确保可以运行 Certbot 命令。
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
运行以下命令以生成 SSL 证书。
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m -d standardnotes.example.com
上面的命令会将证书下载到服务器上的 /etc/letsencrypt/live/standardnotes.example.com
目录。
我们需要对 Files 子域执行相同的操作。
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m -d snotes-files.example.com
生成 Diffie-Hellman 组证书。
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
打开文件 /etc/letsencrypt/renewal/standardnotes.example.com.conf
进行编辑。
$ sudo nano /etc/letsencrypt/renewal/standardnotes.example.com.conf
在底部粘贴以下代码。
pre_hook = systemctl stop nginx
post_hook = systemctl start nginx
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
通过编辑 /etc/letsencrypt/renewal/snotes-files.example.com.conf
文件对文件子域重复相同的步骤。
我们使用 Certbot 的独立选项生成了 SSL 证书。它运行其 Web 服务器来创建证书,这意味着 Nginx 应该在续订期间关闭。 pre_hook 和 post_hook 命令在续费前后运行,自动关闭和重启 Nginx 服务器,无需人工干预。
要检查 SSL 续订是否正常工作,请试运行该过程。
$ sudo certbot renew --dry-run
如果您没有看到任何错误,则一切就绪。您的证书将自动更新。
第 5 步 - 下载并配置标准注释
确保您位于系统主目录中。
$ cd ~
克隆 Standard Notes Standalone 存储库。
$ git clone --single-branch --branch main https://github.com/standardnotes/standalone.git
切换到下载的目录。
$ cd standalone
为服务器创建默认配置文件。
$ ./server.sh setup
这将创建我们需要配置的默认环境文件。您需要生成六个不同的密钥。使用以下命令生成它们。
$ openssl rand -hex 32
首先,我们必须编辑主文件夹中的文件 .env
。打开它进行编辑。
$ nano .env
更改以下变量的值。
NODE_ENV=production
..
AUTH_JWT_SECRET=c0f5bcf6f0f0dcca5b9078c3095e4255a055dfd6376b376733af0e50483cc629
..
DB_USERNAME=std_notes_user
DB_PASSWORD=changeme123
..
VALET_TOKEN_SECRET=977c978ca1d5ea22fe2fda65058905b191f724e33db6e47d0a41e034a082cb3b
..
FILES_SERVER_URL=https://snotes-files.example.com
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
接下来,打开文件 docker/auth.env
文件。
$ nano docker/auth.env
更改以下变量的值。
JWT_SECRET=54deb1b0b2499e8d875b0d5266dabef9003e13c1787a959a94e339363c10e56e
LEGACY_JWT_SECRET=c36aae01803a616213f22422b6d3f998a2beb2cb53af8b95bf578a8a3d046cec
..
PSEUDO_KEY_PARAMS_KEY=ea09d3f9122b49c653524cd2285a45fee88beb94f9b76d4d25420b521b080fcd
..
ENCRYPTION_SERVER_KEY=04decf379fbe3bb48cf95dbb5997031418b308e724a25d88cb0b2ed6da725efe
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
第 6 步 - 启动标准 Notes 服务器
运行以下命令以启动服务器。
$ ./server.sh start
此命令需要几分钟才能完成。在此期间,该过程将拉取所有相关的 Docker 映像并为所有服务创建容器。它还将填充数据库并执行适当的迁移。
您可以使用以下命令检查进程的日志。
$ ./server.sh logs
按 Ctrl + C 退出日志。您可以使用以下命令检查正在运行的容器的状态。
$ ./server.sh status
您将收到类似的输出。
Services State:
NAME COMMAND SERVICE STATUS PORTS
api-gateway-standalone "./wait-for.sh auth …" api-gateway running 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp
auth-standalone "./wait-for.sh db 33…" auth running
auth-worker-standalone "./wait-for.sh db 33…" auth-worker running
cache-standalone "docker-entrypoint.s…" cache running 6379/tcp
db-standalone "docker-entrypoint.s…" db running 3306/tcp
files-standalone "./wait-for.sh db 33…" files running 0.0.0.0:3125->3000/tcp, :::3125->3000/tcp
syncing-server-js-standalone "./wait-for.sh db 33…" syncing-server-js running
syncing-server-js-worker-standalone "./wait-for.sh db 33…" syncing-server-js-worker running
您可以使用以下命令检查服务器的健康状况。
$ curl http://localhost:3000/healthcheck
OK
默认情况下,标准 Notes 使用端口 3000。如果您在 .env
文件中配置了不同的端口,您应该在上面的命令中更新它。
第 7 步 - 配置 Nginx
打开文件 /etc/nginx/nginx.conf
进行编辑。
$ sudo nano /etc/nginx/nginx.conf
在行 include /etc/nginx/conf.d/*.conf;
之前添加以下行。
server_names_hash_bucket_size 64;
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
创建并打开文件 /etc/nginx/conf.d/standardnotes.conf
进行编辑。
$ sudo nano /etc/nginx/conf.d/standardnotes.conf
将以下代码粘贴到其中。将 standardnotes.example.com
替换为您的域名。我们已将 client_max_body_size
的值设置为 50MB。您可以根据您的要求更改它。
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name standardnotes.example.com;
client_max_body_size 50M;
access_log /var/log/nginx/standardnotes.access.log;
error_log /var/log/nginx/standardnotes.error.log;
ssl_certificate /etc/letsencrypt/live/standardnotes.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/standardnotes.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/standardnotes.example.com/chain.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_cache off;
}
}
# enforce HTTPS
server {
listen 80;
listen [::]:80;
server_name standardnotes.example.com;
return 301 https://$host$request_uri;
}
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
上面的文件用于主要的 Standard Notes 应用程序。接下来,我们需要为 Files 子域配置另一个文件。
$ sudo nano /etc/nginx/conf.d/files-standardnotes.conf
将以下代码粘贴到其中。将 snotes-files.example.com
替换为您的域名。我们已将 client_max_body_size
变量的值设置为 50MB。您可以根据您的要求更改它。
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name snotes-files.example.com;
client_max_body_size 50M;
access_log /var/log/nginx/files-standardnotes.access.log;
error_log /var/log/nginx/files-standardnotes.error.log;
ssl_certificate /etc/letsencrypt/live/snotes-files.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/snotes-files.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/snotes-files.example.com/chain.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
location / {
proxy_pass http://127.0.0.1:3125;
proxy_cache off;
}
}
# enforce HTTPS
server {
listen 80;
listen [::]:80;
server_name snotes-files.example.com;
return 301 https://$host$request_uri;
}
验证您的 Nginx 配置。
$ sudo nginx -t
重新启动 Nginx 服务器以启用配置文件。
$ sudo systemctl restart nginx
第 8 步 - 使用标准注释
如果您在浏览器中打开 URL https://standardnotes.example.com
,您应该会看到以下输出。

这意味着您的服务器已启动并正在运行。要使用标准笔记,您需要使用官方应用程序。对于我们的教程,我们将使用他们的网络应用程序,但桌面和移动应用程序的方法将保持不变。
打开 URL https://app.standardnotes.com
以访问网络应用程序。单击页面左下方的创建免费帐户链接并填写您的电子邮件地址和密码。单击“高级功能”按钮并取消选中“自定义同步服务器”选项并在框中填写 URL https://standardnotes.example.com
。

登录后,您可以开始创建笔记和使用该应用程序。
第 9 步 - 启用付费功能
到目前为止,我们已经为 Standard Notes 应用程序启用了基本功能。该应用程序提供了一些高级功能,如多种笔记格式、加密的云存储、更长的修订历史等。
对于云托管应用程序,您可以直接付费以启用高级功能。但是对于自托管应用程序,您不能为高级功能付费,因为支付应用程序不起作用。你可以捐赠它们。但是要在自托管应用程序中启用付费功能,您需要从 Standard Notes 目录运行以下命令。
$ cd ~/standardnotes
$ bash ./server.sh create-subscription
重新加载 Web 应用程序,您的帐户应该会激活付费功能。
第 10 步 - 为文件上传配置服务器
文件上传是 Standard Notes 的付费功能。我们为文件上传启用了自定义 API URL。但它们仍然不起作用。为了让它们工作,我们需要给上传目录适当的权限。上传存储在 ~/standardnotes/data/uploads
目录中。运行以下命令以更改权限。
$ chmod -R 775 data
$ mkdir -p data/uploads
$ sudo chmod -R 755 data/uploads
$ sudo chown -R 1001.1001 data/uploads
现在,Standard Notes 将每个用户的上传限制设置为零。这意味着除非手动指定配额,否则任何用户都不能上传文件。因此,使文件上传工作的最后一步是为付费用户帐户启用文件配额。我们可以通过在数据库容器内执行 SQL 查询来做到这一点。
登录到数据库容器内的 MySQL shell。
$ docker exec -it db-standalone mysql -u std_notes_user -p
Enter password:
一旦进入 MySQL shell,让我们检查数据库列表。
mysql > show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| standard_notes_db |
+--------------------+
2 rows in set (0.00 sec)
切换到标准注释数据库。
mysql > use standard_notes_db;
运行以下SQL命令,为上面激活的付费用户增加10GB的文件配额。
mysql> INSERT INTO subscription_settings(uuid, name, value, created_at, updated_at, user_subscription_uuid) VALUES (UUID(), "FILE_UPLOAD_BYTES_LIMIT", 10737418240, FLOOR(UNIX_TIMESTAMP(NOW(6))*1000000), FLOOR(UNIX_TIMESTAMP(NOW(6))*1000000), (SELECT us.uuid FROM user_subscriptions us INNER JOIN users u ON us.user_uuid=u.uuid WHERE u.email=""));
这里的 10737418240 指的是转换为 10GB 的总字节数。您可以将此号码修改为您需要的任何内容。
退出 MySQL shell 和数据库容器。
mysql > exit
第 11 步 - 测试文件上传
登录到 Standard Notes Web 应用程序,然后单击顶行的附件图标。

单击上传文件按钮并选择要上传的文件。该文件将成功上传,您可以通过再次单击该图标看到它列出。

单击文件名旁边的三个点以显示与该文件相关的其他选项。

单击附加到笔记链接以将图像添加到笔记中。其余选项不言自明。
结论
我们关于在 Ubuntu 22.04 机器上安装和配置 Standard Notes 服务器的教程到此结束。如果您有任何问题,请在下面的评论中发表。