Pesquisa de site

Como instalar o servidor de notas padrão no Rocky Linux 9


Nesta página

  1. Pré-requisitos
  2. Passo 1 - Configurar Firewall
  3. Passo 2 - Instale o Docker e o Docker Compose
  4. Etapa 3 - Instale o Nginx
  5. Passo 4 – Instalar SSL
  6. Etapa 5 - Baixe e configure notas padrão
  7. Etapa 6 - Inicie o Servidor de Notas Padrão
  8. Etapa 7 - Instale o aplicativo Web Notes padrão

    1. Instale o Git
    2. Instale o NodeJS
    3. Instale o fio
    4. Instale o gerenciador de pacotes PM2.
    5. Instale o aplicativo da web
  9. Etapa 8 – Configurar o Nginx
  10. Passo 9 - Configurar o SELinux
  11. Passo 10 - Use Notas Padrão
  12. Passo 11 – Habilitar recursos pagos
  13. Passo 12 - Configurar o servidor para upload de arquivos
  14. Etapa 13 - Atualizar o Standard Notes Server e o aplicativo da web
  15. Conclusão

Standard Notes é um aplicativo de notas de código aberto e totalmente criptografado. Oferece planos gratuitos e pagos e oferece hospedagem em nuvem e a opção de hospedá-la em seu servidor. Você pode usar seu servidor para sincronizar as notas armazenadas entre diferentes dispositivos. Standard Notes oferece aplicativos para todos os sistemas operacionais de desktop e plataformas móveis.

Este tutorial ensina como auto-hospedar seu servidor de notas padrão em uma máquina Rocky Linux 9. Você também aprenderá como ativar planos pagos no servidor gratuitamente e como habilitar uploads de arquivos.

Pré-requisitos

    Um servidor rodando Rocky Linux 9 com pelo menos 2 GB de RAM.

    Um usuário não root com privilégios sudo.

    Um nome de domínio totalmente qualificado apontado para o servidor. Para nosso tutorial, usaremos o domínio standardnotes.example.com. Você precisará de mais dois nomes de domínio, um para o servidor de arquivos e outro para o aplicativo web. Usaremos o domínio snotes-files.example.com para o servidor de arquivos e snotes-web.example.com para o aplicativo da web.

    Tudo está atualizado.

    $ sudo dnf update
    

    Poucos pacotes que seu sistema precisa.

    $ sudo dnf install -y wget nano unzip yum-utils policycoreutils-python-utils
    

    Alguns desses pacotes podem já estar instalados em seu sistema.

Passo 1 - Configurar Firewall

Antes de instalar qualquer pacote, o primeiro passo é configurar o firewall para abrir portas para HTTP e HTTPS. Rocky Linux usa Firewalld Firewall. Verifique o status do firewall.

$ sudo firewall-cmd --state
running

O firewall funciona com zonas diferentes, e a zona pública é a zona padrão que usaremos. Liste todos os serviços e portas ativos no firewall.

$ sudo firewall-cmd --zone=public --list-all

Deve mostrar a seguinte saída.

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:

Abra as portas HTTP e HTTPS no firewall.

$ sudo firewall-cmd --zone=public --add-service=http
$ sudo firewall-cmd --zone=public --add-service=https

Verifique novamente o status do firewall.

$ sudo firewall-cmd --zone=public --list-all

Você deverá ver uma saída semelhante.

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:

Torne todas as alterações permanentes e recarregue o firewall para ativá-las.

$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reload

Passo 2 - Instale o Docker e o Docker Compose

Instale o repositório oficial do Docker.

$ sudo dnf config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

Instale o Docker.

$ sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Habilite e execute o daemon Docker.

$ sudo systemctl enable docker --now

Verifique o status do serviço 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.

Adicione o usuário do sistema ao grupo Docker para evitar o uso de sudo para executar comandos do Docker.

$ sudo usermod -aG docker $(whoami)

Faça login novamente em seu servidor após sair para ativar a alteração.

Verifique a alteração.

$ groups
navjot wheel docker

Etapa 3 - Instale o Nginx

Rocky Linux 9 vem com uma versão mais antiga do Nginx. Você precisa usar o repositório oficial Nginx para instalar a versão mais recente.

Crie e abra o arquivo /etc/yum.repos.d/nginx.repo para edição.

$ sudo nano /etc/yum.repos.d/nginx.repo

Cole o seguinte código nele.

[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

Quando terminar, salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado. Usaremos a versão principal do Nginx e, portanto, habilitamos o repositório principal no arquivo acima usando enabled=1 na seção principal em vez da estável. Você pode escolher qualquer um deles.

Instale o Nginx.

$ sudo dnf install nginx -y

Verifique a instalação.

$ nginx -v
nginx version: nginx/1.25.5

Habilite e inicie o serviço do servidor Nginx.

$ sudo systemctl enable nginx --now

Verifique o status do serviço.

$ 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.

Passo 4 – Instalar SSL

Precisamos instalar o Certbot para gerar o certificado SSL. Usaremos o instalador do pacote Snapd para isso. Como o Rocky Linux não vem com ele, instale o instalador Snapd. Requer o repositório EPEL (Extra Packages for Enterprise Linux) para funcionar.

Instale o repositório EPEL.

$ sudo dnf install epel-release -y

Instale o pacote Snapd.

$ sudo dnf install snapd -y

Habilite e inicie o serviço Snap.

$ sudo systemctl enable snapd --now

Instale o pacote principal do Snap e certifique-se de que sua versão do Snapd esteja atualizada.

$ sudo snap install core && sudo snap refresh core

Crie os links necessários para que o Snapd funcione.

$ 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

Instale o Cerbot.

$ sudo snap install --classic certbot

Use o comando a seguir para garantir que o comando Certbot possa ser executado criando um link simbólico para o diretório /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Verifique a versão do Certbot.

$ certbot --version
certbot 2.10.0

Execute o seguinte comando para gerar um certificado SSL.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email  -d standardnotes.example.com

O comando acima fará download de um certificado para o diretório /etc/letsencrypt/live/standardnotes.example.com em seu servidor.

Precisamos fazer o mesmo para o subdomínio Arquivos.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email  -d snotes-files.example.com

E por último, novamente para o aplicativo web.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email  -d snotes-web.example.com

Gere um certificado do grupo Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Verifique o serviço de agendamento de renovação do Certbot.

$ systemctl list-timers

Você encontrará snap.certbot.renew.service como um dos serviços programados para execução.

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

Faça uma simulação do processo para verificar se a renovação do SSL está funcionando bem.

$ sudo certbot renew --dry-run

Se você não encontrar erros, está tudo pronto. Seu certificado será renovado automaticamente.

Etapa 5 - Baixe e configure notas padrão

Certifique-se de estar no diretório inicial do seu sistema.

$ cd ~

Crie um diretório de trabalho para o Standard Notes Server e alterne para ele.

$ mkdir standardnotes
$ cd ~/standardnotes

Baixe o arquivo de exemplo de ambiente do repositório GitHub do Standard Notes.

$ wget https://raw.githubusercontent.com/standardnotes/server/main/.env.sample

Crie o arquivo do ambiente de trabalho a partir do arquivo de exemplo baixado.

$ cp .env.sample .env

Você precisará de três chaves de autenticação e criptografia para configurar o arquivo .env. Execute o seguinte comando para gerar três chaves separadas e copiar sua saída.

$ openssl rand -hex 32

Você também precisará de uma senha forte para o banco de dados. Você pode executar o seguinte comando para gerar uma senha de banco de dados segura.

$ openssl rand -hex 12

Abra o arquivo de ambiente para edição.

$ nano .env

Escolha uma senha forte para o banco de dados e adicione-a à variável 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=

Adicione as chaves geradas antes e coloque-as nas três variáveis na seção KEYS.

Por padrão, o Registro de Usuário está habilitado. Se desejar desabilitar o registro de usuário público em seu servidor Standard Notes, adicione a seguinte variável no arquivo de ambiente. No entanto, faça isso somente depois de criar sua primeira conta nele. Se você usar a configuração logo no início, não conseguirá usar o aplicativo sozinho.

AUTH_SERVER_DISABLE_USER_REGISTRATION=true

Adicione a seguinte variável para definir o URL dos arquivos de notas padrão.

PUBLIC_FILES_SERVER_URL=https://snotes-files.example.com

O arquivo .env completo deve ser semelhante ao seguinte.

######
# 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

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado quando terminar.

Baixe o script de inicialização Localstack do repositório GitHub.

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

Dê permissões executáveis ao script.

$ chmod +x localstack_bootstrap.sh

Baixe o arquivo Docker Compose para o servidor Standard Notes do repositório GitHub.

$ wget https://raw.githubusercontent.com/standardnotes/server/main/docker-compose.example.yml

Crie um arquivo de composição do Docker funcional a partir do arquivo de composição de exemplo baixado.

$ cp docker-compose.example.yml docker-compose.yml

Abra-o para edição.

$ nano docker-compose.yml

Altere o valor de MYSQL_ROOT_PASSWORD e de MYSQL_PASSWORD para a senha do banco de dados que você selecionou no arquivo .env anteriormente. Seu arquivo Docker Compose deve ser semelhante ao seguinte.

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

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado quando terminar. Isso conclui o download e a configuração do servidor Standard Notes.

Etapa 6 - Inicie o Servidor de Notas Padrão

Execute o seguinte comando para iniciar o servidor.

$ docker compose up -d

Este comando levará alguns minutos para ser concluído. Durante esse tempo, o processo extrairá todas as imagens Docker relevantes e criará contêineres para todos os serviços. Ele também preencherá o banco de dados e realizará as migrações apropriadas. O uso da CPU pode aumentar por alguns minutos, mas deve diminuir em breve.

Você pode encontrar logs do servidor Standard Notes no diretório logs. Você pode verificar os logs do processo usando o seguinte comando.

$ tail -f logs/*.log

Pressione Ctrl + C para sair dos registros. Você pode verificar o status dos contêineres em execução usando um dos comandos a seguir.

$ docker compose ps
OR
$ docker ps

Você receberá uma saída semelhante.

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

Você pode verificar a integridade do servidor usando o seguinte comando.

$ curl http://localhost:3000/healthcheck
OK

O Standard Notes usa a porta 3000 por padrão. Se você configurou uma porta diferente no arquivo .env, você deve atualizá-la no comando acima.

Etapa 7 - Instale o aplicativo Web Notes padrão

Você pode usar o aplicativo da web Standard Notes existente ou hospedar o seu. Para nosso tutorial, hospedaremos o aplicativo da web Standard Notes.

Instale o Git

Antes de prosseguirmos, precisamos instalar algumas coisas, uma das quais é o Git. Instale o Git.

$ sudo dnf install git -y

Instale o NodeJS

A próxima etapa é instalar o NodeJS. Instalaremos a versão Node 18.x LTS para isso. Emita os seguintes comandos para instalar o NodeJS.

$ curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
$ sudo dnf install -y nodejs

Confirme a instalação.

$ node --version
v18.20.2

Instale o fio

Também precisamos do gerenciador de pacotes Yarn. Instale-o usando Node.

$ sudo npm install --global yarn

Instale o gerenciador de pacotes PM2.

Precisamos do PM2 para ajudar a executar o aplicativo da web Standard Notes como um serviço em segundo plano.

$ sudo npm install --global pm2

Instale o aplicativo da web

Crie um diretório para o aplicativo da web e mude para ele.

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

Baixe o aplicativo Standard Notes do GitHub.

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

Use o Yarn para instalar as dependências. Ignore quaisquer avisos.

$ yarn install

Crie os pacotes para o aplicativo web.

$ yarn build:web

Mude para o diretório da web.

$ cd packages/web

Inicie o aplicativo da web usando PM2.

$ pm2 start "yarn start" --name api

Você pode verificar o status do serviço usando o seguinte comando.

$ 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 ?
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

O aplicativo será iniciado e acessível pela porta 3001. Usaremos essas informações para criar uma configuração Nginx para o aplicativo web.

PM2 não reinicia o aplicativo na reinicialização. Para fazer isso, precisamos gerar um script de inicialização.

$ pm2 startup

Você deve obter uma saída semelhante.

[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

Execute o comando fornecido na saída.

$ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u navjot --hp /home/navjot

Isso irá gerar e habilitar um arquivo de serviço systemd.

Salve o processo para ser iniciado automaticamente na reinicialização.

$ pm2 save

Etapa 8 – Configurar o Nginx

Abra o arquivo /etc/nginx/nginx.conf para edição.

$ sudo nano /etc/nginx/nginx.conf

Adicione a seguinte linha antes da linha include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size 64;

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Crie e abra o arquivo /etc/nginx/conf.d/standardnotes.conf para edição.

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

Cole o seguinte código nele. Substitua standardnotes.example.com pelo seu nome de domínio. Definimos o valor de client_max_body_size como 50MB. Você pode alterá-lo de acordo com suas necessidades.

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;
}

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

O arquivo acima é para o aplicativo principal do Standard Notes. A seguir, precisamos configurar outro arquivo para o subdomínio Arquivos.

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

Cole o seguinte código nele. Substitua snotes-files.example.com pelo seu nome de domínio. Definimos o valor da variável client_max_body_size como 50MB. Você pode alterá-lo de acordo com suas necessidades.

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;
}

E, finalmente, precisamos criar um arquivo de configuração para o aplicativo web.

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

Cole o seguinte código nele.

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;
}

Verifique sua configuração do Nginx.

$ sudo nginx -t

Reinicie o servidor Nginx para habilitar os arquivos de configuração.

$ sudo systemctl restart nginx

Passo 9 - Configurar o SELinux

Aplique a política para permitir conexões com hosts externos.

$ sudo setsebool -P httpd_can_network_connect 1

Aplique a política para permitir que o Nginx conceda acesso ao PostgreSQL.

$ sudo setsebool -P httpd_can_network_connect_db 1

Passo 10 - Use Notas Padrão

Se você abrir o URL https://standardnotes.example.com em seu navegador, deverá ver a seguinte saída.

Isso significa que seu servidor está instalado e funcionando. Para usar o Standard Notes, você precisará usar os aplicativos oficiais. Para nosso tutorial, usaremos o aplicativo da web, mas o método permanecerá o mesmo para aplicativos de desktop e móveis.

Abra o URL https://snotes-web.example.com para acessar o aplicativo da web. Clique no link Criar conta gratuita no canto inferior esquerdo da página e preencha seu endereço de e-mail e senha. Clique no botão Recursos avançados, desmarque a opção Servidor de sincronização personalizado,  e preencha o URL https://standardnotes.example.com em a caixa.

Clique no botão Avançar para prosseguir. Será solicitada sua senha novamente.

Uma vez conectado, você pode começar a criar notas e usar o aplicativo.

Passo 11 – Habilitar recursos pagos

Até agora, habilitamos a funcionalidade básica para o aplicativo Standard Notes. No entanto, você pode ativar alguns recursos pagos do lado do servidor, e o Standard Notes permite que você faça isso gratuitamente. Isso não ativará os recursos premium do lado do cliente, como Super Notes e Tags aninhadas. Você pode adquirir uma assinatura com grandes descontos por meio do plano Standard Notes Offline para ativá-los.

Você precisa executar o seguinte comando no diretório Standard Notes para habilitar os recursos premium do lado do servidor no aplicativo auto-hospedado.

$ 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\";' \
    "

Recarregue o aplicativo da web e os recursos pagos deverão ser ativados para sua conta. Para ativar os recursos do lado do cliente, abra as preferências do seu aplicativo, escolha o menu Geral >> Ativação off-line e insira o código de ativação obtido ao adquirir o plano off-line.

Passo 12 - Configurar o servidor para upload de arquivos

O upload de arquivos é um recurso pago do Standard Notes e não funcionará sem a compra do plano offline. Habilitamos o URL da API personalizado para uploads de arquivos. Mas eles ainda não funcionarão. Para fazê-los funcionar, precisamos dar permissões adequadas ao diretório de uploads. Os uploads são armazenados no diretório ~/standardnotes/uploads. Execute os seguintes comandos para alterar as permissões.

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

Agora, o Standard Notes define zero como limite de upload para cada usuário. Isso significa que nenhum usuário pode fazer upload de arquivos, a menos que receba uma cota manualmente. Portanto, a etapa final para fazer o upload de arquivos funcionar é ativar a cota de arquivos para a conta de usuário paga. Podemos fazer isso realizando uma consulta SQL dentro do contêiner do banco de dados.

Faça login no shell do MySQL dentro do contêiner do banco de dados.

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

Uma vez dentro do shell do MySQL, vamos verificar a lista de bancos de dados.

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

Mude para o banco de dados do Standard Notes.

mysql > use standard_notes_db;

Execute o seguinte comando SQL para adicionar uma cota de arquivo de 10 GB ao usuário pago ativado acima.

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 "));

Aqui 10737418240 refere-se ao total de bytes que se traduz em 10 GB. Você pode modificar esse número para o que precisar.

Saia do shell do MySQL e do contêiner do banco de dados.

mysql > exit

Etapa 13 - Atualizar o Standard Notes Server e o aplicativo da web

A primeira etapa na atualização do Standard Notes Server é parar e remover os contêineres existentes.

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

Obtenha os arquivos .env, localstack_bootstrap.sh mais recentes e os arquivos de composição do Docker no repositório GitHub. Faça as alterações necessárias e substitua os arquivos existentes pelos atualizados.

Inicie os contêineres do servidor novamente.

$ docker compose up -d

Seu servidor de sincronização atualizado está em execução agora.

Mude para o diretório do aplicativo da web.

$ cd ~/snotes-app

Mude para o diretório raiz do aplicativo da web.

$ cd packages/web

Pare o processo existente.

$ pm2 stop api

Volte para o diretório principal do aplicativo.

$ cd ~/snotes-app

Extraia as alterações mais recentes do repositório GitHub.

$ git pull

Volte para dentro do diretório da web.

$ cd packages/web

Inicie o processo.

$ pm2 start api

Seu aplicativo da web deve estar atualizado.

Conclusão

Isso conclui nosso tutorial sobre instalação e configuração do servidor Standard Notes em uma máquina Rocky Linux 9. Se você tiver alguma dúvida, poste-a nos comentários abaixo.