Поиск по сайту:

Как установить стандартный сервер Notes в Rocky Linux 9


На этой странице

  1. Предварительные условия
  2. Шаг 1. Настройка брандмауэра
  3. Шаг 2. Установите Docker и Docker Compose.
  4. Шаг 3. Установите Nginx.
  5. Шаг 4. Установите SSL
  6. Шаг 5. Загрузите и настройте стандартные заметки
  7. Шаг 6. Запустите стандартный сервер Notes
  8. Шаг 7. Установите стандартное веб-приложение Notes

    1. Установить Git
    2. Установите NodeJS
    3. Установить пряжу
    4. Установите менеджер пакетов PM2.
    5. Установите веб-приложение
  9. Шаг 8. Настройте Nginx
  10. Шаг 9 — Настройка SELinux
  11. Шаг 10. Используйте стандартные заметки
  12. Шаг 11 – Включите платные функции
  13. Шаг 12. Настройте сервер для загрузки файлов.
  14. Шаг 13. Обновите стандартный сервер Notes и веб-приложение.
  15. Заключение

Standard Notes — это полностью зашифрованное приложение для заметок с открытым исходным кодом. Он предлагает как бесплатные, так и платные планы, а также облачный хостинг и возможность разместить его на своем сервере. Вы можете использовать свой сервер для синхронизации заметок, хранящихся между различными устройствами. Standard Notes предлагает приложения для всех настольных операционных систем и мобильных платформ.

Из этого руководства вы узнаете, как самостоятельно разместить стандартный сервер заметок на компьютере с Rocky Linux 9. Вы также узнаете, как бесплатно активировать платные планы на сервере и как включить загрузку файлов.

Предварительные условия

    Сервер под управлением Rocky Linux 9 с объемом оперативной памяти не менее 2 ГБ.

    Пользователь без полномочий root с привилегиями sudo.

    Полное доменное имя, указывающее на сервер. В нашем уроке мы будем использовать домен standardnotes.example.com. Вам понадобятся еще два доменных имени: одно для файлового сервера, а второе для веб-приложения. Мы будем использовать домен snotes-files.example.com для файлового сервера и snotes-web.example.com для веб-приложения.

    Все обновляется.

    $ 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

Установите Докер.

$ 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 в разделе основной версии вместо стабильной. Вы можете выбрать любой из них.

Установите Нгинкс.

$ 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

Используйте следующую команду, чтобы гарантировать возможность запуска команды Certbot, создав символическую ссылку на каталог /usr/bin.

$ 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 на вашем сервере.

Нам нужно сделать то же самое для поддомена Files.

$ 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

Создайте сертификат группы Диффи-Хеллмана.

$ 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

Добавьте следующую переменную, чтобы определить 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 при появлении соответствующего запроса после завершения.

Загрузите сценарий начальной загрузки Localstack из репозитория GitHub.

$ wget https://raw.githubusercontent.com/standardnotes/server/main/docker/localstack_bootstrap.sh

Предоставьте разрешения на выполнение скрипта.

$ chmod +x localstack_bootstrap.sh

Загрузите файл Docker Compose для сервера Standard Notes из репозитория GitHub.

$ 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 при появлении соответствующего запроса после завершения. На этом загрузка и настройка сервера Standard Notes завершены.

Шаг 6. Запустите стандартный сервер Notes

Выполните следующую команду, чтобы запустить сервер.

$ docker compose up -d

Выполнение этой команды займет несколько минут. За это время процесс извлечет все соответствующие образы Docker и создаст контейнеры для всех сервисов. Он также заполнит базу данных и выполнит соответствующие миграции. Загрузка ЦП может резко возрасти на пару минут, но вскоре она должна снизиться.

Журналы сервера Standard Notes можно найти в каталоге logs. Вы можете проверить журналы процессов, используя следующую команду.

$ 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

Стандартные заметки по умолчанию используют порт 3000. Если вы настроили другой порт в файле .env, вам следует обновить его с помощью приведенной выше команды.

Шаг 7. Установите стандартное веб-приложение Notes

Вы можете использовать существующее веб-приложение Standard Notes или разместить свое. В нашем руководстве мы будем размещать веб-приложение Standard Notes самостоятельно.

Установить 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.

$ sudo npm install --global yarn

Установите менеджер пакетов PM2.

Нам нужен PM2, чтобы помочь запустить веб-приложение Standard Notes в качестве фоновой службы.

$ sudo npm install --global pm2

Установите веб-приложение

Создайте каталог для веб-приложения и переключитесь на него.

$ cd ~
$ mkdir snotes-app
$ cd ~/snotes-app

Загрузите приложение Standard Notes с GitHub.

$ git clone https://github.com/standardnotes/app.git .

Используйте Yarn для установки зависимостей. Игнорируйте любые предупреждения.

$ yarn install

Создайте пакеты для веб-приложения.

$ yarn build:web

Перейдите в веб-каталог.

$ cd packages/web

Запустите веб-приложение с помощью PM2.

$ 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. Мы будем использовать эту информацию для создания конфигурации 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 равным 50 МБ. Вы можете изменить его в соответствии с вашими требованиями.

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 при появлении запроса.

Вышеупомянутый файл предназначен для основного приложения Standard Notes. Далее нам нужно настроить еще один файл для поддомена Files.

$ sudo nano /etc/nginx/conf.d/files-standardnotes.conf

Вставьте в него следующий код. Замените snotes-files.example.com своим доменным именем. Мы установили значение переменной client_max_body_size равным 50 МБ. Вы можете изменить его в соответствии с вашими требованиями.

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, чтобы получить доступ к веб-приложению. Нажмите ссылку Создать бесплатную учетную запись в левом нижнем углу страницы и введите свой адрес электронной почты и пароль. Нажмите кнопку Дополнительные функции, снимите флажок с параметра «Пользовательский сервер синхронизации»  и введите URL-адрес https://standardnotes.example.com в поле коробка.

Нажмите кнопку Далее, чтобы продолжить. Вам будет предложено ввести пароль еще раз.

После входа в систему вы можете начать создавать заметки и использовать приложение.

Шаг 11 – Включите платные функции

На данный момент мы включили базовую функциональность приложения Standard Notes. Однако вы можете активировать некоторые платные серверные функции, а Standard Notes позволяет делать их бесплатно. При этом не будут активированы дополнительные функции на стороне клиента, такие как суперзаметки и вложенные теги. Вы можете приобрести подписку со значительной скидкой в рамках плана 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, которая не будет работать без приобретения автономного плана. Мы включили собственный URL-адрес API для загрузки файлов. Но они все равно не будут работать. Чтобы они работали, нам нужно предоставить соответствующие разрешения каталогу загрузок. Загрузки хранятся в каталоге ~/standardnotes/uploads. Выполните следующие команды, чтобы изменить разрешения.

$ sudo chmod -R 775 data
$ sudo chmod -R 755 uploads
$ sudo chown -R 1001.1001 uploads

Теперь Standard Notes устанавливает нулевой лимит загрузки для каждого пользователя. Это означает, что ни один пользователь не сможет загружать файлы, если ему не будет предоставлена квота вручную. Поэтому последним шагом в обеспечении работоспособности загрузки файлов является включение файловой квоты для платной учетной записи пользователя. Мы можем сделать это, выполнив SQL-запрос внутри контейнера базы данных.

Войдите в оболочку MySQL внутри контейнера базы данных.

$ docker exec -it db-standalone mysql -u std_notes_user -p
Enter password:

Внутри оболочки MySQL давайте проверим список баз данных.

mysql > show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
| standard_notes_db  |
+--------------------+
3 rows in set (0.01 sec)

Переключитесь на базу данных Standard Notes.

mysql > use standard_notes_db;

Выполните следующую команду SQL, чтобы добавить квоту на файлы размером 10 ГБ для платного пользователя, активированного выше.

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 относится к общему количеству байтов, что соответствует 10 ГБ. Вы можете изменить этот номер на все, что вам нужно.

Выйдите из оболочки MySQL и контейнера базы данных.

mysql > exit

Шаг 13. Обновите стандартный сервер Notes и веб-приложение.

Первым шагом в обновлении Standard Notes Server является остановка и удаление существующих контейнеров.

$ cd ~/standardnotes
$ docker compose stop
$ docker compose remove --orphans

Загрузите последние версии .env, localstack_bootstrap.sh и файлы компоновки Docker из репозитория GitHub. Внесите необходимые изменения и замените существующие файлы обновленными.

Запустите контейнеры Сервера еще раз.

$ docker compose up -d

Обновленный сервер синхронизации запущен.

Перейдите в каталог веб-приложения.

$ cd ~/snotes-app

Перейдите в корневой каталог веб-приложения.

$ cd packages/web

Остановить существующий процесс.

$ pm2 stop api

Вернитесь в основной каталог приложения.

$ cd ~/snotes-app

Загрузите последние изменения из репозитория GitHub.

$ git pull

Вернитесь в веб-каталог.

$ cd packages/web

Запустите процесс.

$ pm2 start api

Ваше веб-приложение должно быть обновлено.

Заключение

На этом завершается наше руководство по установке и настройке сервера Standard Notes на компьютере с Rocky Linux 9. Если у вас есть вопросы, задавайте их в комментариях ниже.