Como instalar o servidor de notas padrão no Rocky Linux 9
Nesta página
- Pré-requisitos
- Passo 1 - Configurar Firewall
- Passo 2 - Instale o Docker e o Docker Compose
- Etapa 3 - Instale o Nginx
- Passo 4 – Instalar SSL
- Etapa 5 - Baixe e configure notas padrão
- Etapa 6 - Inicie o Servidor de Notas Padrão
Etapa 7 - Instale o aplicativo Web Notes padrão
- Instale o Git
- Instale o NodeJS
- Instale o fio
- Instale o gerenciador de pacotes PM2.
- Instale o aplicativo da web
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.