如何在 Rocky Linux 9 上安装标准 Notes 服务器
在此页面上
- 先决条件
- 第 1 步 - 配置防火墙
- 第 2 步 - 安装 Docker 和 Docker Compose
- 第 3 步 - 安装 Nginx
- 第 4 步 - 安装 SSL
- 第 5 步 - 下载并配置标准注释
- 第 6 步 - 启动标准 Notes 服务器
第 7 步 - 安装标准 Notes Web 应用程序
- 安装Git
- 安装 NodeJS
- 安装纱线
- 安装 PM2 包管理器。
- 安装网络应用程序
标准笔记是一款开源且完全加密的笔记应用程序。它提供免费和付费计划,并提供云托管和在服务器上托管的选项。您可以使用服务器来同步不同设备之间存储的笔记。 Standard Notes 提供适用于所有桌面操作系统和移动平台的应用程序。
本教程教您如何在 Rocky Linux 9 计算机上自行托管标准笔记服务器。您还将了解如何在服务器上免费激活付费计划以及如何启用文件上传。
先决条件
运行 Rocky Linux 9 且至少具有 2 GB RAM 的服务器。
具有 sudo 权限的非 root 用户。
指向服务器的完全限定域名。在我们的教程中,我们将使用域 standardnotes.example.com
。您还需要两个域名,一个用于文件服务器,第二个用于 Web 应用程序。我们将使用域 snotes-files.example.com
作为文件服务器,使用 snotes-web.example.com
作为 Web 应用程序。
一切都更新了。
$ sudo dnf update
您的系统需要的软件包很少。
$ sudo dnf install -y wget nano unzip yum-utils policycoreutils-python-utils
其中一些软件包可能已经安装在您的系统上。
第 1 步 - 配置防火墙
在安装任何软件包之前,第一步是将防火墙配置为打开 HTTP 和 HTTPS 端口。 Rocky Linux 使用 Firewalld 防火墙。检查防火墙的状态。
$ sudo firewall-cmd --state
running
防火墙适用于不同的区域,公共区域是我们将使用的默认区域。列出防火墙上所有活动的服务和端口。
$ sudo firewall-cmd --zone=public --list-all
它应该显示以下输出。
public
target: default
icmp-block-inversion: no
interfaces: enp1s0
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
在防火墙中打开 HTTP 和 HTTPS 端口。
$ sudo firewall-cmd --zone=public --add-service=http
$ sudo firewall-cmd --zone=public --add-service=https
重新检查防火墙的状态。
$ sudo firewall-cmd --zone=public --list-all
您应该看到类似的输出。
public
target: default
icmp-block-inversion: no
interfaces: enp1s0
sources:
services: cockpit dhcpv6-client http https ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
使所有更改永久化并重新加载防火墙以启用更改。
$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reload
第 2 步 - 安装 Docker 和 Docker Compose
安装官方 Docker 存储库。
$ sudo dnf config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
安装 Docker。
$ sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启用并运行 Docker 守护进程。
$ sudo systemctl enable docker --now
检查 Docker 服务的状态。
$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: disabled)
Active: active (running) since Tue 2024-04-16 23:35:00 UTC; 5s ago
TriggeredBy: ? docker.socket
Docs: https://docs.docker.com
Main PID: 23273 (dockerd)
Tasks: 9
Memory: 34.0M
CPU: 176ms
CGroup: /system.slice/docker.service
??23273 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Apr 16 23:35:00 standard-notes systemd[1]: Starting Docker Application Container Engine...
Apr 16 23:35:00 standard-notes dockerd[23273]: time="2024-04-16T23:35:00.050964934Z" level=info msg="Starting up"
Apr 16 23:35:00 standard-notes dockerd[23273]: time="2024-04-16T23:35:00.083526973Z" level=info msg="Loading containers: start."
Apr 16 23:35:00 standard-notes dockerd[23273]: time="2024-04-16T23:35:00.654481705Z" level=info msg="Firewalld: interface docker0 already part of docker zone, returning"
Apr 16 23:35:00 standard-notes dockerd[23273]: time="2024-04-16T23:35:00.772647844Z" level=info msg="Loading containers: done."
Apr 16 23:35:00 standard-notes dockerd[23273]: time="2024-04-16T23:35:00.793814339Z" level=info msg="Docker daemon" commit=60b9add containerd-snapshotter=false storage-driver=overlay2 version=26.0.1
Apr 16 23:35:00 standard-notes dockerd[23273]: time="2024-04-16T23:35:00.793962347Z" level=info msg="Daemon has completed initialization"
Apr 16 23:35:00 standard-notes dockerd[23273]: time="2024-04-16T23:35:00.827030005Z" level=info msg="API listen on /run/docker.sock"
Apr 16 23:35:00 standard-notes systemd[1]: Started Docker Application Container Engine.
将您的系统用户添加到 Docker 组以避免使用 sudo 运行 Docker 命令。
$ sudo usermod -aG docker $(whoami)
注销后再次登录您的服务器以启用更改。
验证更改。
$ groups
navjot wheel docker
第 3 步 - 安装 Nginx
Rocky Linux 9 附带旧版本的 Nginx。您需要使用官方 Nginx 存储库来安装最新版本。
创建并打开文件 /etc/yum.repos.d/nginx.repo
进行编辑。
$ sudo nano /etc/yum.repos.d/nginx.repo
将以下代码粘贴到其中。
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
完成后,按 Ctrl + X 并在出现提示时输入 Y 来保存文件。我们将使用 Nginx 的主线版本,因此在上述文件中通过使用主线部分下的 enabled=1
而不是稳定版本启用了主线存储库。您可以选择其中之一。
安装 Nginx。
$ sudo dnf install nginx -y
验证安装。
$ nginx -v
nginx version: nginx/1.25.5
启用并启动 Nginx 服务器服务。
$ sudo systemctl enable nginx --now
检查服务的状态。
$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
Active: active (running) since Tue 2024-04-16 23:41:23 UTC; 6s ago
Docs: http://nginx.org/en/docs/
Process: 4886 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 4887 (nginx)
Tasks: 3 (limit: 10819)
Memory: 3.1M
CPU: 11ms
CGroup: /system.slice/nginx.service
??4887 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??4888 "nginx: worker process"
??4889 "nginx: worker process"
Apr 16 23:41:23 standard-notes systemd[1]: Starting nginx - high performance web server...
Apr 16 23:41:23 standard-notes systemd[1]: Started nginx - high performance web server.
第 4 步 - 安装 SSL
我们需要安装 Certbot 来生成 SSL 证书。为此,我们将使用 Snapd 软件包安装程序。由于 Rocky Linux 未附带,因此请安装 Snapd 安装程序。它需要 EPEL(企业 Linux 额外包)存储库才能工作。
安装 EPEL 存储库。
$ sudo dnf install epel-release -y
安装 Snapd 软件包。
$ sudo dnf install snapd -y
启用并启动 Snap 服务。
$ sudo systemctl enable snapd --now
安装 Snap 核心包,并确保您的 Snapd 版本是最新的。
$ sudo snap install core && sudo snap refresh core
创建 Snapd 工作所需的链接。
$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh
安装证书机器人。
$ sudo snap install --classic certbot
使用以下命令确保可以通过创建到 /usr/bin
目录的符号链接来运行 Certbot 命令。
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
检查 Certbot 版本。
$ certbot --version
certbot 2.10.0
运行以下命令生成 SSL 证书。
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email -d standardnotes.example.com
上述命令会将证书下载到服务器上的 /etc/letsencrypt/live/standardnotes.example.com
目录中。
我们需要对文件子域执行相同的操作。
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email -d snotes-files.example.com
最后,还是网络应用程序。
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email -d snotes-web.example.com
生成 Diffie-Hellman 组证书。
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
检查 Certbot 续订调度程序服务。
$ systemctl list-timers
您会发现 snap.certbot.renew.service
是计划运行的服务之一。
NEXT LEFT LAST PASSED UNIT ACTIVATES ----------------------------------------------------------------------------------------------------------------------------------
Wed 2024-04-17 00:00:00 UTC 5min left Tue 2024-04-16 23:29:44 UTC 24min ago logrotate.timer logrotate.service
Wed 2024-04-17 00:31:26 UTC 36min left - - dnf-makecache.timer dnf-makecache.service
Wed 2024-04-17 11:00:00 UTC 11h left - - snap.certbot.renew.timer snap.certbot.renew.service
对该过程进行一次演练,以检查 SSL 续订是否正常工作。
$ sudo certbot renew --dry-run
如果没有看到任何错误,则一切都已准备就绪。您的证书将自动更新。
第 5 步 - 下载并配置标准注释
确保您位于系统的主目录中。
$ cd ~
为Standard Notes Server 创建一个工作目录并切换到该目录。
$ mkdir standardnotes
$ cd ~/standardnotes
从 Standard Notes GitHub 存储库下载环境示例文件。
$ wget https://raw.githubusercontent.com/standardnotes/server/main/.env.sample
从下载的示例文件创建工作环境文件。
$ cp .env.sample .env
您将需要三个身份验证和加密密钥来配置 .env
文件。运行以下命令生成三个单独的密钥并复制其输出。
$ openssl rand -hex 32
您还需要一个强数据库密码。您可以运行以下命令来生成安全的数据库密码。
$ openssl rand -hex 12
打开环境文件进行编辑。
$ nano .env
选择一个强数据库密码并将其添加到 DB_PASSWORD
变量中。
######
# DB #
######
DB_HOST=db
DB_PORT=3306
DB_USERNAME=std_notes_user
DB_PASSWORD=changeme
DB_DATABASE=standard_notes_db
DB_TYPE=mysql
#########
# CACHE #
#########
REDIS_PORT=6379
REDIS_HOST=cache
CACHE_TYPE=redis
########
# KEYS #
########
AUTH_JWT_SECRET=
AUTH_SERVER_ENCRYPTION_SERVER_KEY=
VALET_TOKEN_SECRET=
添加之前生成的密钥,并将它们放在 KEYS
部分中的三个变量中。
默认情况下,启用用户注册。如果要在 Standard Notes 服务器上禁用公共用户注册,请在环境文件中添加以下变量。 但是,只有在您创建第一个帐户后才能执行此操作。如果您一开始就使用该设置,您将无法自行使用该应用程序。
AUTH_SERVER_DISABLE_USER_REGISTRATION=true
添加以下变量来定义您的标准 Notes 文件 URL。
PUBLIC_FILES_SERVER_URL=https://snotes-files.example.com
完整的 .env
文件应如下所示。
######
# DB #
######
DB_HOST=db
DB_PORT=3306
DB_USERNAME=std_notes_user
DB_PASSWORD=<YourDBPassword>
DB_DATABASE=standard_notes_db
DB_TYPE=mysql
#########
# CACHE #
#########
REDIS_PORT=6379
REDIS_HOST=cache
CACHE_TYPE=redis
########
# KEYS #
########
AUTH_JWT_SECRET=52b354ad5d8f11c995b4eed33870a1a7afbbc84b8da61e0b583660b075d0390c
AUTH_SERVER_ENCRYPTION_SERVER_KEY=fce4fe78972c3407be47127aee57d67e86b84afb628020b7ab6999edb3c905f1
VALET_TOKEN_SECRET=50aad911a283f252713139667b6475ac105280a220e009e05f733cf785630ce5
AUTH_SERVER_DISABLE_USER_REGISTRATION=true
PUBLIC_FILES_SERVER_URL=https://snotes-files.example.com
完成后按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
从 GitHub 存储库下载 Localstack 引导脚本。
$ wget https://raw.githubusercontent.com/standardnotes/server/main/docker/localstack_bootstrap.sh
赋予脚本可执行权限。
$ chmod +x localstack_bootstrap.sh
从 GitHub 存储库下载标准 Notes 服务器的 Docker Compose 文件。
$ wget https://raw.githubusercontent.com/standardnotes/server/main/docker-compose.example.yml
从下载的示例组合文件创建一个工作 Docker 组合文件。
$ cp docker-compose.example.yml docker-compose.yml
打开它进行编辑。
$ nano docker-compose.yml
将 MYSQL_ROOT_PASSWORD
和 MYSQL_PASSWORD
的值更改为您之前在 .env
文件中选择的数据库密码。您的 Docker Compose 文件应如下所示。
services:
server:
image: standardnotes/server
env_file: .env
container_name: server_self_hosted
restart: unless-stopped
ports:
- 3000:3000
- 3125:3104
volumes:
- ./logs:/var/lib/server/logs
- ./uploads:/opt/server/packages/files/dist/uploads
networks:
- standardnotes_self_hosted
localstack:
image: localstack/localstack:3.0
container_name: localstack_self_hosted
expose:
- 4566
restart: unless-stopped
environment:
- SERVICES=sns,sqs
- HOSTNAME_EXTERNAL=localstack
- LS_LOG=warn
volumes:
- ./localstack_bootstrap.sh:/etc/localstack/init/ready.d/localstack_bootstrap.sh
networks:
- standardnotes_self_hosted
db:
image: mysql:8
container_name: db_self_hosted
environment:
- MYSQL_DATABASE=standard_notes_db
- MYSQL_USER=std_notes_user
- MYSQL_ROOT_PASSWORD=<YourDBPassword>
- MYSQL_PASSWORD=<YourDBPassword>
expose:
- 3306
restart: unless-stopped
command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
volumes:
- ./data/mysql:/var/lib/mysql
- ./data/import:/docker-entrypoint-initdb.d
networks:
- standardnotes_self_hosted
cache:
image: redis:6.0-alpine
container_name: cache_self_hosted
volumes:
- ./data/redis/:/data
expose:
- 6379
restart: unless-stopped
networks:
- standardnotes_self_hosted
networks:
standardnotes_self_hosted:
name: standardnotes_self_hosted
完成后按 Ctrl + X 并在出现提示时输入 Y 来保存文件。标准 Notes 服务器设置的下载和配置到此结束。
第 6 步 - 启动标准 Notes 服务器
运行以下命令启动服务器。
$ docker compose up -d
此命令将需要几分钟才能完成。在此期间,该过程将拉取所有相关的 Docker 镜像并为所有服务创建容器。它还将填充数据库并执行适当的迁移。 CPU 使用率可能会猛增几分钟,但很快就会下降。
您可以在 logs
目录中找到标准 Notes 服务器的日志。您可以使用以下命令检查进程日志。
$ tail -f logs/*.log
按 Ctrl + C 退出日志。您可以使用以下任一命令检查正在运行的容器的状态。
$ docker compose ps
OR
$ docker ps
您将收到类似的输出。
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
cache_self_hosted redis:6.0-alpine "docker-entrypoint.s…" cache 16 minutes ago Up 5 minutes 6379/tcp
db_self_hosted mysql:8 "docker-entrypoint.s…" db 16 minutes ago Up 5 minutes 3306/tcp, 33060/tcp
localstack_self_hosted localstack/localstack:3.0 "docker-entrypoint.sh" localstack 16 minutes ago Up 5 minutes (healthy) 4510-4559/tcp, 4566/tcp, 5678/tcp
server_self_hosted standardnotes/server "docker-entrypoint.sh" server 16 minutes ago Up 5 minutes 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:3125->3104/tcp, :::3125->3104/tcp
您可以使用以下命令检查服务器的运行状况。
$ curl http://localhost:3000/healthcheck
OK
标准 Notes 默认使用端口 3000。如果您在 .env
文件中配置了不同的端口,则应在上面的命令中更新该端口。
第 7 步 - 安装标准 Notes Web 应用程序
您可以使用现有的 Standard Notes Web 应用程序或托管您的应用程序。在我们的教程中,我们将自行托管 Standard Notes Web 应用程序。
安装Git
在继续之前,我们需要安装一些东西,其中之一就是 Git。安装 Git。
$ sudo dnf install git -y
安装 NodeJS
下一步是安装 NodeJS。我们将为此安装 Node 18.x LTS 版本。发出以下命令来安装 NodeJS。
$ curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
$ sudo dnf install -y nodejs
确认安装。
$ node --version
v18.20.2
安装纱线
我们还需要 Yarn 包管理器。使用 Node.js 安装它。
$ sudo npm install --global yarn
安装 PM2 包管理器。
我们需要 PM2 来帮助将 Standard Notes Web 应用程序作为后台服务运行。
$ sudo npm install --global pm2
安装网络应用程序
为 Web 应用程序创建一个目录并切换到该目录。
$ cd ~
$ mkdir snotes-app
$ cd ~/snotes-app
从 GitHub 下载标准笔记应用程序。
$ git clone https://github.com/standardnotes/app.git .
使用 Yarn 安装依赖项。忽略任何警告。
$ yarn install
构建 Web 应用程序的包。
$ yarn build:web
切换到Web目录。
$ cd packages/web
使用 PM2 启动 Web 应用程序。
$ pm2 start "yarn start" --name api
您可以使用以下命令检查服务的状态。
$ pm2 status
[PM2] Starting /usr/bin/bash in fork_mode (1 instance)
[PM2] Done.
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? id ? name ? namespace ? version ? mode ? pid ? uptime ? ? ? status ? cpu ? mem ? user ? watching ?
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 0 ? api ? default ? N/A ? fork ? 15090 ? 0s ? 0 ? online ? 0% ? 26.2mb ? navjot ? disabled ?
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
该应用程序将启动并可通过端口 3001 访问。我们将使用此信息为 Web 应用程序创建 Nginx 配置。
PM2 不会在重新启动时重新启动应用程序。为此,我们需要生成一个启动脚本。
$ pm2 startup
您应该得到类似的输出。
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u navjot --hp /home/navjot
运行输出中提供的命令。
$ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u navjot --hp /home/navjot
这将生成并启用 systemd 服务文件。
保存重启时自动启动的进程。
$ pm2 save
第 8 步 - 配置 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;
listen [::]:443 ssl;
http2 on;
http3 on;
quic_retry on;
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 off;
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;
resolver 8.8.8.8;
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 来保存文件。
上面的文件适用于主要的标准注释应用程序。接下来,我们需要为 Files 子域配置另一个文件。
$ sudo nano /etc/nginx/conf.d/files-standardnotes.conf
将以下代码粘贴到其中。将 snotes-files.example.com
替换为您的域名。我们已将 client_max_body_size
变量的值设置为 50MB。您可以根据您的要求更改它。
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
http3 on;
quic_retry on;
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 off;
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;
resolver 8.8.8.8;
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;
}
最后,我们需要为网络应用程序创建一个配置文件。
$ sudo nano /etc/nginx/conf.d/web-standardnotes.conf
将以下代码粘贴到其中。
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
http3 on;
quic_retry on;
server_name snotes-web.example.com;
client_max_body_size 50M;
access_log /var/log/nginx/standardnotes-web.access.log;
error_log /var/log/nginx/standardnotes-web.error.log;
ssl_certificate /etc/letsencrypt/live/snotes-web.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/snotes-web.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/snotes-web.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 off;
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;
resolver 8.8.8.8;
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-web.example.com;
return 301 https://$host$request_uri;
}
验证您的 Nginx 配置。
$ sudo nginx -t
重新启动 Nginx 服务器以启用配置文件。
$ sudo systemctl restart nginx
第 9 步 - 配置 SELinux
应用该策略以允许与外部主机建立连接。
$ sudo setsebool -P httpd_can_network_connect 1
应用策略以允许 Nginx 授予对 PostgreSQL 的访问权限。
$ sudo setsebool -P httpd_can_network_connect_db 1
第 10 步 - 使用标准注释
如果您在浏览器中打开 URL https://standardnotes.example.com
,您应该会看到以下输出。
这意味着您的服务器已启动并正在运行。要使用标准笔记,您需要使用官方应用程序。在我们的教程中,我们将使用他们的网络应用程序,但桌面和移动应用程序的方法将保持不变。
打开 URL https://snotes-web.example.com
以访问 Web 应用程序。点击页面左下角的创建免费帐户链接,然后填写您的电子邮件地址和密码。点击高级功能按钮,取消选中自定义同步服务器选项,然后填写网址 https://standardnotes.example.com
盒子。
单击下一步按钮继续。系统将再次要求您输入密码。
登录后,您可以开始创建笔记并使用该应用程序。
第 11 步 - 启用付费功能
到目前为止,我们已经启用了标准注释应用程序的基本功能。但是,您可以激活一些付费服务器端功能,而标准注释允许您免费执行这些功能。这不会激活客户端高级功能,例如超级注释和嵌套标签。您可以通过 Standard Notes Offline 计划购买大幅折扣的订阅来激活它们。
您需要从 Standard Notes 目录运行以下命令,以启用自托管应用程序中的服务器端高级功能。
$ cd ~/standardnotes
$ docker compose exec db sh -c "MYSQL_PWD=\$MYSQL_ROOT_PASSWORD mysql \$MYSQL_DATABASE -e \
'INSERT INTO user_roles (role_uuid , user_uuid) VALUES ((SELECT uuid FROM roles WHERE name=\"PRO_USER\" ORDER BY version DESC limit 1) ,(SELECT uuid FROM users WHERE email=\"EMAIL@ADDR\")) ON DUPLICATE KEY UPDATE role_uuid = VALUES(role_uuid);' \
"
$ docker compose exec db sh -c "MYSQL_PWD=\$MYSQL_ROOT_PASSWORD mysql \$MYSQL_DATABASE -e \
'INSERT INTO user_subscriptions SET uuid=UUID(), plan_name=\"PRO_PLAN\", ends_at=8640000000000000, created_at=0, updated_at=0, user_uuid=(SELECT uuid FROM users WHERE email=\"EMAIL@ADDR\"), subscription_id=1, subscription_type=\"regular\";' \
"
重新加载网络应用程序,您的帐户的付费功能就会被激活。要激活客户端功能,请打开应用程序首选项,选择常规>>离线激活菜单,然后输入通过购买离线计划获得的激活码。
第 12 步 - 配置文件上传服务器
文件上传是Standard Notes的付费功能,如果不购买离线计划则无法使用。我们已启用用于文件上传的自定义 API URL。但它们仍然不起作用。为了使它们正常工作,我们需要为上传目录授予适当的权限。上传的内容存储在 ~/standardnotes/uploads
目录中。运行以下命令来更改权限。
$ sudo chmod -R 775 data
$ sudo chmod -R 755 uploads
$ sudo chown -R 1001.1001 uploads
现在,标准注释将每个用户的上传限制设置为零。这意味着除非手动给予配额,否则任何用户都无法上传文件。因此,使文件上传工作的最后一步是启用付费用户帐户的文件配额。我们可以通过在数据库容器内执行 SQL 查询来做到这一点。
登录到数据库容器内的 MySQL shell。
$ docker exec -it db-standalone mysql -u std_notes_user -p
Enter password:
进入 MySQL shell 后,让我们检查数据库列表。
mysql > show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| standard_notes_db |
+--------------------+
3 rows in set (0.01 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="[email "));
这里 10737418240 指的是总字节数,转换为 10GB。您可以将此数字修改为您需要的任何内容。
退出 MySQL shell 和数据库容器。
mysql > exit
步骤 13 - 升级标准 Notes 服务器和 Web 应用程序
升级标准 Notes 服务器的第一步是停止并删除现有容器。
$ cd ~/standardnotes
$ docker compose stop
$ docker compose remove --orphans
从 GitHub 存储库获取最新的 .env
、localstack_bootstrap.sh
和 Docker compose 文件。进行所需的更改并用更新的文件替换现有文件。
再次启动服务器容器。
$ docker compose up -d
您更新后的同步服务器正在运行。
切换到Web应用程序目录。
$ cd ~/snotes-app
切换到Web应用程序根目录。
$ cd packages/web
停止现有进程。
$ pm2 stop api
切换回主应用程序目录。
$ cd ~/snotes-app
从 GitHub 存储库中提取最新更改。
$ git pull
返回到 web 目录。
$ cd packages/web
开始该过程。
$ pm2 start api
您的网络应用程序应该更新。
结论
关于在 Rocky Linux 9 计算机上安装和配置 Standard Notes 服务器的教程到此结束。如果您有任何疑问,请在下面的评论中发表。