# Deploy da cloud de backups

Este servico foi pensado para correr num subdominio dedicado:

`backups.seudominio.com`

## Componentes

- API Node.js
- Reverse proxy com HTTPS
- Armazenamento por tenant
- Indexacao de metadados por empresa

## Estrutura

```
cloud-backup-server/
  config/
    settings.json
    tenants.json
  storage/
    tenants/
      <tenantId>/
        index.json
        backups/
          <ano>/<mes>/<backupId>.kfbackup
```

## Como o utilizador baixa o proprio backup

1. O utilizador entra no Kwanza Folha.
2. O desktop envia o token do tenant no `Authorization: Bearer ...`.
3. A API devolve so os backups desse tenant.
4. O download usa a mesma autenticao.

## Recomendacao para 10 mil utilizadores

- separar por tenant;
- usar object storage quando houver grande volume;
- manter metadados pequenos no servidor API;
- gerar links assinados curtos se quiseres download direto;
- aplicar retenção automatica por empresa;
- paginar listagens.

## Caminho oficial

`https://backups.alvesestudio.ao/api/v1/kwanza-folha/backups`

Se alterares o subdominio, mantem o path da API para nao quebrar o desktop.

## Nginx

Exemplo de reverse proxy para expor a API em HTTPS:

```nginx
server {
    listen 80;
    server_name backups.alvesestudio.ao;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name backups.alvesestudio.ao;

    ssl_certificate     /etc/letsencrypt/live/backups.alvesestudio.ao/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/backups.alvesestudio.ao/privkey.pem;

    client_max_body_size 100m;

    location / {
        proxy_pass http://127.0.0.1:8787;
        proxy_http_version 1.1;
        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_set_header Connection "";
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    }
}
```

O exemplo pronto para copiar esta em:

`cloud-backup-server/nginx/backups.alvesestudio.ao.conf.example`

## Arranque do servico

No servidor Linux, podes usar PM2:

```bash
pm2 start cloud-backup-server/server.js --name kwanza-backup --env production
pm2 save
pm2 startup
```

Ou systemd:

```ini
[Unit]
Description=Kwanza Folha Cloud Backup
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/kwanza-folha
ExecStart=/usr/bin/node /opt/kwanza-folha/cloud-backup-server/server.js
Restart=always
Environment=KWANZA_CLOUD_CONFIG=/opt/kwanza-folha/cloud-backup-server/config/settings.json

[Install]
WantedBy=multi-user.target
```

O ficheiro exemplo esta em:

`cloud-backup-server/systemd/kwanza-backup.service.example`

Se preferires PM2, usa:

`cloud-backup-server/pm2/ecosystem.config.cjs.example`

## Teste rapido

```bash
curl https://backups.alvesestudio.ao/health
```

E, depois, testa o upload autenticado com o token do tenant.
