Nostr + Docker no Windows
Nostr + Docker no Windows

Como criar um Relay Nostr privado no Windows.

Neste simples tutorial, vou lhe mostrar como instalar de forma fácil como instalar um Relay Nostr privado com o Docker e Tailscale.

O que você precisa para instalar um Relay Nostr Privado no Windows?

Docker é um sistema de containers, tailscale é pra você ter acesso ao seu relay através da vpn

Configurando o Docker

Não vou entrar no mérito da instalação do Docker que é bem simples, porém, vou deixar as configurações gerais que usei aqui.

Docker configuração.
Docker configuração.

Configurando Tailscale VPN

O Tailscale vai servir para você ter acesso ao seu Relay de qualquer lugar desde que você esteja conectado à VPN.
Aqui as configurações são simples, no menu DNS (pelo computador), habilite o MagicDNS e HTTPS Certificates.

Configurando Nostream

Neste exemplo vou usar como base para configuração do Relay, o caminho (c:\apps)

Crie uma pasta chamada: apps na raiz do seu drive C:
Faça download do Nostream e salve dentro da pasta apps.
Pronto você já tem o código do Relay dentro da pasta apps.

Vamos gerar as chaves HTTPS da máquina no Tailscale VPN.

Abra o terminal CMD e navegue para a pasta apps, exemplo do comando :

cd c:\apps

Rode o comando para obter o certificado https da sua máquina.

tailscale cert

O Tailscale irá gerar certificado da sua máquina, algo como:
test.taild350d.ts.net.keytest.taild350d.ts.net.crt

"test" é o nome da sua máquina e taild350d.ts.net vem do "tailnet name" dentro do Tailscale no menu DNS.

Vamos criar uma pasta core com as subpastas dentro de c:\apps

\---core
    +---domains
    |   \---test.taild350d.ts.net
    |       +---certs
    |       \---log
    +---environment
    |   \---nginx
    |       \---sites-enabled
    |               test.taild350d.ts.net.conf

Vamos executar o comando abaixo partindo de c:\apps

mkdir core && cd core && mkdir domains && cd domains && mkdir test.taild350d.ts.net && cd test.taild350d.ts.net && mkdir certs && mkdir log && cd ../../ && mkdir environment && cd environment && mkdir nginx && cd nginx && mkdir sites-enabled && cd sites-enabled && type NUL > test.taild350d.ts.net.conf && cd ../../../../

Copie as chaves test.taild350d.ts.net.key e test.taild350d.ts.net.crt para dentro da pasta certs core/domains/test.taild350d.ts.net/certs

Atualize as configurações do nginx dentro do arquivo environment/nginx/sites-enabled/test.taild350d.ts.net.conf

server {
    listen 80;
    listen [::]:80;
    server_name test.taild350d.ts.net;
    return 301 https://$server_name$request_uri;
}
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name test.taild350d.ts.net;
    
    ssl_certificate /etc/nginx/certs/test.taild350d.ts.net.crt;
    ssl_certificate_key /etc/nginx/certs/test.taild350d.ts.net.key;
    # ssl_protocols TLSv1.2;
    ssl_session_cache builtin:1000 shared:SSL:10m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!RC4:!3DES:!aDSS:!aNULL:!kPSK:!kSRP:!MD5:@STRENGTH:+SHA1:+kRSA;
    ssl_prefer_server_ciphers on;

    location / {
      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;
  
      proxy_pass          http://nostream:8008;   
      proxy_read_timeout  90;      
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
}

Vamos atualizar o docker-compose.yml dentro da pasta nostream-main.
A intenção aqui é adicionar o nginx para o relay.
Vou deixar a configuração completa do docker-compose.yml, porém, só fiz uma alteração no final do arquivo antes de networks, adicionei o nostream-nginx

services:
  nostream:
    build: .
    container_name: nostream
    environment:
      RELAY_PORT: 8008
      # Master
      NOSTR_CONFIG_DIR: /home/node/.nostr
      DB_HOST: nostream-db
      DB_PORT: 5432
      DB_USER: nostr_ts_relay
      DB_PASSWORD: nostr_ts_relay
      DB_NAME: nostr_ts_relay
      DB_MIN_POOL_SIZE: 16
      DB_MAX_POOL_SIZE: 64
      DB_ACQUIRE_CONNECTION_TIMEOUT: 60000
      # Read Replica
      READ_REPLICA_ENABLED: 'false'
      RR_DB_HOST: db
      RR_DB_PORT: 5432
      RR_DB_USER: nostr_ts_relay
      RR_DB_PASSWORD: nostr_ts_relay
      RR_DB_NAME: nostr_ts_relay
      RR_DB_MIN_POOL_SIZE: 16
      RR_DB_MAX_POOL_SIZE: 64
      RR_DB_ACQUIRE_CONNECTION_TIMEOUT: 10000
      # Redis
      REDIS_HOST: nostream-cache
      REDIS_PORT: 6379
      REDIS_USER: default
      REDIS_PASSWORD: nostr_ts_relay
      TOR_HOST: tor_proxy
      TOR_CONTROL_PORT: 9051
      TOR_PASSWORD: nostr_ts_relay
      HIDDEN_SERVICE_PORT: 80
      # Enable DEBUG for troubleshooting. Examples:
      # DEBUG: "primary:*"
      # DEBUG: "worker:*"
      # DEBUG: "knex:query"
    user: node:node
    volumes:
      - ${PWD}/.nostr:/home/node/.nostr
    ports:
      - 8008:8008
    depends_on:
      nostream-cache:
        condition: service_healthy
      nostream-db:
        condition: service_healthy
      nostream-migrate:
        condition: service_completed_successfully
    restart: on-failure
    networks:
      default:
  nostream-db:
    image: postgres
    container_name: nostream-db
    environment:
      POSTGRES_DB: nostr_ts_relay
      POSTGRES_USER: nostr_ts_relay
      POSTGRES_PASSWORD: nostr_ts_relay
    volumes:
      - ${PWD}/.nostr/data:/var/lib/postgresql/data
      - ${PWD}/.nostr/db-logs:/var/log/postgresql
      - ${PWD}/postgresql.conf:/postgresql.conf
    networks:
      default:
    command: postgres -c 'config_file=/postgresql.conf'
    restart: always
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U nostr_ts_relay"]
      interval: 5s
      timeout: 5s
      retries: 5
      start_period: 360s
    ports:
      - 5432:5432
  nostream-cache:
    image: redis:7.0.5-alpine3.16
    container_name: nostream-cache
    volumes:
      - cache:/data
    command: redis-server --loglevel warning --requirepass nostr_ts_relay
    networks:
      default:
    restart: always
    healthcheck:
      test: [ "CMD", "redis-cli", "ping", "|", "grep", "PONG" ]
      interval: 1s
      timeout: 5s
      retries: 5
  nostream-migrate:
    image: node:18-alpine3.16
    container_name: nostream-migrate
    environment:
      DB_HOST: nostream-db
      DB_PORT: 5432
      DB_USER: nostr_ts_relay
      DB_PASSWORD: nostr_ts_relay
      DB_NAME: nostr_ts_relay
    entrypoint:
      - sh
      - -c
      - 'cd code && npm install --no-save --quiet knex@2.4.0 pg@8.8.0 && npx knex migrate:latest'
    volumes:
      - ./migrations:/code/migrations
      - ./knexfile.js:/code/knexfile.js
    depends_on:
      nostream-db:
        condition: service_healthy
    networks:
      default:
        ipv4_address: 10.10.10.254
  nostream-nginx:
    image: 'nginx:latest'
    restart: always
    ports:
      - '80:80'        
      - '443:443'
    volumes:
      - '../core/environment/nginx/sites-enabled:/etc/nginx/conf.d'        
      - '../core/domains/test.taild350d.ts.net/certs:/etc/nginx/certs'
      - '../core/domains/test.taild350d.ts.net/log:/var/log/nginx'  
    extra_hosts:
      - "test.taild350d.ts.net:host-gateway"
      
networks:
  default:
    name: nostream
    ipam:
      driver: default
      config:
        - subnet: 10.10.10.0/24

volumes:
  cache:
Todas as configurações acima foram feitas a partir do nome da máquina "test" e o Tailnet name taild350d.ts.net mude para as suas configurações.

Agora vamos rodar o nosso relay.
Abra o cmd novamente e execute o comando:

cd c:\apps\nostream-main\ && docker-compose up -d

Feito isso o Docker irá baixar as dependências e iniciar os serviços.

Docker + Nostream Relay Nostr

Testando configurações do Relay

Acesse o site: https://websocketking.com/ e insira o endereço abaixo e clique em Connect:

wss://test.taild350d.ts.net

A cada atualização do nostream você terá que mudar as configurações do docker-compose.yml adicionando o nostream-nginx.
Essa configuração acima foi feita de forma básica, você também poderá utilizar git e outros métodos para rodar o Relay.

Dúvidas? Comente abaixo! 

Apoie este post!
LNURL1DP68...DHKURZ2284