Implantar em qualquer VPS

O guia genérico para um VPS simples com Ubuntu ou Debian — a base para todos os outros guias por plataforma, com notas de systemd, TLS e firewall.

Este é o guia genérico para um VPS Linux simples (qualquer provedor — Hetzner, Vultr, Linode, Contabo, o seu próprio servidor, ...). Os outros guias por plataforma (Digital Ocean, AWS, GCP, Azure) são atalhos deste com os seus passos de firewall específicos do provedor.

1. Instalar o binário

O script install.sh baixa o binário mais recente para a sua arquitetura (x86_64 / aarch64), verifica o seu checksum sha256 e instala-o num diretório do PATH — não é preciso sudo para a instalação em si:

sh
curl -fsSL https://raw.githubusercontent.com/iqbqioza/nostrfy/main/install.sh | sh
nostrfy --version

2. Criar uma configuração

Obtenha o modelo (sem clonar o repositório) e edite-o:

sh
sudo mkdir -p /etc/nostrfy
sudo curl -fsSL -o /etc/nostrfy/nostrfy.toml \
  https://raw.githubusercontent.com/iqbqioza/nostrfy/main/deploy/nostrfy.toml
sudo nano /etc/nostrfy/nostrfy.toml

No mínimo, defina:

toml
[relay]
name = "My Relay"
public_url = "wss://relay.example.com"   # o seu endereço público
private_key = "..."                      # execute 'nostrfy genkey' localmente e cole a chave

[server]
host = "0.0.0.0"                         # já definido no modelo
port = 8080

Gere a chave secreta com:

sh
nostrfy --config /tmp/nostrfy-genkey.toml init && nostrfy --config /tmp/nostrfy-genkey.toml genkey

(Ou use seu próprio arquivo de configuração em vez do modelo — qualquer nostrfy.toml funciona.)

3. Executar como serviço systemd

Obtenha a unit reforçada (sem clonar o repositório) e inicie-a:

sh
sudo curl -fsSL -o /etc/systemd/system/nostrfy.service \
  https://raw.githubusercontent.com/iqbqioza/nostrfy/main/deploy/nostrfy.service
sudo systemctl daemon-reload
sudo systemctl enable --now nostrfy
sudo systemctl status nostrfy

Logs:

sh
journalctl -u nostrfy -f

4. Abrir a porta e verificar

Permita TCP 8080 no seu firewall (ufw, firewall na nuvem, firewall do host):

sh
sudo ufw allow 8080/tcp

Verifique localmente e a partir do exterior:

sh
curl http://localhost:8080/health
curl http://<server-ip>:8080/health        # do seu portátil

5. Colocar um proxy de terminação TLS à frente (para wss://)

O relay serve WebSocket em claro na porta 8080. Para expô-lo como wss://, execute um proxy reverso na porta 443 que termine TLS. O relay respeita X-Forwarded-Proto, por isso não é necessária nenhuma configuração especial.

nginx

/etc/nginx/sites-available/relay:

nginx
server {
    listen 443 ssl;
    server_name relay.example.com;

    ssl_certificate     /etc/letsencrypt/live/relay.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/relay.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Obtenha um certificado gratuito com certbot (sudo certbot --nginx -d relay.example.com).

Caddy

(TLS automático, um arquivo):

caddy
relay.example.com {
    reverse_proxy 127.0.0.1:8080
}

Host de mídia Blossom também

Quando blossom.host = "media.example.com" está definido, esse hostname também precisa alcançar a mesma porta — o relay separa os hosts internamente (como server.api_host). Adicione um segundo bloco server / site para ele:

nginx
server {
    listen 443 ssl;
    server_name media.example.com;

    ssl_certificate     /etc/letsencrypt/live/media.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/media.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
caddy
media.example.com {
    reverse_proxy 127.0.0.1:8080
}

Certifique-se de que relay.public_url na configuração corresponde a wss://relay.example.com.

6. Cópias de segurança

Pare o relay, copie o diretório de dados, reinicie:

sh
sudo systemctl stop nostrfy
sudo tar -czf nostrfy-data-backup.tar.gz /var/lib/nostrfy   # o seu database.path
sudo systemctl start nostrfy

Atualizações

sh
# instalações via pipe nunca pedem confirmação: use --force para sobrescrever um
# binário existente (ou execute o script num terminal e responda y/N)
curl -fsSL https://raw.githubusercontent.com/iqbqioza/nostrfy/main/install.sh | sh -s -- --force
sudo systemctl restart nostrfy