BASE/choclo-NAV-PT-VM.md
2026-06-11 13:34:50 +02:00

11837 lines
223 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## ISO Ubuntu per a la VM PeerTube
- Descarreguem la ISO dins del node Proxmox.
- Ruta habitual del storage `local`:
`/var/lib/vz/template/iso/`
- ISO triada:
`ubuntu-26.04-live-server-amd64.iso`
- Motiu:
Ubuntu Server LTS, sense entorn gràfic, adequada per a Docker i serveis de servidor.
- La VM PeerTube serà una VM Ubuntu normal, no un LXC, per evitar problemes amb Docker, AppArmor, nesting i muntatges NFS.
## ISO per a la VM PeerTube
- Sistema triat:
Ubuntu Server 24.04 LTS
- Fitxer ISO:
ubuntu-24.04-live-server-amd64.iso
- Ruta dins Proxmox:
/var/lib/vz/template/iso/
- Motiu:
Versió LTS madura, estable i molt adequada per a Docker, PeerTube i serveis de servidor.
- Objectiu de la VM:
Fer de host Docker per a PeerTube, mantenint la base de dades i els volums interns a la VM, i externalitzant la DATA gran de vídeo cap al TrueNAS.
# Creació de la VM PeerTube
## 0. Descàrrega prèvia de la ISO Ubuntu Server
Abans de crear la màquina virtual, descarreguem la imatge ISO dUbuntu Server dins del node Proxmox.
La ISO ha destar dins del directori dimatges ISO del storage `local` de Proxmox:
```bash
/var/lib/vz/template/iso/
```
Ens situem dins del directori:
```bash
cd /var/lib/vz/template/iso/
```
Descarreguem Ubuntu Server 24.04 LTS:
```bash
wget https://releases.ubuntu.com/24.04/ubuntu-24.04-live-server-amd64.iso
```
Comprovem que la ISO sha descarregat correctament:
```bash
ls -lh /var/lib/vz/template/iso/
Run this command in your terminal in the directory the iso was downloaded to verify the SHA256 checksum:
echo "e907d92eeec9df64163a7e454cbc8d7755e8ddc7ed42f99dbc80c40f1a138433 *ubuntu-24.04.4-live-server-amd64.iso" | shasum -a 256 --check
RESULTAT ESPERAT
ubuntu-24.04.4-live-server-amd64.iso: OK
```
Hauríem de veure un fitxer semblant a aquest:
```text
ubuntu-24.04-live-server-amd64.iso
```
## Decisió presa
Fem servir **Ubuntu Server 24.04 LTS** perquè és una versió estable, de suport llarg i adequada per funcionar com a host Docker.
La VM no tindrà entorn gràfic. Només instal·larem el sistema base, SSH, Docker i Docker Compose.
## Objectiu daquesta VM
Aquesta VM farà de servidor Docker per a PeerTube.
A la VM hi deixarem:
- el sistema Ubuntu;
- Docker i Docker Compose;
- els volums interns necessaris;
- la base de dades PostgreSQL;
- Redis;
- configuració pròpia de PeerTube.
Al TrueNAS hi deixarem:
- els vídeos;
- els fitxers originals;
- les llistes HLS / streaming;
- les miniatures i previews pesades;
- les carpetes dimportació;
- les dades grans que puguin créixer molt.
## Esquema general
```text
Internet
|
v
CT Apache Reverse Proxy
|
| HTTP intern cap a PeerTube
v
VM Ubuntu Server 24.04 + Docker
|
| NFS
v
TrueNAS 192.168.100.101
```
# Creació de la VM PeerTube
## 1. Creació de la màquina virtual a Proxmox
Crearem una nova màquina virtual Ubuntu Server 24.04 LTS que farà de host Docker per al servei PeerTube.
Lobjectiu és evitar els problemes propis dexecutar Docker dins dun contenidor LXC privilegiat i disposar dun sistema Linux complet, més proper a un servidor real.
La VM PeerTube tindrà:
- Ubuntu Server 24.04 LTS.
- Docker i Docker Compose.
- PeerTube desplegat amb Docker Compose.
- Base de dades PostgreSQL en volum local de la VM.
- Redis en volum local de la VM.
- Volums interns petits en disc local.
- Dades grans de vídeo muntades des del TrueNAS per NFS.
El TrueNAS es troba a:
```text
192.168.100.101
```
## 2. Inici de lassistent de creació
Des de la interfície web de Proxmox:
```text
Datacenter → Node base → Create VM
```
En aquest cas el node Proxmox és:
```text
base
```
## 3. Pestanya General
En aquesta pestanya definim el nom i lidentificador de la VM.
### Valors recomanats
```text
Node: base
VM ID: el següent disponible
Name: peertube-vm
Resource Pool: buit, si no en fem servir cap
Start at boot: activat, si volem que arrenqui automàticament amb el Proxmox
```
El nom pot ser, per exemple:
```text
peertube-vm
```
També podríem fer servir un nom més descriptiu:
```text
vm-peertube-docker
```
## 4. Decisió presa
Creem una VM dedicada exclusivament a PeerTube i Docker.
Aquesta VM no farà de proxy invers públic. Aquesta funció continuarà separada en un altre CT amb Apache.
La separació quedarà així:
```text
CT Apache Reverse Proxy
→ publica el servei web
→ gestiona HTTPS
→ fa proxy cap a la VM PeerTube
VM PeerTube
→ executa Docker
→ executa PeerTube
→ executa PostgreSQL
→ executa Redis
→ munta les dades grans des del TrueNAS
VM TrueNAS
→ emmagatzema la DATA gran de vídeo
→ exporta datasets per NFS
```
## 5. Justificació
Aquesta arquitectura separa clarament les funcions:
- El proxy invers queda aïllat del servei daplicació.
- Docker funciona dins duna VM completa, no dins dun LXC.
- Les dades grans no ocupen el disc intern de la VM PeerTube.
- PostgreSQL queda local a la VM per evitar problemes de rendiment i consistència sobre NFS.
- TrueNAS fa el paper que li correspon: emmagatzematge persistent i compartit.
## 6. Resum de la pestanya General
```text
Node: base
VM ID: següent lliure
Name: peertube-vm
Start at boot: sí
```
## 7. Nota sobre el VM ID
El VM ID pot ser qualsevol identificador lliure dins de Proxmox.
Per exemple:
```text
1110
```
o un de nou, si el 1110 ja està ocupat.
Si volem comprovar des de terminal les màquines existents:
```bash
root@base:~# qm list
```
Això mostrarà les VMs existents i ens ajudarà a no repetir cap VM ID.
Exemple de sortida esperada:
```text
VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID
100 truenas running 8192 80.00 ...
1110 peertube-old stopped 8192 80.00 ...
```
En cas que el VM ID proposat ja existeixi, triem el següent lliure.
## 8. Estat del procés
Un cop omplerta la pestanya General, passem a la pestanya següent:
```text
OS
```
# Creació de la VM PeerTube
## 2. Pestanya OS
En aquesta pestanya indiquem quina ISO farà servir la màquina virtual per arrencar la instal·lació del sistema operatiu.
La ISO ja lhem descarregada prèviament dins del node Proxmox, a la ruta habitual del storage `local`:
```bash
root@base:/var/lib/vz/template/iso# ls -lh
```
Hauríem de veure el fitxer:
```text
ubuntu-24.04-live-server-amd64.iso
```
## Valors recomanats a la pestanya OS
A lassistent de Proxmox seleccionem:
```text
Use CD/DVD disc image file (iso): activat
Storage: local
ISO image: ubuntu-24.04-live-server-amd64.iso
Guest OS Type: Linux
Version: 6.x - 2.6 Kernel
```
## Decisió presa
Fem servir **Ubuntu Server 24.04 LTS** com a sistema operatiu de la VM PeerTube.
No instal·larem entorn gràfic, perquè aquesta màquina només farà de servidor.
La VM tindrà únicament:
- sistema base Ubuntu Server;
- accés SSH;
- Docker;
- Docker Compose;
- muntatge NFS contra TrueNAS;
- desplegament de PeerTube.
## Justificació
Ubuntu Server 24.04 LTS és una versió estable i amb suport llarg.
És adequada per a aquest projecte perquè:
- té bon suport per Docker;
- és una distribució molt documentada;
- evita els problemes específics de Docker dins LXC;
- permet muntar NFS de manera normal;
- és més previsible que un contenidor privilegiat.
## Resum de la pestanya OS
```text
ISO: ubuntu-24.04-live-server-amd64.iso
Storage ISO: local
Guest OS: Linux
Version: 6.x - 2.6 Kernel
```
## Estat del procés
Un cop seleccionada la ISO dUbuntu Server 24.04 LTS, passem a la pestanya següent:
```text
System
```
# Creació de la VM PeerTube
## 3. Pestanya System
En aquesta pestanya configurem alguns paràmetres interns de la màquina virtual: BIOS, firmware, controlador SCSI, TPM i opcions bàsiques de maquinari virtual.
Per a una VM Ubuntu Server a Proxmox, pensada per funcionar com a servidor Docker, podem fer una configuració senzilla i estable.
## Valors recomanats a la pestanya System
```text
Graphic card: Default
Machine: q35
BIOS: OVMF (UEFI)
Add EFI Disk: activat
EFI Storage: local-lvm o el storage on posarem els discos de la VM
Pre-Enroll keys: desactivat
SCSI Controller: VirtIO SCSI single
Qemu Agent: activat
Add TPM: desactivat
```
## Sobre el mode UEFI
Fem servir:
```text
BIOS: OVMF (UEFI)
```
Això crea una VM moderna amb arrencada UEFI.
També cal marcar:
```text
Add EFI Disk
```
El disc EFI és petit i només guarda dades darrencada UEFI de la màquina virtual.
## Sobre les claus Secure Boot
Deixem aquesta opció desactivada:
```text
Pre-Enroll keys: no
```
No necessitem Secure Boot per a aquesta VM. Volem una instal·lació simple, fàcil de mantenir i sense complicacions extra.
## Sobre el controlador SCSI
Triem:
```text
SCSI Controller: VirtIO SCSI single
```
Aquest controlador és eficient i habitual en VMs Linux dins Proxmox.
És una bona opció per rendiment i compatibilitat amb Ubuntu Server.
## Sobre Qemu Agent
Activem:
```text
Qemu Agent: yes
```
Això permet que Proxmox es comuniqui millor amb la VM.
Serveix per veure informació interna de la màquina i fer operacions més netes, com apagats controlats.
Després, dins dUbuntu, instal·larem el paquet corresponent:
```bash
root@peertube-vm:~# apt install qemu-guest-agent
```
I lactivarem:
```bash
root@peertube-vm:~# systemctl enable --now qemu-guest-agent
```
## Sobre TPM
Deixem TPM desactivat:
```text
Add TPM: no
```
No és necessari per a una VM Ubuntu Server destinada a Docker i PeerTube.
## Decisió presa
Configurem la VM amb UEFI, controlador VirtIO SCSI i Qemu Agent activat.
Això dona una màquina virtual moderna, eficient i còmoda de gestionar des de Proxmox.
## Justificació
Aquesta configuració és adequada perquè:
- Ubuntu Server 24.04 funciona bé amb UEFI.
- VirtIO SCSI ofereix bon rendiment.
- Qemu Agent facilita la gestió des de Proxmox.
- No necessitem TPM ni Secure Boot.
- Reduïm complexitat innecessària.
## Resum de la pestanya System
```text
Graphic card: Default
Machine: q35
BIOS: OVMF (UEFI)
EFI Disk: sí
FORMAT: QEMU qcow2
Pre-Enroll keys: no
SCSI Controller: VirtIO SCSI single
Qemu Agent: sí
TPM: no
```
## Estat del procés
Un cop configurada la pestanya System, passem a la pestanya següent:
```text
Disks
```
# Creació de la VM PeerTube
## 4. Pestanya Disks
En aquesta pestanya configurem el disc principal de la VM Ubuntu Server.
Aquesta VM farà de host Docker per a PeerTube, però no volem que el disc intern guardi tota la DATA gran de vídeo. Els vídeos i fitxers pesats aniran al TrueNAS.
Per tant, el disc de la VM ha de ser suficient per al sistema, Docker, PostgreSQL, Redis, logs i configuració, però no cal dimensionar-lo com si hagués demmagatzemar tota la mediateca.
## Valors recomanats a la pestanya Disks
```text
Bus/Device: SCSI
Storage: local-lvm o el storage ràpid disponible per a VMs
Disk size: 80 GB o 100 GB
Cache: Default / No cache
Discard: activat
IO thread: activat
SSD emulation: activat si el storage físic és SSD
Backup: activat
Format: qcow2 si el storage és directory; raw/LVM-thin si és local-lvm
```
## Mida del disc
Proposta recomanada:
```text
Disk size: 100 GB
```
També seria acceptable:
```text
Disk size: 80 GB
```
## Decisió presa
Assignem un disc daproximadament:
```text
100 GB
```
Aquest disc contindrà:
- Ubuntu Server 24.04 LTS;
- Docker;
- Docker Compose;
- imatges Docker;
- volums interns de Docker;
- base de dades PostgreSQL;
- Redis;
- configuració de PeerTube;
- logs del sistema i dels contenidors.
No contindrà la DATA gran de vídeo.
## Què NO volem guardar principalment en aquest disc
No volem que aquest disc sigui el magatzem principal de:
- vídeos originals;
- vídeos transcodificats;
- HLS / streaming playlists;
- miniatures grans;
- previews;
- imports massius;
- còpies grans de contingut audiovisual.
Aquestes dades han danar al TrueNAS:
```text
TrueNAS 192.168.100.101
```
## Bus del disc
Triem:
```text
Bus/Device: SCSI
```
Això encaixa amb la decisió de la pestanya anterior:
```text
SCSI Controller: VirtIO SCSI single
```
## Storage del disc
Si el Proxmox té `local-lvm`, és una opció habitual per a discos de VM:
```text
Storage: local-lvm
```
Si tens un altre storage més ràpid o més adequat per a VMs, també seria correcte.
La idea és que el disc intern de la VM sigui raonablement ràpid, especialment per PostgreSQL.
## Format del disc
Segons el tipus de storage:
```text
Si el storage és directory: qcow2
Si el storage és local-lvm: raw / LVM-thin
```
Si Proxmox ofereix explícitament aquestes opcions:
```text
RAW disk image
QEMU image / qcow2
VMware image / vmdk
```
La tria recomanada és:
```text
QEMU image / qcow2
```
però si estem sobre `local-lvm`, és normal que Proxmox treballi amb volum LVM-thin i format tipus `raw`.
## Cache
Deixem:
```text
Cache: Default / No cache
```
Per a una VM servidor amb base de dades PostgreSQL és millor no fer invents amb cache agressiva.
Evitem opcions com `Write back` si no tenim clar el risc, perquè en cas de tall elèctric o caiguda del host podríem tenir més risc de corrupció de dades.
## Discard
Activem:
```text
Discard: yes
```
Això permet que la VM informi el storage quan allibera blocs de disc.
És útil especialment amb storages thin provisioned, SSD o LVM-thin.
## IO thread
Activem:
```text
IO thread: yes
```
Això pot millorar el comportament dentrada/sortida del disc virtual, sobretot en VMs amb càrrega de servei.
## SSD emulation
Activem:
```text
SSD emulation: yes
```
si el disc físic o storage real és SSD.
Si el storage real és disc mecànic, no cal activar-ho.
## Backup
Deixem:
```text
Backup: yes
```
Tot i que la DATA gran estarà al TrueNAS, aquesta VM conté parts importants:
- PostgreSQL;
- configuració;
- volums de Docker;
- fitxers de desplegament.
Per tant, convé que entri dins de les còpies de seguretat de Proxmox.
## Resum de la pestanya Disks
```text
Bus/Device: SCSI
Storage: local-lvm
Disk size: 100 GB
Cache: Default / No cache
Discard: yes
IO thread: yes
SSD emulation: yes, si el storage real és SSD
Backup: yes
Format: qcow2 si és storage directory; raw/LVM-thin si és local-lvm
```
## Justificació
El disc intern de la VM es reserva per al sistema i les dades que convé mantenir locals, especialment PostgreSQL.
La base de dades no es posa al TrueNAS per NFS perquè una base de dades sobre NFS pot donar problemes de rendiment, bloquejos i consistència.
La DATA gran de vídeo sí que es posarà al TrueNAS, perquè és el tipus de dada que encaixa millor amb un NAS.
## Esquema de decisió
```text
Disc VM PeerTube
├── Ubuntu Server
├── Docker
├── PostgreSQL
├── Redis
├── configuració
└── logs
TrueNAS
├── vídeos originals
├── vídeos transcodificats
├── HLS / streaming playlists
├── thumbnails
├── previews
└── imports
```
## Estat del procés
Un cop configurada la pestanya Disks, passem a la pestanya següent:
```text
CPU
```
# Creació de la VM PeerTube
## 4. Correcció de la pestanya Disks
A la pestanya **Disks** faltava documentar una opció important relacionada amb lentrada/sortida del disc:
```text
Async IO
```
## Opció recomanada
Per a aquesta VM deixem:
```text
Async IO: Default (io_uring)
```
## Què és `io_uring`
`io_uring` és el mecanisme modern del kernel Linux per gestionar operacions dentrada/sortida asíncrones.
En una VM Proxmox, això afecta com QEMU/KVM gestiona les lectures i escriptures del disc virtual.
## Decisió presa
Deixem lopció per defecte:
```text
Default (io_uring)
```
## Justificació
És una bona opció per a aquesta VM perquè:
- és el valor modern recomanat per defecte en Proxmox;
- ofereix bon rendiment en càrregues de disc;
- encaixa bé amb VMs Linux modernes;
- Ubuntu Server 24.04 funciona bé en aquest escenari;
- no cal forçar opcions més antigues si no tenim cap error concret.
## Alternatives
Proxmox pot oferir altres opcions com:
```text
native
threads
io_uring
```
En aquest cas no cal canviar-ho manualment.
Només tindria sentit provar una alternativa si apareguessin errors concrets dI/O, bloquejos estranys o problemes de compatibilitat amb el storage.
## Resum actualitzat de la pestanya Disks
```text
Bus/Device: SCSI
Storage: local-lvm
Disk size: 100 GB
Cache: Default / No cache
Discard: yes
IO thread: yes
SSD emulation: yes, si el storage real és SSD
Backup: yes
Async IO: Default (io_uring)
Format: qcow2 si és storage directory; raw/LVM-thin si és local-lvm
```
## Decisió final de la pestanya Disks
El disc intern de la VM PeerTube queda pensat per al sistema i les dades que convé mantenir locals:
- Ubuntu Server;
- Docker;
- imatges Docker;
- volums interns;
- PostgreSQL;
- Redis;
- configuració;
- logs.
La DATA gran de vídeo anirà al TrueNAS i no al disc intern de la VM.
```text
Disc local VM PeerTube
├── sistema Ubuntu
├── Docker
├── PostgreSQL
├── Redis
└── configuració
TrueNAS 192.168.100.101
├── vídeos originals
├── vídeos transcodificats
├── HLS / streaming playlists
├── thumbnails
├── previews
└── imports
```
# Creació de la VM PeerTube
## 5. Pestanya CPU
En aquesta pestanya configurem els recursos de processador assignats a la VM Ubuntu Server que farà de host Docker per a PeerTube.
PeerTube pot fer servir CPU de manera intensiva, sobretot quan ha de transcodificar vídeos. Per això convé donar-li una quantitat de CPU suficient, però sense deixar el node Proxmox sense marge.
## Valors recomanats a la pestanya CPU
```text
Sockets: 1
Cores: 4
Type: host
Enable NUMA: no
Extra CPU Flags: buit
```
## Decisió presa
Assignem a la VM:
```text
1 socket
4 cores
CPU type: host
```
## Justificació
Fem servir:
```text
Type: host
```
perquè la VM pugui aprofitar millor les característiques reals del processador físic del servidor Proxmox.
Això és recomanable per a una VM que executarà Docker i serveis que poden fer ús intensiu de CPU, especialment en tasques de vídeo.
## Sobre el nombre de cores
Una proposta equilibrada és:
```text
Cores: 4
```
Això hauria de ser suficient per:
- executar PeerTube;
- executar PostgreSQL;
- executar Redis;
- executar tasques de backend;
- fer transcodificacions moderades;
- mantenir marge per al sistema.
Si més endavant veiem que la transcodificació va massa lenta, es pot ampliar.
## Sobre sockets
Fem servir:
```text
Sockets: 1
```
No cal simular diversos sockets. Per a aquesta VM és millor una configuració senzilla:
```text
1 socket x 4 cores
```
## Sobre NUMA
Deixem:
```text
Enable NUMA: no
```
NUMA només tindria sentit en màquines molt grans, amb molts cores i molta memòria. Per a aquesta VM no cal.
## Sobre CPU limits
No posem cap límit artificial de CPU en aquest moment.
La VM podrà fer servir els cores assignats quan els necessiti, però Proxmox continuarà gestionant el repartiment de recursos amb la resta de màquines.
## Resum de la pestanya CPU
```text
Sockets: 1
Cores: 4
Type: host
NUMA: no
Extra CPU Flags: buit
```
## Nota sobre transcodificació
La transcodificació de vídeo és una de les parts més costoses de PeerTube.
Amb 4 cores podem començar de manera raonable, però caldrà observar el comportament real del sistema.
Si es fan moltes pujades de vídeo o moltes resolucions de sortida, pot ser necessari:
- augmentar cores;
- limitar la concurrència de transcodificació;
- fer servir resolucions més modestes;
- externalitzar o programar les tasques pesades;
- revisar si interessa acceleració per hardware, si el host ho permet.
## Decisió final de CPU
La VM PeerTube queda configurada inicialment amb:
```text
1 socket x 4 cores
CPU type host
```
És una configuració prudent per començar: suficient per una prova funcional i ampliable si el servei creix.
## Estat del procés
Un cop configurada la pestanya CPU, passem a la pestanya següent:
```text
Memory
```
# Creació de la VM PeerTube
## 5. Correcció de la pestanya CPU
A la pestanya **CPU** faltava documentar el camp:
```text
CPU units
```
Aquest camp serveix per donar més o menys prioritat relativa a una VM quan diverses màquines competeixen per CPU dins del mateix node Proxmox.
## Opció recomanada
Per a aquesta VM deixem:
```text
CPU units: 1024
```
Aquest és el valor per defecte habitual.
## Què vol dir CPU units
`CPU units` no assigna més cores reals a la VM.
La quantitat de cores la defineix aquest altre apartat:
```text
Sockets: 1
Cores: 4
```
En canvi, `CPU units` defineix la prioritat relativa quan hi ha contenció de CPU.
És a dir: quan el node Proxmox va sobrat de CPU, aquest valor pràcticament no es nota. Quan el node està carregat, Proxmox el fa servir per decidir quin pes té cada VM en el repartiment de CPU.
## Decisió presa
Deixem:
```text
CPU units: 1024
```
## Justificació
No cal tocar aquest valor ara perquè:
- és una VM important, però encara estem en fase de desplegament;
- no volem donar-li una prioritat exagerada respecte a altres serveis;
- PeerTube pot consumir CPU durant la transcodificació, però això ho controlarem millor des de la configuració de PeerTube;
- mantenir el valor per defecte facilita entendre el comportament inicial del sistema.
## Quan tindria sentit canviar CPU units
Podríem pujar aquest valor si més endavant veiem que la VM PeerTube queda massa penalitzada quan el node Proxmox està carregat.
Per exemple:
```text
CPU units: 2048
```
Això li donaria més pes respecte a altres VMs amb `1024`.
També podríem baixar-lo si volem que PeerTube no molesti altres serveis quan estigui transcodificant.
Per exemple:
```text
CPU units: 512
```
Això faria que, en situació de càrrega, PeerTube tingués menys prioritat.
## Important
No confondre:
```text
Cores
```
amb:
```text
CPU units
```
Els cores indiquen quants vCPU pot veure i utilitzar la VM.
Les CPU units indiquen la prioritat relativa daquesta VM quan competeix amb altres VMs.
## Resum actualitzat de la pestanya CPU
```text
Sockets: 1
Cores: 4
Type: host
CPU units: 1024
Enable NUMA: no
Extra CPU Flags: buit
```
## Decisió final de CPU
Configurem la VM PeerTube amb:
```text
1 socket
4 cores
CPU type: host
CPU units: 1024
NUMA: no
```
És una configuració equilibrada per començar.
PeerTube podrà fer tasques de transcodificació, però sense donar-li una prioritat especial per sobre de la resta de serveis del node Proxmox.
# Creació de la VM PeerTube
## 6. Pestanya Memory
En aquesta pestanya configurem la memòria RAM assignada a la VM Ubuntu Server que farà de host Docker per a PeerTube.
PeerTube no és només un servei web senzill. També executarà diversos serveis interns, especialment:
- PeerTube;
- PostgreSQL;
- Redis;
- workers;
- processos de transcodificació;
- tasques de manteniment;
- accés a dades muntades des del TrueNAS.
Per això convé no deixar-la massa curta de memòria.
## Valors recomanats a la pestanya Memory
```text
Memory: 8192 MiB
Minimum memory: buit / no ballooning
Ballooning Device: desactivat
Shares: per defecte
```
## Decisió presa
Assignem a la VM:
```text
Memory: 8192 MiB
```
És a dir:
```text
8 GB de RAM
```
## Justificació
8 GB és una quantitat raonable per començar perquè permet executar amb marge:
- sistema Ubuntu Server;
- Docker;
- PeerTube;
- PostgreSQL;
- Redis;
- processos auxiliars;
- alguna transcodificació moderada.
No és una configuració enorme, però és suficient per a una prova funcional i per a un desplegament petit o mitjà.
## Sobre Ballooning
Deixem el ballooning desactivat:
```text
Ballooning Device: no
```
o, si la interfície mostra un camp de memòria mínima:
```text
Minimum memory: buit
```
## Què és el Ballooning
El ballooning permet que Proxmox retiri o retorni RAM a una VM segons la pressió de memòria del host.
Això pot ser útil en entorns amb moltes VMs, però per a aquesta VM preferim una assignació estable.
## Per què no fem servir Ballooning aquí
No activem ballooning perquè aquesta VM tindrà serveis sensibles a memòria i rendiment:
- PostgreSQL;
- PeerTube;
- Docker;
- processos de vídeo.
És millor que la VM tingui una quantitat de RAM fixa i previsible.
## Sobre PostgreSQL
PostgreSQL es quedarà dins de la VM, en volum local.
Això fa que sigui encara més recomanable tenir memòria estable, perquè la base de dades aprofita la RAM per cache i funcionament intern.
## Sobre la DATA de vídeo
Tot i que la DATA gran de vídeo anirà al TrueNAS, la VM continuarà necessitant RAM per gestionar:
- peticions web;
- indexació;
- metadades;
- cues de treball;
- transcodificació;
- accés als fitxers muntats per NFS.
Per tant, el fet que els vídeos vagin al NAS no vol dir que la VM pugui anar molt curta de RAM.
## Opcions possibles
Configuració mínima acceptable:
```text
Memory: 4096 MiB
```
Aquesta opció pot servir per a proves molt petites, però pot quedar justa.
Configuració recomanada:
```text
Memory: 8192 MiB
```
Configuració més còmoda si hi ha recursos disponibles:
```text
Memory: 12288 MiB
```
o bé:
```text
Memory: 16384 MiB
```
## Decisió final de memòria
Per començar triem:
```text
Memory: 8192 MiB
Ballooning: desactivat
```
Aquesta configuració és equilibrada: dona marge suficient a PeerTube sense consumir de manera exagerada els recursos del node Proxmox.
## Resum de la pestanya Memory
```text
Memory: 8192 MiB
Minimum memory: buit
Ballooning Device: no
Shares: per defecte
```
## Estat del procés
Un cop configurada la pestanya Memory, passem a la pestanya següent:
```text
Network
```
# Creació de la VM PeerTube
## 7. Pestanya Network
En aquesta pestanya configurem la targeta de xarxa virtual de la VM Ubuntu Server.
Aquesta VM ha de poder comunicar-se amb:
- el TrueNAS, situat a `192.168.100.101`;
- el CT Apache que farà de proxy invers;
- internet, per descarregar paquets, imatges Docker i actualitzacions;
- la resta de serveis interns del laboratori.
## Valors recomanats a la pestanya Network
```text
Bridge: vmbr0
Model: VirtIO (paravirtualized)
MAC address: auto
VLAN Tag: buit, si no estem separant per VLAN
Firewall: activat o desactivat segons política del Proxmox
Disconnect: no
MTU: buit / default
Queues: buit / default
```
## Decisió presa
Fem servir:
```text
Bridge: vmbr0
Model: VirtIO (paravirtualized)
```
## Justificació
Triem `vmbr0` perquè és el bridge principal del node Proxmox i permet que la VM es comporti com una màquina més de la xarxa.
Això farà que la VM PeerTube pugui tenir una IP pròpia dins la xarxa del laboratori.
Per exemple:
```text
TrueNAS: 192.168.100.101
PeerTube VM: 192.168.100.xxx
Apache Proxy: 192.168.100.xxx o la xarxa interna corresponent
```
La IP exacta de la VM PeerTube la configurarem després durant la instal·lació dUbuntu o posteriorment amb `netplan`.
## Model de targeta
Triem:
```text
Model: VirtIO (paravirtualized)
```
VirtIO és el model recomanat per a Linux dins Proxmox perquè ofereix millor rendiment que targetes emulades com Intel E1000.
## VLAN Tag
Deixem:
```text
VLAN Tag: buit
```
Això vol dir que la VM entrarà directament a la xarxa associada al bridge `vmbr0`.
Només posaríem una VLAN si el Proxmox ja tingués una configuració de xarxa amb VLANs i volguéssim situar aquesta VM dins una VLAN concreta.
## Firewall
Hi ha dues opcions raonables:
```text
Firewall: no
```
o bé:
```text
Firewall: yes
```
Per començar, si encara no tenim regles definides a Proxmox, podem deixar-lo desactivat.
La seguretat principal la controlarem amb:
- el firewall del propi Ubuntu, si cal;
- el reverse proxy Apache;
- el fet que PeerTube no sexposarà directament a internet;
- la separació entre proxy i aplicació.
## Decisió recomanada per començar
```text
Firewall: no
```
Més endavant, quan tinguem clar quins ports necessitem, podem activar firewall i afegir regles.
## Ports que previsiblement necessitarà la VM PeerTube
La VM PeerTube haurà descoltar internament el servei web de PeerTube, normalment:
```text
9000/tcp
```
Aquest port no cal exposar-lo públicament.
Només lhaurà de poder veure el CT Apache Reverse Proxy.
També necessitarà sortida cap a internet per:
```text
80/tcp
443/tcp
53/udp
123/udp
```
I accés cap al TrueNAS per NFS:
```text
2049/tcp
```
Segons la versió/configuració de NFS, també poden intervenir altres ports, però si fem NFSv4 normalment el port principal és el `2049`.
## Esquema de xarxa previst
```text
Internet
|
v
CT Apache Reverse Proxy
|
| HTTP intern cap a port 9000
v
VM Ubuntu Server PeerTube
|
| NFS cap a 192.168.100.101
v
TrueNAS
```
## Configuració dIP
En aquesta pestanya de Proxmox no configurem encara la IP del sistema operatiu.
La IP es configurarà després dins dUbuntu Server.
Podem fer-ho de dues maneres:
```text
Opció A: DHCP inicial i després reserva al router
Opció B: IP estàtica amb netplan dins dUbuntu
```
Per a un servidor, la millor opció final és IP estàtica.
Per exemple:
```text
PeerTube VM: 192.168.100.102
TrueNAS: 192.168.100.101
Gateway: 192.168.100.1
DNS: 1.1.1.1 / 8.8.8.8 / DNS local
```
La IP exacta la podem decidir quan instal·lem Ubuntu.
## Resum de la pestanya Network
```text
Bridge: vmbr0
Model: VirtIO (paravirtualized)
MAC address: auto
VLAN Tag: buit
Firewall: no, inicialment
Disconnect: no
MTU: default
Queues: default
```
## Decisió final de xarxa
La VM PeerTube queda connectada al bridge principal de Proxmox amb una targeta VirtIO.
Això permetrà que la màquina tingui connectivitat directa amb el TrueNAS i amb el CT Apache que farà de proxy invers.
La VM no publicarà directament el servei cap a internet. El servei públic continuarà passant pel CT Apache.
## Estat del procés
Un cop configurada la pestanya Network, passem a la pestanya següent:
```text
Confirm
```
# Instal·lació dUbuntu Server 24.04 a la VM PeerTube
## 8. Instal·lador Ubuntu Server: idioma, teclat i tipus dinstal·lació
Un cop creada la VM a Proxmox i arrencada amb la ISO dUbuntu Server 24.04 LTS, comença lassistent dinstal·lació del sistema operatiu.
En aquesta fase configurem:
- idioma de linstal·lador;
- distribució del teclat;
- tipus dinstal·lació;
- drivers de tercers.
## Idioma de linstal·lador
Seleccionem:
```text
Català
```
Això farà que linstal·lador mostri els menús en català.
## Teclat
A lapartat de teclat, fem servir la detecció automàtica per pulsacions.
Opció triada:
```text
Detectar la disposició del teclat
```
Durant la detecció, linstal·lador demana prémer algunes tecles. Això permet identificar correctament el tipus de teclat.
El resultat esperat seria un teclat de tipus:
```text
Spanish / Catalan-compatible
```
o equivalent, segons com ho mostri linstal·lador.
## Decisió presa sobre el teclat
Fem servir la detecció automàtica perquè és la manera més segura devitar errors amb caràcters importants com:
```text
/
-
_
:
;
@
```
Això és important perquè aquesta VM es gestionarà molt per terminal i SSH.
## Tipus dinstal·lació
Linstal·lador ofereix opcions semblants a:
```text
Ubuntu Server
Ubuntu Server (minimal)
```
Per aquesta VM triem:
```text
Ubuntu Server
```
## Per què no triem Minimal Server
La instal·lació mínima pot semblar atractiva perquè instal·la menys paquets, però per a aquest cas no ens aporta gaire avantatge.
Aquesta VM farà de host Docker per a PeerTube i necessitarem una base de sistema còmoda, amb eines habituals de servidor.
Amb la instal·lació normal dUbuntu Server tindrem una base més pràctica per administrar el sistema.
## Decisió presa
Seleccionem:
```text
Ubuntu Server
```
No seleccionem:
```text
Ubuntu Server (minimal)
```
## Justificació
Triem la instal·lació normal perquè aquesta VM haurà de fer tasques de servidor reals:
- instal·lar Docker;
- instal·lar Docker Compose;
- muntar NFS;
- gestionar serveis amb systemd;
- administrar xarxa;
- revisar logs;
- instal·lar eines bàsiques de diagnosi;
- mantenir PeerTube i els seus contenidors.
La versió minimal és més austera, però després probablement hauríem dinstal·lar manualment més eines bàsiques.
## Drivers de terceres parts
Marquem lopció:
```text
Install third-party drivers
```
o equivalent en català:
```text
Instal·lar controladors de tercers
```
## Decisió presa sobre drivers
Activem els drivers de tercers.
## Justificació
Tot i que és una VM i normalment no necessitarem drivers especials de Wi-Fi, GPU o maquinari físic, marcar aquesta opció no és problemàtic en aquest escenari.
Pot ajudar si Ubuntu detecta algun component virtual o suport addicional que sigui convenient instal·lar.
En una VM de servidor no és una opció crítica, però la deixem activada perquè no ens perjudica i pot evitar mancances puntuals.
## Resum daquesta pantalla
```text
Idioma: Català
Teclat: detectat per pulsacions
Tipus dinstal·lació: Ubuntu Server
Minimal Server: no
Drivers de terceres parts: sí
```
## Decisió final
Instal·lem una Ubuntu Server 24.04 LTS estàndard, no minimal, amb teclat detectat automàticament i drivers de terceres parts activats.
Aquesta decisió prioritza estabilitat i comoditat dadministració per sobre de tenir una instal·lació extremadament mínima.
## Estat del procés
Un cop triades aquestes opcions, continuem cap a la configuració de xarxa de linstal·lador.
# Instal·lació dUbuntu Server 24.04 a la VM PeerTube
## 9. Configuració de xarxa de la VM
Durant la instal·lació dUbuntu Server configurem la xarxa de la nova VM PeerTube.
Assignem una IP fixa dins la mateixa xarxa on ja tenim el TrueNAS.
## Dades de xarxa conegudes
El TrueNAS està a:
```text
192.168.100.101
```
Per a la VM PeerTube assignem:
```text
192.168.100.111
```
## Decisió presa
La VM PeerTube tindrà IP fixa:
```text
192.168.100.111
```
Això permetrà que el CT Apache Reverse Proxy pugui apuntar sempre a la mateixa IP interna.
També facilitarà el muntatge NFS cap al TrueNAS.
## Configuració recomanada
A linstal·lador dUbuntu Server, a la pantalla de xarxa, editem la interfície detectada i configurem IPv4 manual.
Els valors serien:
```text
IPv4 Method: Manual
Subnet: 192.168.100.0/24
Address: 192.168.100.111
Gateway: 192.168.100.1
Name servers: 1.1.1.1, 8.8.8.8
Search domains: buit
```
## Nota sobre el gateway
El gateway probable és:
```text
192.168.100.1
```
Això depèn de la teva xarxa real.
Si el router/gateway de la xarxa 192.168.100.0/24 és un altre, cal posar aquell.
## Nota sobre DNS
Podem posar DNS públics:
```text
1.1.1.1
8.8.8.8
```
O bé un DNS intern si la xarxa en té un.
Per començar, els DNS públics són suficients perquè la VM pugui descarregar paquets, imatges Docker i actualitzacions.
## Esquema de xarxa
```text
TrueNAS
IP: 192.168.100.101
Funció: emmagatzematge NFS per a la DATA de vídeo
PeerTube VM
IP: 192.168.100.111
Funció: host Docker amb PeerTube, PostgreSQL i Redis
Apache Reverse Proxy CT
Funció: HTTPS públic i proxy cap a PeerTube
Backend previst: http://192.168.100.111:9000
```
## Resum de configuració
```text
IP PeerTube VM: 192.168.100.111
Xarxa: 192.168.100.0/24
Gateway: 192.168.100.1
DNS: 1.1.1.1, 8.8.8.8
TrueNAS: 192.168.100.101
```
## Justificació
Fem servir IP fixa perquè aquesta VM serà un servidor.
Això evita que canviï la IP després dun reinici i simplifica:
- la configuració del proxy invers Apache;
- el muntatge NFS amb TrueNAS;
- les proves de connectivitat;
- la documentació del desplegament;
- el manteniment posterior.
## Comprovacions posteriors
Quan Ubuntu ja estigui instal·lat, comprovarem la xarxa amb:
```bash
root@peertube-vm:~# ip a
```
```bash
root@peertube-vm:~# ip route
```
```bash
root@peertube-vm:~# ping -c 4 192.168.100.101
```
```bash
root@peertube-vm:~# ping -c 4 1.1.1.1
```
```bash
root@peertube-vm:~# ping -c 4 google.com
```
## Estat del procés
Un cop configurada la xarxa amb la IP fixa `192.168.100.111`, continuem amb la configuració del proxy de linstal·lador, si apareix.
# Instal·lació dUbuntu Server 24.04 a la VM PeerTube
## 10. Configuració del disc durant la instal·lació
Durant la instal·lació dUbuntu Server, lassistent ens pregunta com volem particionar el disc.
En aquest cas farem una instal·lació senzilla:
```text
Tot el sistema en un únic disc virtual
```
Aquest disc és el que hem creat abans des de Proxmox per a la VM PeerTube.
## Per què pregunta per LVM?
Ubuntu Server marca per defecte lopció de fer servir **LVM** perquè és una forma flexible de gestionar volums de disc en Linux.
LVM vol dir:
```text
Logical Volume Manager
```
És una capa intermèdia entre el disc físic o virtual i els sistemes de fitxers.
En lloc de crear particions rígides directament sobre el disc, Ubuntu crea:
```text
Disc virtual
→ partició física
→ grup de volums LVM
→ volums lògics
→ sistema de fitxers
```
## Opció que apareix marcada
Linstal·lador sol mostrar una opció semblant a:
```text
Set up this disk as an LVM group
```
o en català:
```text
Configura aquest disc com a grup LVM
```
Aquesta opció ve marcada per defecte.
## La deixem marcada?
Sí. Per aquesta VM podem deixar LVM activat.
## Decisió presa
Fem servir:
```text
Use an entire disk: sí
Set up this disk as an LVM group: sí
Encrypt the LVM group with LUKS: no
```
## Per què deixem LVM activat?
LVM ens pot anar bé perquè:
- és el valor per defecte dUbuntu Server;
- és estable i molt habitual en servidors Linux;
- permet ampliar volums més fàcilment en el futur;
- encaixa bé amb una VM que podria créixer;
- no ens complica gaire ladministració normal del sistema.
## Per què NO activem xifrat LUKS?
No activem:
```text
Encrypt the LVM group with LUKS
```
Per aquesta VM no volem xifrat de disc perquè:
- complicaria larrencada automàtica;
- podria demanar contrasenya al boot;
- no és necessari per a aquest laboratori;
- el Proxmox ja controla laccés al disc virtual;
- la DATA gran estarà al TrueNAS, no en aquest disc.
## Tot en un disc
Triem el disc virtual sencer.
Lesquema conceptual queda així:
```text
Disc virtual de la VM
├── partició EFI
├── partició /boot
└── LVM
└── volum root /
```
## Important sobre la mida del volum root
A vegades Ubuntu Server, quan fa servir LVM, no assigna automàticament tot lespai disponible al volum root `/`.
Pot crear un volum root més petit i deixar espai lliure dins el grup LVM.
Per tant, a la pantalla de resum del particionament cal mirar si el volum `/` ocupa gairebé tot el disc disponible.
## Què volem en aquesta VM?
Volem que el sistema tingui disponible pràcticament tot el disc intern de la VM.
Per tant, si el disc és de:
```text
100 GB
```
ens interessa que el volum principal `/` tingui una mida propera a:
```text
100 GB
```
descomptant EFI, `/boot` i petites reserves.
## Si Ubuntu deixa espai lliure dins LVM
Si a la pantalla de resum veiem alguna cosa com:
```text
free space dins ubuntu-vg
```
o que `/` només té una part del disc, podem editar el volum root i ampliar-lo durant la instal·lació.
Lobjectiu és evitar que el sistema quedi amb, per exemple, només 50 GB útils mentre la resta queda sense assignar.
## Resum de configuració del disc
```text
Use an entire disk: sí
Disk selected: disc virtual de la VM
Set up this disk as an LVM group: sí
Encrypt with LUKS: no
Filesystem principal: ext4
Mount point principal: /
```
## Decisió final
Instal·lem Ubuntu Server fent servir tot el disc virtual i mantenint LVM activat.
No activem xifrat.
Aquesta és una configuració estàndard, estable i flexible per a una VM de servidor.
## Justificació per al projecte PeerTube
Aquest disc local servirà per:
- Ubuntu Server;
- Docker;
- imatges Docker;
- volums interns;
- PostgreSQL;
- Redis;
- configuració;
- logs.
La DATA gran de vídeo no dependrà daquest disc, perquè anirà muntada des del TrueNAS.
## Repartiment previst de dades
```text
Disc local VM PeerTube
├── sistema Ubuntu
├── Docker
├── PostgreSQL
├── Redis
├── configuració
└── logs
TrueNAS 192.168.100.101
├── vídeos originals
├── vídeos transcodificats
├── HLS / streaming playlists
├── thumbnails
├── previews
└── imports
```
## Comprovació posterior
Quan el sistema ja estigui instal·lat, podrem veure lestat del disc amb:
```bash
root@peertube-vm:~# lsblk
```
```bash
root@peertube-vm:~# df -h
```
I si calgués revisar LVM:
```bash
root@peertube-vm:~# vgs
```
```bash
root@peertube-vm:~# lvs
```
## Estat del procés
Un cop confirmat el particionament, linstal·lador avisarà que escriurà els canvis al disc.
Acceptem només si el disc seleccionat és el disc virtual de la VM PeerTube.
# Instal·lació dUbuntu Server 24.04 a la VM PeerTube
## 11. Primer reinici de la VM
Un cop acabada la instal·lació dUbuntu Server, linstal·lador demana reiniciar la màquina.
En aquest punt pot passar que la VM torni a arrencar des de la ISO dinstal·lació si encara està muntada com a CD/DVD.
Per evitar-ho, hem tret la ISO de la unitat virtual abans de reiniciar la VM.
## Acció realitzada
A Proxmox hem anat a la configuració de la VM i hem retirat la ISO dinstal·lació.
La ruta és:
```text
VM PeerTube → Hardware → CD/DVD Drive → Edit
```
I hem deixat la unitat sense ISO muntada:
```text
Do not use any media
```
o equivalent.
## Per què cal treure la ISO?
Durant la instal·lació, la VM arrenca des de:
```text
ubuntu-24.04-live-server-amd64.iso
```
Quan Ubuntu ja està instal·lat al disc virtual, volem que la VM arrenqui des del disc i no torni a entrar a linstal·lador.
Per això retirem la ISO o canviem lordre darrencada.
## Decisió presa
Després de completar la instal·lació:
```text
ISO retirada de la unitat CD/DVD virtual
VM reiniciada
Arrencada des del disc virtual
```
## Comprovació a Proxmox
També podem revisar lordre darrencada:
```text
VM PeerTube → Options → Boot Order
```
Lordre correcte hauria de prioritzar el disc de la VM:
```text
scsi0
```
I deixar el CD/DVD sense prioritat, o sense ISO muntada.
## Resultat esperat
Després del reinici, la VM hauria darrencar directament a Ubuntu Server i mostrar una pantalla de login semblant a:
```text
Ubuntu 24.04 LTS peertube-vm tty1
peertube-vm login:
```
## Primera entrada al sistema
Entrem amb lusuari creat durant la instal·lació.
Si lusuari creat és, per exemple:
```text
xab
```
farem login amb aquest usuari.
Després, podem passar a root amb:
```bash
xab@peertube-vm:~$ sudo -i
```
El prompt passarà a ser:
```bash
root@peertube-vm:~#
```
## Primeres comprovacions
Un cop dins la VM, comprovem que el sistema ha arrencat correctament.
### Comprovar hostname
```bash
root@peertube-vm:~# hostname
```
Resultat esperat:
```text
peertube-vm
```
### Comprovar IP
```bash
root@peertube-vm:~# ip a
```
Hauríem de veure la IP configurada:
```text
192.168.100.111
```
### Comprovar ruta per defecte
```bash
root@peertube-vm:~# ip route
```
Hauríem de veure una ruta semblant a:
```text
default via 192.168.100.1
```
### Comprovar connexió amb TrueNAS
```bash
root@peertube-vm:~# ping -c 4 192.168.100.101
```
Si respon, la VM PeerTube veu correctament el TrueNAS.
### Comprovar sortida a internet
```bash
root@peertube-vm:~# ping -c 4 1.1.1.1
```
### Comprovar DNS
```bash
root@peertube-vm:~# ping -c 4 google.com
```
Si aquest últim funciona, la xarxa i el DNS estan correctes.
## Actualització inicial del sistema
Un cop comprovat que la xarxa funciona, actualitzem paquets.
```bash
root@peertube-vm:~# apt update
```
```bash
root@peertube-vm:~# apt upgrade -y
```
## Instal·lació del Qemu Guest Agent
Com que a Proxmox hem activat lopció:
```text
Qemu Agent: enabled
```
ara instal·lem el servei dins dUbuntu.
```bash
root@peertube-vm:~# apt install -y qemu-guest-agent
```
Lactivem i larranquem:
```bash
root@peertube-vm:~# systemctl enable --now qemu-guest-agent
```
Comprovem lestat:
```bash
root@peertube-vm:~# systemctl status qemu-guest-agent
```
## Instal·lació deines bàsiques
Instal·lem algunes eines útils per administrar la VM.
```bash
root@peertube-vm:~# apt install -y curl wget git vim nano htop net-tools ca-certificates gnupg lsb-release
```
## Instal·lació de suport NFS
Com que aquesta VM haurà de muntar dades des del TrueNAS, instal·lem el client NFS.
```bash
root@peertube-vm:~# apt install -y nfs-common
```
## Resum de la fase actual
```text
Ubuntu Server 24.04 instal·lat
ISO retirada de la VM
Arrencada des del disc virtual
IP prevista: 192.168.100.111
TrueNAS: 192.168.100.101
Qemu Guest Agent pendent o instal·lat
NFS client pendent o instal·lat
```
## Decisió documentada
Després de la instal·lació, retirem la ISO perquè la VM arrenqui directament des del disc virtual.
Aquesta és una acció normal després dinstal·lar qualsevol sistema operatiu en una VM.
## Estat del procés
El següent pas serà deixar el sistema base preparat:
```text
actualitzar Ubuntu
activar qemu-guest-agent
comprovar xarxa
instal·lar eines bàsiques
instal·lar client NFS
preparar Docker
```
# Configuració daccés SSH amb clau pública
## 12. Objectiu
Volem poder accedir per SSH sense contrasenya a:
```text
VM PeerTube Ubuntu: 192.168.100.111
Node Proxmox: base
```
La idea és posar la nostra clau pública SSH als fitxers `authorized_keys` corresponents.
Quan laccés per clau funcioni correctament, desactivarem el login SSH per contrasenya.
## 13. Escenari
Treballarem amb tres màquines:
```text
Ordinador personal
→ lloc on ja tenim la clau privada i pública SSH
Proxmox
→ node base
VM PeerTube
→ Ubuntu Server 24.04
→ IP: 192.168.100.111
```
## 14. Comprovar la clau pública al nostre ordinador
Al nostre ordinador local, comprovem si ja tenim clau pública SSH.
```bash
xab@host-xab:~$ ls -lh ~/.ssh/
```
Normalment veurem fitxers semblants a:
```text
id_ed25519
id_ed25519.pub
known_hosts
```
La clau pública és el fitxer acabat en `.pub`.
Per veure-la:
```bash
xab@host-xab:~$ cat ~/.ssh/id_ed25519.pub
```
La sortida serà una línia llarga semblant a:
```text
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... xab@host-xab
```
Aquesta línia sencera és la que hem de copiar dins dels fitxers `authorized_keys` dels servidors.
## 15. Si no tenim clau SSH creada
Si no existís cap clau, en creem una.
```bash
xab@host-xab:~$ ssh-keygen -t ed25519 -C "xab@host-xab"
```
Acceptem la ruta per defecte:
```text
/home/xab/.ssh/id_ed25519
```
Podem posar passphrase o deixar-la buida.
Per a més seguretat, és millor posar passphrase. Per a laboratori, es pot deixar buida si volem accés directe.
## 16. Copiar la clau pública a la VM PeerTube
La manera més còmoda és fer servir `ssh-copy-id`.
Si lusuari creat durant la instal·lació dUbuntu és `xab`, fem:
```bash
xab@host-xab:~$ ssh-copy-id xab@192.168.100.111
```
Ens demanarà la contrasenya de lusuari `xab` de la VM.
Després provem laccés:
```bash
xab@host-xab:~$ ssh xab@192.168.100.111
```
Si entra sense demanar la contrasenya de lusuari remot, la clau ja funciona.
## 17. Revisar permisos a la VM PeerTube
Un cop dins la VM PeerTube:
```bash
xab@peertube-vm:~$ sudo -i
```
Comprovem la carpeta `.ssh` de lusuari:
```bash
root@peertube-vm:~# ls -ld /home/xab/.ssh
```
```bash
root@peertube-vm:~# ls -lh /home/xab/.ssh/authorized_keys
```
Els permisos correctes han de ser:
```text
/home/xab/.ssh 700
/home/xab/.ssh/authorized_keys 600
```
Els deixem correctes explícitament:
```bash
root@peertube-vm:~# chown -R xab:xab /home/xab/.ssh
```
```bash
root@peertube-vm:~# chmod 700 /home/xab/.ssh
```
```bash
root@peertube-vm:~# chmod 600 /home/xab/.ssh/authorized_keys
```
## 18. Crear un àlies SSH per entrar més còmode a la VM
Al nostre ordinador local editem el fitxer de configuració SSH:
```bash
xab@host-xab:~$ nano ~/.ssh/config
```
Afegim:
```sshconfig
Host peertube-vm
HostName 192.168.100.111
User xab
IdentityFile ~/.ssh/id_ed25519
```
Protegim el fitxer:
```bash
xab@host-xab:~$ chmod 600 ~/.ssh/config
```
Ara ja podem entrar amb:
```bash
xab@host-xab:~$ ssh peertube-vm
```
## 19. Copiar la clau pública al node Proxmox
També volem poder entrar al Proxmox sense contrasenya.
Si volem entrar com a `root` al node `base`, fem:
```bash
xab@host-xab:~$ ssh-copy-id root@IP_DEL_PROXMOX
```
Per exemple, si el Proxmox fos `192.168.100.10`:
```bash
xab@host-xab:~$ ssh-copy-id root@192.168.100.10
```
Després provem:
```bash
xab@host-xab:~$ ssh root@192.168.100.10
```
Si entra sense demanar contrasenya, ja funciona.
## 20. Revisar permisos al Proxmox
Un cop dins del node Proxmox:
```bash
root@base:~# ls -ld /root/.ssh
```
```bash
root@base:~# ls -lh /root/.ssh/authorized_keys
```
Els permisos correctes són:
```text
/root/.ssh 700
/root/.ssh/authorized_keys 600
```
Els deixem correctes explícitament:
```bash
root@base:~# chown -R root:root /root/.ssh
```
```bash
root@base:~# chmod 700 /root/.ssh
```
```bash
root@base:~# chmod 600 /root/.ssh/authorized_keys
```
## 21. Crear un àlies SSH per al Proxmox
Al nostre ordinador local:
```bash
xab@host-xab:~$ nano ~/.ssh/config
```
Afegim també:
```sshconfig
Host proxmox-base
HostName 192.168.100.10
User root
IdentityFile ~/.ssh/id_ed25519
```
Canviem `192.168.100.10` per la IP real del node Proxmox.
Ara podrem entrar amb:
```bash
xab@host-xab:~$ ssh proxmox-base
```
## 22. Fitxer SSH config complet dexemple
El fitxer local podria quedar així:
```sshconfig
Host peertube-vm
HostName 192.168.100.111
User xab
IdentityFile ~/.ssh/id_ed25519
Host proxmox-base
HostName 192.168.100.10
User root
IdentityFile ~/.ssh/id_ed25519
```
Amb això tindrem dos accessos curts:
```bash
xab@host-xab:~$ ssh peertube-vm
```
```bash
xab@host-xab:~$ ssh proxmox-base
```
## 23. Alternativa manual si no fem servir ssh-copy-id
Si `ssh-copy-id` no funciona, podem fer-ho manualment.
Primer copiem la clau pública del nostre ordinador:
```bash
xab@host-xab:~$ cat ~/.ssh/id_ed25519.pub
```
Copiem tota la línia.
Després, a la VM PeerTube:
```bash
xab@peertube-vm:~$ mkdir -p ~/.ssh
```
```bash
xab@peertube-vm:~$ nano ~/.ssh/authorized_keys
```
Enganxem la clau pública en una sola línia.
Després ajustem permisos:
```bash
xab@peertube-vm:~$ chmod 700 ~/.ssh
```
```bash
xab@peertube-vm:~$ chmod 600 ~/.ssh/authorized_keys
```
En el cas de Proxmox, com a root:
```bash
root@base:~# mkdir -p /root/.ssh
```
```bash
root@base:~# nano /root/.ssh/authorized_keys
```
Enganxem la clau pública i ajustem permisos:
```bash
root@base:~# chmod 700 /root/.ssh
```
```bash
root@base:~# chmod 600 /root/.ssh/authorized_keys
```
```bash
root@base:~# chown -R root:root /root/.ssh
```
## 24. Comprovar que laccés per clau funciona
Des del nostre ordinador local:
```bash
xab@host-xab:~$ ssh peertube-vm
```
I també:
```bash
xab@host-xab:~$ ssh proxmox-base
```
Si tots dos accessos funcionen sense demanar la contrasenya de lusuari remot, ja podem passar a endurir SSH.
## 25. Desactivar login SSH per contrasenya a la VM PeerTube
Primer fem una còpia del fitxer de configuració SSH.
```bash
root@peertube-vm:~# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
```
Editem el fitxer:
```bash
root@peertube-vm:~# nano /etc/ssh/sshd_config
```
Busquem o afegim aquestes línies:
```text
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
```
En aquesta VM no cal permetre login directe de root. Entrem com a `xab` i, si cal, fem:
```bash
xab@peertube-vm:~$ sudo -i
```
Comprovem la configuració abans de reiniciar el servei:
```bash
root@peertube-vm:~# sshd -t
```
Si no mostra cap error, reiniciem SSH:
```bash
root@peertube-vm:~# systemctl restart ssh
```
## 26. Desactivar login SSH per contrasenya al Proxmox
Al Proxmox cal anar amb més cura, perquè és el node host.
Primer, abans de tocar res, deixem oberta una sessió SSH funcional.
Després fem còpia de seguretat:
```bash
root@base:~# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
```
Editem:
```bash
root@base:~# nano /etc/ssh/sshd_config
```
Configurem:
```text
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
PermitRootLogin prohibit-password
```
Aquesta opció permet login de root només amb clau pública, però no amb contrasenya:
```text
PermitRootLogin prohibit-password
```
Comprovem sintaxi:
```bash
root@base:~# sshd -t
```
Si no dona cap error:
```bash
root@base:~# systemctl restart ssh
```
## 27. Prova de seguretat després dels canvis
Sense tancar la sessió SSH que ja tenim oberta, obrim una nova terminal local i provem:
```bash
xab@host-xab:~$ ssh peertube-vm
```
I també:
```bash
xab@host-xab:~$ ssh proxmox-base
```
Si entren correctament, laccés per clau funciona.
Ara provem que la contrasenya ja no serveix. Podem forçar SSH a no usar clau:
```bash
xab@host-xab:~$ ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no peertube-vm
```
Hauria de fallar.
També amb Proxmox:
```bash
xab@host-xab:~$ ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no proxmox-base
```
També hauria de fallar.
## 28. Resum de decisió
Configurem laccés SSH amb clau pública per a:
```text
VM PeerTube: 192.168.100.111
Node Proxmox: base
```
Afegim àlies SSH locals:
```text
peertube-vm
proxmox-base
```
Un cop validat laccés per clau, desactivem lautenticació per contrasenya.
## 29. Estat final esperat
```text
ssh peertube-vm
→ entra a la VM Ubuntu sense contrasenya remota
ssh proxmox-base
→ entra al node Proxmox sense contrasenya remota
PasswordAuthentication
→ desactivat
PubkeyAuthentication
→ activat
```
## 30. Notes importants
No sha de desactivar el login per contrasenya fins haver comprovat que laccés amb clau funciona.
És recomanable mantenir una sessió SSH oberta mentre es reinicia el servei SSH, per evitar quedar-nos fora en cas derror de configuració.
En la VM PeerTube desactivem el login directe de root.
En el node Proxmox permetem root només amb clau pública, perquè és habitual administrar Proxmox com a root per SSH.
# SSH amb ProxyJump: la clau local i la clau del Proxmox
## Dubte
Quan fem:
```bash
xab@host-xab:~$ ssh -J root@IP_DEL_PROXMOX xab@192.168.100.111
```
pot semblar que el Proxmox entra al PeerTube “amb la seva clau”, però no és exactament així.
## Explicació curta
Amb `ProxyJump`, el Proxmox fa de pont.
El camí és:
```text
ordinador local
→ SSH cap al Proxmox
→ túnel cap al PeerTube
```
Però lautenticació final contra el PeerTube la fa el client SSH del teu ordinador local.
Per això el PeerTube ha de tenir autoritzada la clau pública del teu ordinador local.
## Quan serien la mateixa clau?
Serien la mateixa clau només si el fitxer de clau privada és el mateix en tots dos llocs.
Per exemple, si tant al teu ordinador local com al Proxmox existeix exactament aquesta mateixa clau privada:
```text
~/.ssh/id_ed25519
```
Això no és habitual ni recomanable.
El més normal és tenir:
```text
Ordinador local:
/home/xab/.ssh/id_ed25519
/home/xab/.ssh/id_ed25519.pub
Proxmox:
/root/.ssh/id_ed25519
/root/.ssh/id_ed25519.pub
```
Aquestes dues claus poden tenir el mateix nom, però no són la mateixa clau.
## Com comprovar si són la mateixa
Al teu ordinador local:
```bash
xab@host-xab:~$ ssh-keygen -lf ~/.ssh/id_ed25519.pub
```
Al Proxmox:
```bash
root@base:~# ssh-keygen -lf ~/.ssh/id_ed25519.pub
```
Si surt el mateix fingerprint, són la mateixa clau.
Si surt diferent fingerprint, són claus diferents.
Exemple de fingerprint:
```text
256 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xab@host-xab (ED25519)
```
## Què ha passat en el teu cas
Tu has fet:
```text
local → proxmox
```
i funciona sense contrasenya.
També has fet:
```text
proxmox → peer
```
i funciona, perquè el PeerTube té la clau pública del Proxmox.
Però amb `ProxyJump` fas:
```text
local → proxmox → peer
```
i el PeerTube espera la clau pública del local, no la del Proxmox.
Per això encara et demana password al segon salt.
## Solució correcta
Des del teu ordinador local, copia la teva clau pública local al PeerTube passant pel Proxmox:
```bash
xab@host-xab:~$ ssh-copy-id -i ~/.ssh/id_ed25519.pub -o ProxyJump=root@IP_DEL_PROXMOX xab@192.168.100.111
```
Després prova:
```bash
xab@host-xab:~$ ssh -J root@IP_DEL_PROXMOX xab@192.168.100.111
```
## Resum
No importa que el Proxmox ja pugui entrar al PeerTube.
Perquè funcioni `ssh -J`, el PeerTube també ha dacceptar la clau pública del teu ordinador local.
La clau pública del Proxmox i la clau pública del teu ordinador local només són la mateixa si tenen el mateix fingerprint.
# Desplegament de PeerTube amb Docker sobre VM Ubuntu
## 1. Objectiu del desplegament
Disposem duna VM Ubuntu Server 24.04 amb IP privada:
```text
192.168.100.111
```
Disposem també dun TrueNAS amb IP:
```text
192.168.100.101
```
Al TrueNAS tenim preparada la ruta:
```text
/mnt/AV/VM
```
Lobjectiu és desplegar PeerTube amb Docker dins la VM Ubuntu, però separant clarament les dades:
```text
VM Ubuntu PeerTube
├── Docker
├── Docker Compose
├── PeerTube
├── PostgreSQL
├── Redis
├── configuració
├── logs
└── volums interns petits
TrueNAS
└── DATA gran de PeerTube
├── vídeos originals
├── vídeos transcodificats
├── HLS / streaming playlists
├── thumbnails
├── previews
├── imports
├── captions
├── storyboards
└── altres fitxers audiovisuals grans
```
El proxy invers i HTTPS no es faran dins aquesta VM. Continuaran en un CT separat amb Apache.
## 2. Arquitectura final
```text
Internet
|
v
CT Apache Reverse Proxy
|
| HTTP intern cap a PeerTube
v
VM Ubuntu Server 24.04
192.168.100.111
|
| NFS
v
TrueNAS
192.168.100.101
```
## 3. Decisió sobre els volums
El directori oficial `./docker-volume/data` de PeerTube és el que conté la part grossa de dades de laplicació.
Per tant, en el nostre cas aquest directori no viurà realment al disc local de la VM, sinó que serà un enllaç cap al muntatge NFS del TrueNAS.
La separació serà:
```text
Local dins la VM:
/opt/peertube/docker-volume/db
/opt/peertube/docker-volume/redis
/opt/peertube/docker-volume/config
/opt/peertube/docker-volume/opendkim
/opt/peertube/docker-compose.yml
/opt/peertube/.env
Muntat des del TrueNAS:
/mnt/truenas-peertube/data
```
I després:
```text
/opt/peertube/docker-volume/data -> /mnt/truenas-peertube/data
```
## 4. Preparació del TrueNAS
Al TrueNAS ja existeix:
```bash
root@truenas:~# ls -lna /mnt/AV/VM
```
Sortida actual:
```text
total 9
drwxr-xr-x 2 0 0 2 Jun 5 21:32 .
drwxr-xr-x 8 0 0 8 Jun 5 21:32 ..
```
Creem una carpeta específica per a PeerTube:
```bash
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data
```
I una estructura inicial més llegible:
```bash
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/videos
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/original-video-files
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/streaming-playlists
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/thumbnails
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/previews
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/imports
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/captions
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/storyboards
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/tmp
```
De moment podem deixar propietari root i permisos oberts només per provar el muntatge.
```bash
root@truenas:~# chmod -R 775 /mnt/AV/VM/peertube
```
## 5. Export NFS des del TrueNAS
Des de la GUI de TrueNAS, exportem per NFS:
```text
Path: /mnt/AV/VM/peertube
Allowed hosts/networks: 192.168.100.111
Maproot User: root
Maproot Group: root
```
Per començar, ho fem simple i restringit a la VM PeerTube.
La VM Ubuntu muntarà aquesta exportació a:
```text
/mnt/truenas-peertube
```
## 6. Preparació de la VM Ubuntu
Entrem a la VM PeerTube:
```bash
xab@host-xab:~$ ssh peertube-vm
```
Passem a root:
```bash
xab@peertube-vm:~$ sudo -i
```
Actualitzem el sistema:
```bash
root@peertube-vm:~# apt update
root@peertube-vm:~# apt upgrade -y
```
Instal·lem eines bàsiques:
```bash
root@peertube-vm:~# apt install -y ca-certificates curl gnupg git nano vim htop nfs-common ufw
```
## 7. Instal·lació de Docker Engine i Docker Compose Plugin
Docker recomana instal·lar Docker Engine des del seu repositori `apt` oficial; Ubuntu 24.04 LTS `noble` està suportat oficialment per Docker Engine. :contentReference[oaicite:2]{index=2}
Creem el directori de claus:
```bash
root@peertube-vm:~# install -m 0755 -d /etc/apt/keyrings
```
Descarreguem la clau oficial de Docker:
```bash
root@peertube-vm:~# curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
```
Assignem permisos:
```bash
root@peertube-vm:~# chmod a+r /etc/apt/keyrings/docker.asc
```
Afegim el repositori oficial:
```bash
root@peertube-vm:~# tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
```
Actualitzem índexs:
```bash
root@peertube-vm:~# apt update
```
Instal·lem Docker, Buildx i Compose Plugin:
```bash
root@peertube-vm:~# apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
Comprovem Docker:
```bash
root@peertube-vm:~# docker --version
```
Comprovem Docker Compose V2:
```bash
root@peertube-vm:~# docker compose version
```
Activem Docker a larrencada:
```bash
root@peertube-vm:~# systemctl enable --now docker
```
Comprovem estat:
```bash
root@peertube-vm:~# systemctl status docker
```
## 8. Prova del muntatge NFS contra TrueNAS
Creem el punt de muntatge:
```bash
root@peertube-vm:~# mkdir -p /mnt/truenas-peertube
```
Provem el muntatge manual:
```bash
root@peertube-vm:~# mount -t nfs4 192.168.100.101:/mnt/AV/VM/peertube /mnt/truenas-peertube
```
Comprovem:
```bash
root@peertube-vm:~# df -h | grep truenas
```
També podem veure el contingut:
```bash
root@peertube-vm:~# ls -lna /mnt/truenas-peertube
```
Provem escriptura:
```bash
root@peertube-vm:~# touch /mnt/truenas-peertube/prova-escriptura-des-de-peer.txt
```
Comprovem:
```bash
root@peertube-vm:~# ls -lna /mnt/truenas-peertube
```
Si això funciona, el muntatge NFS és correcte.
## 9. Muntatge persistent amb /etc/fstab
Editem `/etc/fstab`:
```bash
root@peertube-vm:~# nano /etc/fstab
```
Afegim aquesta línia:
```fstab
192.168.100.101:/mnt/AV/VM/peertube /mnt/truenas-peertube nfs4 defaults,_netdev,nofail,x-systemd.automount 0 0
```
Desmuntem i provem el muntatge via fstab:
```bash
root@peertube-vm:~# umount /mnt/truenas-peertube
```
```bash
root@peertube-vm:~# systemctl daemon-reload
```
```bash
root@peertube-vm:~# mount -a
```
Comprovem:
```bash
root@peertube-vm:~# df -h | grep truenas
```
## 10. Creació del directori de desplegament de PeerTube
Creem el directori principal:
```bash
root@peertube-vm:~# mkdir -p /opt/peertube
```
Entrem:
```bash
root@peertube-vm:~# cd /opt/peertube
```
Descarreguem el `docker-compose.yml` oficial de producció:
```bash
root@peertube-vm:/opt/peertube# curl https://raw.githubusercontent.com/Chocobozzz/PeerTube/master/support/docker/production/docker-compose.yml > docker-compose.yml
```
Descarreguem el fitxer `.env` oficial de producció:
```bash
root@peertube-vm:/opt/peertube# curl https://raw.githubusercontent.com/Chocobozzz/PeerTube/master/support/docker/production/.env > .env
```
La documentació oficial indica explícitament aquests dos fitxers com a base del desplegament Docker de PeerTube. :contentReference[oaicite:3]{index=3}
## 11. Creació dels volums locals
Creem els directoris locals que sí que volem dins la VM:
```bash
root@peertube-vm:/opt/peertube# mkdir -p docker-volume/db
root@peertube-vm:/opt/peertube# mkdir -p docker-volume/redis
root@peertube-vm:/opt/peertube# mkdir -p docker-volume/config
root@peertube-vm:/opt/peertube# mkdir -p docker-volume/opendkim/keys
```
Creem també el directori pare de dades:
```bash
root@peertube-vm:/opt/peertube# mkdir -p docker-volume
```
Enllacem el directori de DATA gran cap al TrueNAS:
```bash
root@peertube-vm:/opt/peertube# ln -s /mnt/truenas-peertube/data docker-volume/data
```
Comprovem:
```bash
root@peertube-vm:/opt/peertube# ls -lna docker-volume
```
Hauríem de veure:
```text
data -> /mnt/truenas-peertube/data
db
redis
config
opendkim
```
## 12. Adaptació del docker-compose.yml
El `docker-compose.yml` oficial porta serveis de:
```text
webserver
certbot
webserver-reloader
peertube
postgres
redis
postfix
```
Nosaltres NO volem fer servir dins aquesta VM:
```text
webserver
certbot
webserver-reloader
```
perquè el proxy invers i HTTPS els farà el CT Apache extern.
Per tant, editem el fitxer:
```bash
root@peertube-vm:/opt/peertube# nano docker-compose.yml
```
Cal comentar o eliminar aquests serveis:
```yaml
webserver:
certbot:
webserver-reloader:
```
També cal modificar el servei `peertube` perquè publiqui el port intern `9000` cap a la VM:
```yaml
ports:
- "9000:9000"
- "1935:1935"
```
Si no volem funcionalitat live RTMP, podem deixar comentat el port `1935`.
Per a una primera prova, jo deixaria:
```yaml
ports:
- "9000:9000"
```
I si després volem directes:
```yaml
ports:
- "1935:1935"
- "9000:9000"
```
## 13. Volums que han de quedar al compose
El servei `peertube` ha de mantenir:
```yaml
volumes:
- ./docker-volume/data:/data
- ./docker-volume/config:/config
```
El servei `postgres` ha de mantenir:
```yaml
volumes:
- ./docker-volume/db:/var/lib/postgresql/data
```
El servei `redis` ha de mantenir:
```yaml
volumes:
- ./docker-volume/redis:/data
```
El servei `postfix` ha de mantenir:
```yaml
volumes:
- ./docker-volume/opendkim/keys:/etc/opendkim/keys
```
Això ens dona exactament la separació volguda:
```text
/data de PeerTube
→ TrueNAS
/config de PeerTube
→ local VM
PostgreSQL
→ local VM
Redis
→ local VM
OpenDKIM
→ local VM
```
## 14. Adaptació del fitxer .env
Editem el fitxer `.env`:
```bash
root@peertube-vm:/opt/peertube# nano .env
```
Cal substituir els valors de plantilla:
```text
<MY POSTGRES USERNAME>
<MY POSTGRES PASSWORD>
<MY DOMAIN>
<MY EMAIL ADDRESS>
<MY PEERTUBE SECRET>
```
La documentació oficial indica que aquests valors shan de substituir al `.env`. :contentReference[oaicite:4]{index=4}
Exemple conceptual:
```env
POSTGRES_USER=peertube
POSTGRES_PASSWORD=CONTRASENYA_LLARGA_GENERADA
POSTGRES_DB=peertube_prod
PEERTUBE_WEBSERVER_HOSTNAME=video.exemple.cat
PEERTUBE_WEBSERVER_PORT=443
PEERTUBE_WEBSERVER_HTTPS=true
PEERTUBE_ADMIN_EMAIL=admin@exemple.cat
PEERTUBE_SECRET=SECRET_LLARG_GENERAT
PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "192.168.100.0/24"]
```
## 15. Generar contrasenyes i secret
Generem una contrasenya per PostgreSQL:
```bash
root@peertube-vm:/opt/peertube# openssl rand -base64 32
```
Generem el secret de PeerTube:
```bash
root@peertube-vm:/opt/peertube# openssl rand -hex 32
```
Aquests valors senganxen dins el fitxer `.env`.
## 16. Important sobre el domini
El domini triat ha danar sense `https://`.
Correcte:
```text
video.exemple.cat
```
Incorrecte:
```text
https://video.exemple.cat
```
PeerTube ha de saber que cap a fora treballa amb HTTPS, encara que internament el proxy Apache li parli per HTTP.
Per això:
```env
PEERTUBE_WEBSERVER_PORT=443
PEERTUBE_WEBSERVER_HTTPS=true
```
I el backend intern serà:
```text
http://192.168.100.111:9000
```
## 17. Primera arrencada
Des de `/opt/peertube`:
```bash
root@peertube-vm:/opt/peertube# docker compose pull
```
Arrenquem:
```bash
root@peertube-vm:/opt/peertube# docker compose up -d
```
Mirem contenidors:
```bash
root@peertube-vm:/opt/peertube# docker compose ps
```
Mirem logs:
```bash
root@peertube-vm:/opt/peertube# docker compose logs -f peertube
```
## 18. Obtenir o reiniciar la contrasenya de root de PeerTube
La documentació oficial indica que podem obtenir la contrasenya inicial als logs o reiniciar-la amb una ordre dins del contenidor. :contentReference[oaicite:5]{index=5}
Per buscar-la als logs:
```bash
root@peertube-vm:/opt/peertube# docker compose logs peertube | grep -A1 root
```
O per reiniciar-la manualment:
```bash
root@peertube-vm:/opt/peertube# docker compose exec -u peertube peertube npm run reset-password -- -u root
```
## 19. Prova local des de la VM
Comprovem que PeerTube escolta al port 9000:
```bash
root@peertube-vm:/opt/peertube# ss -lntp | grep 9000
```
Provem amb curl:
```bash
root@peertube-vm:/opt/peertube# curl -I http://127.0.0.1:9000
```
També des del Proxmox o des del CT Apache:
```bash
root@base:~# curl -I http://192.168.100.111:9000
```
## 20. Proxy invers Apache extern
Al CT Apache, el backend haurà dapuntar a:
```text
http://192.168.100.111:9000
```
El virtualhost públic farà:
```text
https://DOMINI_TRIAT
→ proxy cap a http://192.168.100.111:9000
```
Aquesta part la farem després des del CT Apache.
## 21. Resum de decisions
```text
VM Ubuntu PeerTube
IP: 192.168.100.111
Funció: host Docker PeerTube
TrueNAS
IP: 192.168.100.101
Ruta: /mnt/AV/VM/peertube
Funció: DATA gran de PeerTube
Proxy Apache
Funció: HTTPS públic i reverse proxy
Backend: http://192.168.100.111:9000
```
## 22. Separació final de dades
```text
Local VM:
/opt/peertube/docker-volume/db
→ PostgreSQL
/opt/peertube/docker-volume/redis
→ Redis
/opt/peertube/docker-volume/config
→ configuració PeerTube
/opt/peertube/.env
→ variables del desplegament
/opt/peertube/docker-compose.yml
→ definició del servei
TrueNAS:
/mnt/AV/VM/peertube/data
→ vídeos originals
→ transcodificats
→ HLS
→ thumbnails
→ previews
→ imports
→ captions
→ storyboards
```
## 23. Estat esperat
Quan tot funcioni, aquests comandos haurien de donar resultat correcte:
```bash
root@peertube-vm:/opt/peertube# docker compose ps
```
```bash
root@peertube-vm:/opt/peertube# curl -I http://127.0.0.1:9000
```
```bash
root@base:~# curl -I http://192.168.100.111:9000
```
```bash
root@peertube-vm:/opt/peertube# df -h | grep truenas
```
```bash
root@peertube-vm:/opt/peertube# ls -lna docker-volume/data
```
# Desplegament de PeerTube: fase 1
## Ordre de treball
Abans de tocar el `docker-compose.yml` de PeerTube, deixem preparada la base del sistema.
Lordre correcte serà:
```text
1. Preparar lexport NFS al TrueNAS
2. Muntar NFS a la VM Ubuntu
3. Fer prova descriptura contra el TrueNAS
4. Instal·lar Docker Engine
5. Instal·lar Docker Compose Plugin
6. Descarregar els fitxers oficials de PeerTube
7. Adaptar el desplegament al nostre escenari
```
## Objectiu de la fase 1
Deixar validat que la VM Ubuntu pot:
- accedir al TrueNAS;
- muntar el directori remot;
- escriure dades al directori remot;
- executar Docker correctament;
- executar `docker compose`.
## Separació de dades
La decisió principal del desplegament és aquesta:
```text
VM Ubuntu PeerTube
→ sistema
→ Docker
→ PostgreSQL
→ Redis
→ configuració
→ logs
→ fitxers del compose
TrueNAS
→ vídeos originals
→ vídeos transcodificats
→ HLS
→ thumbnails
→ previews
→ imports
→ captions
→ storyboards
```
## Següent pas immediat
Començarem preparant la carpeta de PeerTube dins del TrueNAS:
```bash
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data
```
I després prepararem les subcarpetes de dades grans:
```bash
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/videos
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/original-video-files
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/streaming-playlists
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/thumbnails
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/previews
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/imports
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/captions
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/storyboards
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/tmp
```
## Comprovació
Després comprovem lestructura:
```bash
root@truenas:~# find /mnt/AV/VM/peertube -maxdepth 3 -type d | sort
```
Resultat esperat:
```text
/mnt/AV/VM/peertube
/mnt/AV/VM/peertube/data
/mnt/AV/VM/peertube/data/captions
/mnt/AV/VM/peertube/data/imports
/mnt/AV/VM/peertube/data/original-video-files
/mnt/AV/VM/peertube/data/previews
/mnt/AV/VM/peertube/data/storyboards
/mnt/AV/VM/peertube/data/streaming-playlists
/mnt/AV/VM/peertube/data/thumbnails
/mnt/AV/VM/peertube/data/tmp
/mnt/AV/VM/peertube/data/videos
```
## Permisos provisionals
Per començar i validar el muntatge NFS, deixem permisos descriptura de grup:
```bash
root@truenas:~# chmod -R 775 /mnt/AV/VM/peertube
```
## Nota
Aquesta configuració de permisos és inicial.
Quan sapiguem exactament amb quin UID/GID escriu el contenidor de PeerTube, ajustarem els propietaris de manera més fina.
El punt important ara és validar:
```text
VM Ubuntu → NFS → TrueNAS
```
# Desplegament de PeerTube: fase 1
## 1. Preparació de la carpeta de dades al TrueNAS
El TrueNAS farà de magatzem per a la DATA gran de PeerTube.
En aquesta fase preparem el directori on viuran les dades audiovisuals:
```text
/mnt/AV/VM/peertube/data
```
Aquest directori contindrà vídeos originals, vídeos transcodificats, HLS, miniatures, previews i imports.
## 2. Crear lestructura de directoris al TrueNAS
Entrem al TrueNAS com a root i creem lestructura base:
```bash
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data
```
Creem les carpetes principals de dades:
```bash
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/videos
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/original-video-files
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/streaming-playlists
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/thumbnails
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/previews
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/imports
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/captions
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/storyboards
root@truenas:~# mkdir -p /mnt/AV/VM/peertube/data/tmp
```
## 3. Comprovar lestructura creada
Comprovem que les carpetes existeixen:
```bash
root@truenas:~# find /mnt/AV/VM/peertube -maxdepth 3 -type d | sort
```
Resultat esperat:
```text
/mnt/AV/VM/peertube
/mnt/AV/VM/peertube/data
/mnt/AV/VM/peertube/data/captions
/mnt/AV/VM/peertube/data/imports
/mnt/AV/VM/peertube/data/original-video-files
/mnt/AV/VM/peertube/data/previews
/mnt/AV/VM/peertube/data/storyboards
/mnt/AV/VM/peertube/data/streaming-playlists
/mnt/AV/VM/peertube/data/thumbnails
/mnt/AV/VM/peertube/data/tmp
/mnt/AV/VM/peertube/data/videos
```
## 4. Permisos provisionals al TrueNAS
Per a la primera prova de muntatge NFS, deixem permisos amplis però no completament oberts:
```bash
root@truenas:~# chmod -R 775 /mnt/AV/VM/peertube
```
Comprovem permisos i propietaris numèrics:
```bash
root@truenas:~# ls -lna /mnt/AV/VM
```
```bash
root@truenas:~# ls -lna /mnt/AV/VM/peertube
```
```bash
root@truenas:~# ls -lna /mnt/AV/VM/peertube/data
```
## 5. Decisió sobre permisos
De moment mantenim propietari `root:root`.
Aquesta és una decisió provisional.
Quan tinguem PeerTube arrencat i sapiguem exactament amb quin UID/GID escriu dins del contenidor, ajustarem els permisos de manera més fina.
Lobjectiu ara és comprovar que la VM Ubuntu pot muntar i escriure al directori exportat.
## 6. Export NFS des de la GUI de TrueNAS
Ara cal crear lexportació NFS des de la interfície web de TrueNAS.
Ruta aproximada:
```text
Shares → Unix Shares (NFS) → Add
```
Configurem:
```text
Path: /mnt/AV/VM/peertube
Description: PeerTube data for Ubuntu VM
Enabled: yes
```
Restricció recomanada:
```text
Allowed hosts: 192.168.100.111
```
Això limita laccés NFS només a la VM PeerTube.
## 7. Opcions de mapatge NFS
Per començar, podem fer servir una configuració simple:
```text
Maproot User: root
Maproot Group: root
```
Això facilita la primera prova descriptura des de la VM.
Més endavant, si volem afinar seguretat, podem passar a un UID/GID específic per al servei PeerTube.
## 8. Activar el servei NFS al TrueNAS
Si el servei NFS no està actiu, lactivem:
```text
System Settings → Services → NFS → Start Automatically
System Settings → Services → NFS → Start
```
Lestat esperat és:
```text
NFS: RUNNING
```
## 9. Preparació de la VM Ubuntu
Entrem a la VM PeerTube:
```bash
xab@host-xab:~$ ssh peertube-vm
```
Passem a root:
```bash
xab@peertube-vm:~$ sudo -i
```
Actualitzem índexs de paquets:
```bash
root@peertube-vm:~# apt update
```
Instal·lem el client NFS:
```bash
root@peertube-vm:~# apt install -y nfs-common
```
## 10. Crear el punt de muntatge a la VM
Creem el directori local on muntarem el recurs del TrueNAS:
```bash
root@peertube-vm:~# mkdir -p /mnt/truenas-peertube
```
## 11. Prova de muntatge manual
Provem el muntatge NFS manualment:
```bash
root@peertube-vm:~# mount -t nfs4 192.168.100.101:/mnt/AV/VM/peertube /mnt/truenas-peertube
```
## 12. Comprovar que sha muntat
Comprovem amb `df`:
```bash
root@peertube-vm:~# df -h | grep truenas
```
També podem veure el contingut:
```bash
root@peertube-vm:~# ls -lna /mnt/truenas-peertube
```
I el directori de dades:
```bash
root@peertube-vm:~# ls -lna /mnt/truenas-peertube/data
```
## 13. Prova descriptura des de la VM
Creem un fitxer de prova des de la VM Ubuntu:
```bash
root@peertube-vm:~# touch /mnt/truenas-peertube/prova-escriptura-des-de-peertube-vm.txt
```
Comprovem que existeix:
```bash
root@peertube-vm:~# ls -lna /mnt/truenas-peertube
```
També podem fer una prova dins la carpeta `data`:
```bash
root@peertube-vm:~# touch /mnt/truenas-peertube/data/prova-data-des-de-peertube-vm.txt
```
Comprovem:
```bash
root@peertube-vm:~# ls -lna /mnt/truenas-peertube/data
```
## 14. Comprovació des del TrueNAS
Al TrueNAS haurien daparèixer els fitxers creats des de la VM:
```bash
root@truenas:~# ls -lna /mnt/AV/VM/peertube
```
```bash
root@truenas:~# ls -lna /mnt/AV/VM/peertube/data
```
Resultat esperat:
```text
prova-escriptura-des-de-peertube-vm.txt
prova-data-des-de-peertube-vm.txt
```
## 15. Si el muntatge dona error
Si apareix un error com:
```text
mount.nfs: access denied by server while mounting
```
cal revisar a TrueNAS:
```text
Allowed hosts
Path exportat
Servei NFS actiu
Permisos del dataset
Maproot User / Group
```
Si apareix un error de xarxa, comprovem connectivitat:
```bash
root@peertube-vm:~# ping -c 4 192.168.100.101
```
I comprovem si el port NFS respon:
```bash
root@peertube-vm:~# nc -vz 192.168.100.101 2049
```
Si no tenim `nc`, linstal·lem:
```bash
root@peertube-vm:~# apt install -y netcat-openbsd
```
## 16. Muntatge persistent amb /etc/fstab
Si la prova manual funciona, fem el muntatge persistent.
Editem `/etc/fstab`:
```bash
root@peertube-vm:~# nano /etc/fstab
```
Afegim aquesta línia al final:
```fstab
192.168.100.101:/mnt/AV/VM/peertube /mnt/truenas-peertube nfs4 defaults,_netdev,nofail,x-systemd.automount 0 0
```
## 17. Provar el muntatge persistent
Primer desmuntem:
```bash
root@peertube-vm:~# umount /mnt/truenas-peertube
```
Recarreguem systemd:
```bash
root@peertube-vm:~# systemctl daemon-reload
```
Provem `fstab`:
```bash
root@peertube-vm:~# mount -a
```
Comprovem:
```bash
root@peertube-vm:~# df -h | grep truenas
```
I forcem accés al directori:
```bash
root@peertube-vm:~# ls -lna /mnt/truenas-peertube
```
## 18. Reinici de prova
Quan el muntatge persistent funcioni, podem reiniciar la VM:
```bash
root@peertube-vm:~# reboot
```
Després tornem a entrar:
```bash
xab@host-xab:~$ ssh peertube-vm
```
Passem a root:
```bash
xab@peertube-vm:~$ sudo -i
```
Comprovem que el muntatge continua funcionant, si no li fem un ls o qualsevol acció d'accés el df no el veu, és uncomportament normal.
```bash
root@peertube-vm:~# ls -lna /mnt/truenas-peertube
root@peertube-vm:~# df -h | grep truenas
```
```bash
```
## 19. Decisió documentada
El directori del TrueNAS:
```text
/mnt/AV/VM/peertube
```
queda muntat dins la VM Ubuntu com:
```text
/mnt/truenas-peertube
```
Aquest muntatge serà la base per externalitzar la DATA gran de PeerTube.
## 20. Estat esperat al final daquesta fase
```text
TrueNAS:
/mnt/AV/VM/peertube
/mnt/AV/VM/peertube/data
VM Ubuntu:
/mnt/truenas-peertube
/mnt/truenas-peertube/data
NFS:
muntatge funcional
escriptura validada
entrada persistent a /etc/fstab
PAUSA: ERROR EN ELS PERMISOS; REVISIÓ A TRUENAS DEL NFS
# Diagnosi NFS: muntatge correcte però sense permís descriptura
## Situació
La VM PeerTube pot muntar correctament el recurs NFS del TrueNAS:
```bash
root@peer-tube:~# mount -t nfs4 192.168.100.101:/mnt/AV/VM/peertube /mnt/truenas-peertube
```
La comprovació mostra que el muntatge és correcte:
```bash
root@peer-tube:~# df -h | grep truenas
```
Resultat:
```text
192.168.100.101:/mnt/AV/VM/peertube 27G 0 27G 0% /mnt/truenas-peertube
```
També hi ha connectivitat IP correcta amb el TrueNAS:
```bash
root@peer-tube:~# ping -c 4 192.168.100.101
```
Resultat:
```text
64 bytes from 192.168.100.101
```
## Problema
Tot i que el recurs NFS està muntat, no es pot escriure:
```bash
root@peer-tube:~# touch /mnt/truenas-peertube/prova-escriptura-des-de-peertube-vm.txt
```
Error:
```text
touch: cannot touch '/mnt/truenas-peertube/prova-escriptura-des-de-peertube-vm.txt': Permission denied
```
També falla dins de `data`:
```bash
root@peer-tube:~# touch /mnt/truenas-peertube/data/prova-data-des-de-peertube-vm.txt
```
Error:
```text
touch: cannot touch '/mnt/truenas-peertube/data/prova-data-des-de-peertube-vm.txt': Permission denied
```
## Diagnosi
El muntatge NFS funciona.
El problema no és de xarxa ni de ruta exportada.
El problema és de permisos NFS.
La pista important és aquesta:
```bash
root@peer-tube:~# ls -lna /mnt/truenas-peertube
```
Resultat:
```text
drwxrwxr-x 3 0 0 3 de juny 6 05:02 .
drwxrwxr-x 11 0 0 11 de juny 6 05:07 data
```
Els directoris són propietat de:
```text
UID: 0
GID: 0
```
És a dir:
```text
root:root
```
Però el `root` de la VM no pot escriure.
Això indica que el TrueNAS està aplicant una política de NFS tipus:
```text
root squash
```
És a dir: el `root` del client NFS no és acceptat com a `root` real al servidor TrueNAS.
## Explicació
En NFS, el servidor pot decidir què fa amb les connexions que venen com a `root`.
Per seguretat, sovint el `root` del client es mapeja a un usuari anònim, com ara:
```text
nobody
nogroup
```
Això evita que qualsevol màquina client amb accés NFS pugui escriure com a root al NAS.
Per això passa això:
```text
La VM munta bé el recurs.
La VM veu els fitxers.
Però root no pot escriure.
```
## Missatges de nfs-common
Els missatges que han sortit en instal·lar `nfs-common` són normals.
Per exemple:
```text
Adding system user `statd'
nfs-idmapd.service is a disabled or a static unit
rpc-statd.service is a disabled or a static unit
```
Això no és lerror.
El paquet sha instal·lat correctament.
El problema real és el mapatge de permisos al servidor NFS del TrueNAS.
## Solució ràpida per validar el laboratori
A la GUI del TrueNAS, revisem lexport NFS:
```text
Shares → Unix Shares (NFS) → export /mnt/AV/VM/peertube
```
Cal deixar una configuració semblant a:
```text
Path: /mnt/AV/VM/peertube
Allowed hosts: 192.168.100.111
Maproot User: root
Maproot Group: root
```
Això permet que el `root` de la VM sigui tractat com a `root` sobre aquest export NFS.
## Opció recomanada ara mateix
Per avançar en el desplegament i validar el muntatge:
```text
Maproot User: root
Maproot Group: root
```
Després guardem els canvis i reiniciem o recarreguem el servei NFS si cal.
A TrueNAS:
```text
System Settings → Services → NFS → Restart
```
## Prova després de canviar Maproot
A la VM PeerTube, desmuntem i tornem a muntar:
```bash
root@peer-tube:~# umount /mnt/truenas-peertube
```
```bash
root@peer-tube:~# mount -t nfs4 192.168.100.101:/mnt/AV/VM/peertube /mnt/truenas-peertube
```
Provem escriptura:
```bash
root@peer-tube:~# touch /mnt/truenas-peertube/prova-escriptura-des-de-peertube-vm.txt
```
```bash
root@peer-tube:~# touch /mnt/truenas-peertube/data/prova-data-des-de-peertube-vm.txt
```
Comprovem:
```bash
root@peer-tube:~# ls -lna /mnt/truenas-peertube
```
```bash
root@peer-tube:~# ls -lna /mnt/truenas-peertube/data
```
## Si encara falla
Si encara falla, fem una prova més oberta només per diagnosticar.
Al TrueNAS:
```bash
root@truenas:~# chmod -R 777 /mnt/AV/VM/peertube
```
Després, a la VM:
```bash
root@peer-tube:~# touch /mnt/truenas-peertube/prova-777.txt
```
Si amb `777` funciona, queda confirmat que el problema era permisos Unix.
Si amb `777` tampoc funciona, el problema és de configuració NFS, no només de permisos de fitxer.
Després de la prova, no deixarem necessàriament `777`; només és diagnòstic.
## Alternativa més fina
Més endavant, quan PeerTube estigui funcionant, podem veure quin UID/GID fa servir el contenidor per escriure dins de `/data`.
Per exemple:
```bash
root@peer-tube:/opt/peertube# docker compose exec peertube id
```
I després fer que el dataset del TrueNAS sigui propietat daquell UID/GID.
Però ara encara no tenim el contenidor en marxa.
Per això, per arrencar el desplegament, la via ràpida és:
```text
Maproot User: root
Maproot Group: root
```
## Decisió provisional
Per aquesta fase del laboratori fem:
```text
NFS restringit només a la VM 192.168.100.111
Maproot root:root
Permisos 775 o 777 temporal si cal diagnosticar
```
Això ens permet validar:
```text
VM Ubuntu → NFS → TrueNAS
```
## Estat actual
```text
Muntatge NFS: correcte
Connectivitat: correcta
Lectura: correcta
Escriptura: falla
Causa probable: root squash / mapatge NFS del TrueNAS
Acció: revisar Maproot User i Maproot Group a lexport NFS
```
NOTA: DF NO POT ACCCEDIR SENSE LS PREVI;;;;
# Nota sobre NFS amb `x-systemd.automount`
## Comportament observat
Hem configurat el muntatge NFS del TrueNAS dins de la VM Ubuntu mitjançant `/etc/fstab`.
La línia utilitzada inclou lopció:
```fstab
x-systemd.automount
```
Això fa que systemd prepari un punt dautomuntatge, però no necessàriament munta el recurs NFS immediatament durant larrencada.
## Conseqüència pràctica
Després de reiniciar la VM, aquesta comprovació pot no mostrar res:
```bash
root@peer-tube:~# df -h | grep truenas
```
Això no vol dir necessàriament que el muntatge estigui malament.
Vol dir que el recurs encara no sha activat perquè ningú ha accedit al punt de muntatge.
## Com forçar lautomuntatge
Primer cal accedir al directori muntat:
```bash
root@peer-tube:~# ls -lna /mnt/truenas-peertube
```
Aquest `ls` força systemd a activar el muntatge NFS.
Després ja podem comprovar-lo amb:
```bash
root@peer-tube:~# df -h | grep truenas
```
Ara sí que hauria daparèixer el recurs muntat:
```text
192.168.100.101:/mnt/AV/VM/peertube ... /mnt/truenas-peertube
```
## Comprovació completa recomanada després dun reinici
Després de reiniciar la VM, fem:
```bash
root@peer-tube:~# ls -lna /mnt/truenas-peertube
```
```bash
root@peer-tube:~# df -h | grep truenas
```
```bash
root@peer-tube:~# touch /mnt/truenas-peertube/prova-post-reboot.txt
```
```bash
root@peer-tube:~# ls -lna /mnt/truenas-peertube
```
## Decisió documentada
Mantenim lopció:
```fstab
x-systemd.automount
```
perquè és adequada per a un muntatge NFS cap al TrueNAS.
Aquesta opció evita que la VM quedi bloquejada durant larrencada si el TrueNAS encara no està disponible.
Només cal recordar que, després dun reinici, el muntatge pot no aparèixer a `df -h` fins que accedim primer al directori amb una ordre com:
```bash
root@peer-tube:~# ls -lna /mnt/truenas-peertube
```
```
## 21. Següent fase
Quan el muntatge NFS estigui validat, passarem a:
```text
Instal·lació de Docker Engine
Instal·lació de Docker Compose Plugin
Descàrrega dels fitxers oficials de PeerTube
Preparació de /opt/peertube
Separació de volums locals i volums sobre TrueNAS
```
# Desplegament de PeerTube: fase 2
## 1. Objectiu de la fase
Ara que ja tenim validat el muntatge NFS contra el TrueNAS, preparem la VM Ubuntu perquè pugui executar PeerTube amb Docker.
En aquesta fase farem:
```text
1. Instal·lar dependències bàsiques
2. Afegir el repositori oficial de Docker
3. Instal·lar Docker Engine
4. Instal·lar Docker Compose Plugin
5. Activar Docker a larrencada
6. Fer una prova de funcionament
```
## 2. Entrar a la VM PeerTube
Des de lordinador local:
```bash
xab@host-xab:~$ ssh peertube-vm
```
Passem a root:
```bash
xab@peer-tube:~$ sudo -i
```
El prompt esperat és:
```bash
root@peer-tube:~#
```
## 3. Actualitzar el sistema
Actualitzem els índexs de paquets:
```bash
root@peer-tube:~# apt update
```
Actualitzem el sistema:
```bash
root@peer-tube:~# apt upgrade -y
```
## 4. Instal·lar dependències bàsiques
Instal·lem paquets necessaris per afegir repositoris HTTPS i treballar amb claus GPG:
```bash
root@peer-tube:~# apt install -y ca-certificates curl gnupg git nano vim htop nfs-common ufw
```
## 5. Preparar el directori de claus APT
Creem el directori per a claus de repositoris externs:
```bash
root@peer-tube:~# install -m 0755 -d /etc/apt/keyrings
```
## 6. Afegir la clau oficial de Docker
Descarreguem la clau GPG oficial de Docker:
```bash
root@peer-tube:~# curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
```
Assignem permisos de lectura:
```bash
root@peer-tube:~# chmod a+r /etc/apt/keyrings/docker.asc
```
## 7. Afegir el repositori oficial de Docker
Creem el fitxer del repositori Docker:
```bash
root@peer-tube:~# tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
```
## 8. Actualitzar índexs de paquets
Ara actualitzem de nou perquè Ubuntu vegi els paquets del repositori Docker:
```bash
root@peer-tube:~# apt update
```
## 9. Instal·lar Docker Engine i Docker Compose Plugin
Instal·lem Docker Engine, el client, containerd, Buildx i el plugin de Compose:
```bash
root@peer-tube:~# apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
## 10. Activar Docker a larrencada
Activem i arranquem Docker:
```bash
root@peer-tube:~# systemctl enable --now docker
```
Comprovem lestat:
```bash
root@peer-tube:~# systemctl status docker
```
Lestat esperat és:
```text
active (running)
```
## 11. Comprovar la versió de Docker
```bash
root@peer-tube:~# docker --version
```
Resultat esperat semblant a:
```text
Docker version XX.X.X, build XXXXXXX
```
## 12. Comprovar Docker Compose V2
```bash
root@peer-tube:~# docker compose version
```
Resultat esperat semblant a:
```text
Docker Compose version v2.xx.x
```
## 13. Prova bàsica de Docker
Executem el contenidor de prova:
```bash
root@peer-tube:~# docker run hello-world
```
Si tot és correcte, veurem un missatge semblant a:
```text
Hello from Docker!
```
Això confirma que Docker pot descarregar imatges i executar contenidors.
## 14. Comprovació de xarxa Docker
Podem veure les xarxes creades per defecte:
```bash
root@peer-tube:~# docker network ls
```
Sortida esperada aproximada:
```text
NETWORK ID NAME DRIVER SCOPE
... bridge bridge local
... host host local
... none null local
```
## 15. Comprovació de contenidors
Després del `hello-world`, podem veure els contenidors existents:
```bash
root@peer-tube:~# docker ps -a
```
El contenidor `hello-world` haurà quedat aturat.
Opcionalment, el podem eliminar:
```bash
root@peer-tube:~# docker rm $(docker ps -aq --filter ancestor=hello-world)
```
I també podem eliminar la imatge si volem deixar net:
```bash
root@peer-tube:~# docker rmi hello-world
```
## 16. Decisió documentada
Instal·lem Docker des del repositori oficial de Docker, no només des dels paquets base dUbuntu.
Això ens dona una versió actualitzada de:
```text
Docker Engine
Docker CLI
containerd
Docker Buildx
Docker Compose Plugin
```
## 17. Estat esperat al final daquesta fase
Al final daquesta fase haurien de funcionar aquests comandos:
```bash
root@peer-tube:~# docker --version
```
```bash
root@peer-tube:~# docker compose version
```
```bash
root@peer-tube:~# systemctl status docker
```
```bash
root@peer-tube:~# docker run hello-world
```
## 18. Relació amb el projecte PeerTube
PeerTube es desplegarà amb Docker Compose.
La VM Ubuntu serà el host Docker, però les dades grans de PeerTube aniran al muntatge NFS del TrueNAS.
La separació continua sent:
```text
VM Ubuntu:
Docker
PeerTube
PostgreSQL
Redis
configuració
logs
volums interns petits
TrueNAS:
vídeos originals
transcodificats
HLS
thumbnails
previews
imports
captions
storyboards
```
## 19. Següent fase
Quan Docker funcioni correctament, passarem a preparar el directori de desplegament:
```text
/opt/peertube
```
I descarregarem els fitxers oficials:
```text
docker-compose.yml
.env
```
Després els adaptarem al nostre escenari:
```text
sense webserver intern
sense certbot intern
sense webserver-reloader
amb /data apuntant al TrueNAS
amb PostgreSQL i Redis locals dins la VM
amb backend HTTP intern al port 9000
```
# Desplegament de PeerTube: fase 3
## 1. Objectiu de la fase
Un cop Docker ja està instal·lat i validat, preparem el directori de desplegament de PeerTube.
En aquesta fase farem:
```text
1. Crear /opt/peertube
2. Descarregar docker-compose.yml oficial
3. Descarregar .env oficial
4. Crear els directoris locals de Docker
5. Enllaçar la DATA gran cap al muntatge NFS del TrueNAS
6. Comprovar lestructura abans darrencar res
```
## 2. Entrar a la VM PeerTube
Des de lordinador local:
```bash
xab@host-xab:~$ ssh peertube-vm
```
Passem a root:
```bash
xab@peer-tube:~$ sudo -i
```
El prompt esperat és:
```bash
root@peer-tube:~#
```
## 3. Comprovar que el muntatge NFS funciona
Com que fem servir `x-systemd.automount`, primer accedim al directori per activar el muntatge:
```bash
root@peer-tube:~# ls -lna /mnt/truenas-peertube
```
Ara comprovem que apareix muntat:
```bash
root@peer-tube:~# df -h | grep truenas
```
Resultat esperat:
```text
192.168.100.101:/mnt/AV/VM/peertube ... /mnt/truenas-peertube
```
Comprovem la carpeta de dades:
```bash
root@peer-tube:~# ls -lna /mnt/truenas-peertube/data
```
## 4. Crear el directori principal de PeerTube
Creem el directori de desplegament:
```bash
root@peer-tube:~# mkdir -p /opt/peertube
```
Entrem dins:
```bash
root@peer-tube:~# cd /opt/peertube
```
El prompt passarà a ser:
```bash
root@peer-tube:/opt/peertube#
```
## 5. Descarregar els fitxers oficials de producció
Descarreguem el `docker-compose.yml` oficial:
```bash
root@peer-tube:/opt/peertube# curl https://raw.githubusercontent.com/Chocobozzz/PeerTube/master/support/docker/production/docker-compose.yml > docker-compose.yml
```
Descarreguem el fitxer `.env` oficial:
```bash
root@peer-tube:/opt/peertube# curl https://raw.githubusercontent.com/Chocobozzz/PeerTube/master/support/docker/production/.env > .env
```
Comprovem:
```bash
root@peer-tube:/opt/peertube# ls -lna
```
Resultat esperat:
```text
root@peer-tube:/opt/peertube# ls -lna
total 20
drwxr-xr-x 2 0 0 4096 de juny 6 06:17 .
drwxr-xr-x 4 0 0 4096 de juny 6 06:14 ..
-rw-r--r-- 1 0 0 3613 de juny 6 06:14 docker-compose.yml
-rw-r--r-- 1 0 0 6199 de juny 6 06:17 .env
```
## 6. Crear els directoris locals de Docker
Creem lestructura base de volums:
```bash
root@peer-tube:/opt/peertube# mkdir -p docker-volume
```
Creem els volums que volem mantenir locals dins de la VM:
```bash
root@peer-tube:/opt/peertube# mkdir -p docker-volume/db
root@peer-tube:/opt/peertube# mkdir -p docker-volume/redis
root@peer-tube:/opt/peertube# mkdir -p docker-volume/config
root@peer-tube:/opt/peertube# mkdir -p docker-volume/opendkim/keys
```
## 7. Enllaçar la DATA gran cap al TrueNAS
No volem que el directori `docker-volume/data` sigui local.
Volem que apunti al muntatge NFS:
```text
/mnt/truenas-peertube/data
```
Creem lenllaç simbòlic:
```bash
root@peer-tube:/opt/peertube# ln -s /mnt/truenas-peertube/data docker-volume/data
```
## 8. Comprovar lestructura resultant
Comprovem el directori `docker-volume`:
```bash
root@peer-tube:/opt/peertube# ls -lna docker-volume
```
Resultat esperat:
```text
drwxr-xr-x db
drwxr-xr-x redis
drwxr-xr-x config
drwxr-xr-x opendkim
lrwxrwxrwx data -> /mnt/truenas-peertube/data
```
Comprovem que lenllaç funciona:
```bash
root@peer-tube:/opt/peertube# ls -lna docker-volume/data
```
Això hauria de mostrar el contingut de:
```text
/mnt/truenas-peertube/data
```
## 9. Prova descriptura des del camí final
Ara provem escriptura exactament pel camí que veurà Docker Compose:
```bash
root@peer-tube:/opt/peertube# touch docker-volume/data/prova-des-de-ruta-final-docker-volume.txt
```
Comprovem:
```bash
root@peer-tube:/opt/peertube# ls -lna docker-volume/data
```
També podem comprovar-ho des del camí NFS real:
```bash
root@peer-tube:/opt/peertube# ls -lna /mnt/truenas-peertube/data
```
## 10. Separació real de dades
Amb aquesta estructura, quan PeerTube escrigui a:
```text
/data
```
dins del contenidor, realment escriurà a:
```text
/opt/peertube/docker-volume/data
```
I aquest camí és un enllaç cap a:
```text
/mnt/truenas-peertube/data
```
Per tant, físicament les dades grans acabaran al TrueNAS.
## 11. Què queda local a la VM
A la VM queden locals:
```text
/opt/peertube/docker-volume/db
/opt/peertube/docker-volume/redis
/opt/peertube/docker-volume/config
/opt/peertube/docker-volume/opendkim
/opt/peertube/docker-compose.yml
/opt/peertube/.env
```
Això inclou:
```text
PostgreSQL
Redis
configuració PeerTube
OpenDKIM
fitxers del desplegament
```
## 12. Què queda al TrueNAS
Al TrueNAS queda:
```text
/mnt/AV/VM/peertube/data
```
Que la VM veu com:
```text
/mnt/truenas-peertube/data
```
I Docker Compose veu com:
```text
/opt/peertube/docker-volume/data
```
Aquest directori contindrà:
```text
vídeos originals
vídeos transcodificats
HLS / streaming playlists
thumbnails
previews
imports
captions
storyboards
tmp
```
## 13. Esquema final de camins
```text
Contenidor PeerTube:
/data
VM Ubuntu:
/opt/peertube/docker-volume/data
Enllaç simbòlic:
/opt/peertube/docker-volume/data
-> /mnt/truenas-peertube/data
TrueNAS:
/mnt/AV/VM/peertube/data
```
## 14. Comprovació general
Abans deditar el `docker-compose.yml`, comprovem:
```bash
root@peer-tube:/opt/peertube# pwd
```
Resultat esperat:
```text
/opt/peertube
```
Comprovem fitxers principals:
```bash
root@peer-tube:/opt/peertube# ls -lna
```
Comprovem volums:
```bash
root@peer-tube:/opt/peertube# ls -lna docker-volume
```
Comprovem muntatge:
```bash
root@peer-tube:/opt/peertube# df -h | grep truenas
```
Comprovem escriptura final:
```bash
root@peer-tube:/opt/peertube# touch docker-volume/data/prova-final.txt
```
```bash
root@peer-tube:/opt/peertube# ls -lna docker-volume/data | grep prova-final
```
## 15. Decisió documentada
Fem servir `/opt/peertube` com a directori principal del desplegament.
El volum `docker-volume/data` no és local: és un enllaç simbòlic cap al muntatge NFS del TrueNAS.
Això permet mantenir locals les dades crítiques de gestió i base de dades, però externalitzar la DATA gran audiovisual.
## 16. Estat esperat al final daquesta fase
```text
/opt/peertube/docker-compose.yml
/opt/peertube/.env
/opt/peertube/docker-volume/db
/opt/peertube/docker-volume/redis
/opt/peertube/docker-volume/config
/opt/peertube/docker-volume/opendkim
/opt/peertube/docker-volume/data -> /mnt/truenas-peertube/data
```
## 17. Següent fase
La següent fase serà editar:
```text
docker-compose.yml
.env
```
Per adaptar-los al nostre escenari:
```text
sense webserver intern
sense certbot intern
sense webserver-reloader
amb PeerTube publicant el port 9000
amb domini públic definit
amb HTTPS declarat perquè el proxy extern farà TLS
amb PostgreSQL i Redis locals
amb /data apuntant al TrueNAS
```
# Desplegament de PeerTube: fase 4
## 1. Objectiu de la fase
En aquesta fase adaptem els fitxers oficials de PeerTube al nostre escenari.
Tenim:
```text
VM Ubuntu PeerTube
IP: 192.168.100.111
TrueNAS
IP: 192.168.100.101
Directori de desplegament
/opt/peertube
DATA gran
/opt/peertube/docker-volume/data
-> /mnt/truenas-peertube/data
Proxy invers extern
CT Apache
```
No volem que PeerTube aixequi el seu propi Nginx ni Certbot, perquè això ho farà el CT Apache extern.
Per tant, eliminem o comentem aquests serveis del `docker-compose.yml`:
```text
webserver
certbot
webserver-reloader
```
I fem que el servei `peertube` publiqui el port intern:
```text
9000/tcp
```
## 2. Fer còpies de seguretat dels fitxers originals
Entrem al directori del desplegament:
```bash
root@peer-tube:~# cd /opt/peertube
```
Fem còpia del `docker-compose.yml` original:
```bash
root@peer-tube:/opt/peertube# cp docker-compose.yml docker-compose.yml.original
```
Fem còpia del `.env` original:
```bash
root@peer-tube:/opt/peertube# cp .env .env.original
```
Comprovem:
```bash
root@peer-tube:/opt/peertube# ls -lna
```
Resultat esperat:
```text
.env
.env.original
docker-compose.yml
docker-compose.yml.original
docker-volume
```
## 3. Generar contrasenya de PostgreSQL
Generem una contrasenya llarga per PostgreSQL:
```bash
root@peer-tube:/opt/peertube# openssl rand -base64 32
```
Guardem el resultat per posar-lo al `.env`.
Exemple de valor:
```text
CONTRASENYA_LLARGA_POSTGRES Nv47Om0bTtuSdEmCVyb10oGk2YDo9lcgkxj5Z+RzeIM=
```
## 4. Generar secret de PeerTube
Generem el secret de PeerTube:
```bash
root@peer-tube:/opt/peertube# openssl rand -hex 32
```
Guardem el resultat per posar-lo al `.env`.
Exemple de valor:
```text
SECRET_LLARG_PEERTUBE 7938b6b369366e32647c9421f34840b23bd06b23a7bde08ce36151b70107daf6
```
## 5. Editar el fitxer .env
Obrim el fitxer `.env`:
```bash
root@peer-tube:/opt/peertube# nano .env
```
Hem de substituir els valors de plantilla pel nostre escenari.
Els valors principals són:
```env
POSTGRES_USER=peertube
POSTGRES_PASSWORD=CONTRASENYA_LLARGA_POSTGRES
POSTGRES_DB=peertube_prod
PEERTUBE_WEBSERVER_HOSTNAME=DOMINI_TRIAT
PEERTUBE_WEBSERVER_PORT=443
PEERTUBE_WEBSERVER_HTTPS=true
PEERTUBE_ADMIN_EMAIL=CORREU_ADMIN
PEERTUBE_SECRET=SECRET_LLARG_PEERTUBE
PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "192.168.100.0/24"]
```
## 6. Notes sobre el domini
El domini sha descriure sense protocol.
Correcte:
```text
video.exemple.cat
```
Incorrecte:
```text
https://video.exemple.cat
```
Per tant:
```env
PEERTUBE_WEBSERVER_HOSTNAME=video.exemple.cat
```
## 7. Notes sobre HTTPS
Encara que PeerTube internament escolti per HTTP al port `9000`, de cara a lexterior el servei serà HTTPS perquè el CT Apache farà el TLS.
Per això posem:
```env
PEERTUBE_WEBSERVER_PORT=443
PEERTUBE_WEBSERVER_HTTPS=true
```
Això fa que PeerTube generi URLs públiques correctes amb:
```text
https://DOMINI_TRIAT
```
## 8. Notes sobre TRUST_PROXY
Com que PeerTube estarà darrere dun proxy invers Apache, cal confiar en el proxy.
Posem:
```env
PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "192.168.100.0/24"]
```
Això cobreix el cas en què el CT Apache i la VM PeerTube estiguin dins la xarxa:
```text
192.168.100.0/24
```
Si el CT Apache té una IP concreta i volem ser més estrictes, podríem posar només aquella IP.
Per exemple:
```env
PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "192.168.100.50"]
```
## 9. Exemple de bloc .env adaptat
Aquest és un exemple conceptual. Cal substituir `DOMINI_TRIAT`, `CORREU_ADMIN`, `CONTRASENYA_LLARGA_POSTGRES` i `SECRET_LLARG_PEERTUBE`.
```env
POSTGRES_USER=peertube
POSTGRES_PASSWORD=CONTRASENYA_LLARGA_POSTGRES
POSTGRES_DB=peertube_prod
PEERTUBE_WEBSERVER_HOSTNAME=DOMINI_TRIAT
PEERTUBE_WEBSERVER_PORT=443
PEERTUBE_WEBSERVER_HTTPS=true
PEERTUBE_ADMIN_EMAIL=CORREU_ADMIN
PEERTUBE_SECRET=SECRET_LLARG_PEERTUBE
PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "192.168.100.0/24"]
```
## 10. Editar docker-compose.yml
Obrim el fitxer:
```bash
root@peer-tube:/opt/peertube# nano docker-compose.yml
```
Hem de modificar tres coses:
```text
1. Desactivar el servei webserver
2. Desactivar el servei certbot
3. Desactivar el servei webserver-reloader
4. Activar el port 9000 al servei peertube
```
# docker-compose.yml adaptat per al desplegament PeerTube amb proxy Apache extern
## Fitxer modificat
Aquest fitxer parteix del `docker-compose.yml` oficial de PeerTube, però sha adaptat al nostre escenari.
En aquest desplegament **no fem servir el webserver Nginx oficial de PeerTube**, perquè el proxy invers i el TLS els gestionarà un altre CT amb Apache.
Per tant, deixem comentats els serveis:
```text
webserver
certbot
webserver-reloader
```
El servei `peertube` exposarà directament el port intern `9000` a la VM Ubuntu:
```text
192.168.100.111:9000
```
Aquest port serà consumit pel CT Apache Reverse Proxy.
## Fitxer `docker-compose.yml`
```yaml
services:
###########################################################################
# WEBSERVER OFICIAL DE PEERTUBE
###########################################################################
#
# NO EL FEM SERVIR.
#
# Motiu:
# En aquest projecte el proxy invers i HTTPS els gestionarà un altre CT
# amb Apache. Per tant, no necessitem el contenidor webserver oficial
# basat en Nginx.
#
# Si deixéssim aquest servei actiu, intentaria ocupar els ports 80 i 443
# dins la VM PeerTube, cosa que no volem.
#
###########################################################################
# webserver:
# image: chocobozzz/peertube-webserver:latest
# env_file:
# - .env
# ports:
# - "80:80"
# - "443:443"
# volumes:
# - type: bind
# source: ./docker-volume/nginx/peertube
# target: /etc/nginx/conf.d/peertube.template
# - assets:/var/www/peertube/peertube-latest/client/dist:ro
# - ./docker-volume/data:/var/www/peertube/storage
# - certbot-www:/var/www/certbot
# - ./docker-volume/certbot/conf:/etc/letsencrypt
# - ./docker-volume/nginx-logs:/var/log/nginx
# depends_on:
# - peertube
# restart: "always"
###########################################################################
# CERTBOT OFICIAL DEL COMPOSE
###########################################################################
#
# NO EL FEM SERVIR.
#
# Motiu:
# Els certificats TLS no es gestionaran des daquesta VM PeerTube.
# Els gestionarà el CT Apache Reverse Proxy.
#
###########################################################################
# certbot:
# container_name: certbot
# image: certbot/certbot
# volumes:
# - ./docker-volume/certbot/conf:/etc/letsencrypt
# - certbot-www:/var/www/certbot
# restart: unless-stopped
# entrypoint: /bin/sh -c "trap exit TERM; while :; do certbot renew --webroot -w /var/www/certbot; sleep 12h & wait $${!}; done;"
# depends_on:
# - webserver
###########################################################################
# WEBSERVER RELOADER
###########################################################################
#
# NO EL FEM SERVIR.
#
# Motiu:
# Aquest servei només té sentit si fem servir el webserver oficial.
# Com que el webserver oficial està desactivat, aquest servei també queda
# desactivat.
#
###########################################################################
# webserver-reloader:
# image: alpine:latest
# command: >
# sh -c "trap exit TERM;
# while :; do
# sleep 21600 & wait $$!;
# echo 'Sending reload signal to webserver...';
# kill -HUP 1;
# done"
# pid: "service:webserver"
# depends_on:
# - webserver
# restart: "always"
###########################################################################
# PEERTUBE
###########################################################################
#
# Aquest és el servei principal de laplicació.
#
# Exposem el port 9000 perquè el CT Apache extern pugui fer proxy cap a:
#
# http://192.168.100.111:9000
#
# El port 1935 queda comentat de moment. Només caldrà activar-lo si volem
# funcionalitat de directes RTMP.
#
###########################################################################
peertube:
image: chocobozzz/peertube:production
# Es manté la IP estàtica interna del contenidor perquè és la configuració
# prevista pel compose oficial.
networks:
default:
ipv4_address: 172.18.0.42
ipv6_address: fdab:e4b3:21a2:ef1b::42
env_file:
- .env
ports:
# Port HTTP intern de PeerTube exposat a la VM.
# El CT Apache farà proxy cap a aquest port.
- "9000:9000"
# Port RTMP per a directes.
# De moment el deixem desactivat.
# - "1935:1935"
volumes:
# Aquesta línia només calia per compartir assets amb el webserver oficial.
# Com que no fem servir el webserver oficial, queda comentada.
# - assets:/app/client/dist
# DATA gran de PeerTube.
# En el nostre cas aquest directori és un enllaç simbòlic cap al TrueNAS:
#
# ./docker-volume/data -> /mnt/truenas-peertube/data
#
- ./docker-volume/data:/data
# Configuració interna de PeerTube.
# Aquesta queda local dins la VM.
- ./docker-volume/config:/config
depends_on:
- postgres
- redis
- postfix
restart: "always"
###########################################################################
# POSTGRESQL
###########################################################################
#
# Base de dades de PeerTube.
#
# IMPORTANT:
# Aquesta part queda local dins la VM Ubuntu.
# No la posem al TrueNAS per NFS.
#
###########################################################################
postgres:
image: postgres:17-alpine
env_file:
- .env
volumes:
- ./docker-volume/db:/var/lib/postgresql/data
restart: "always"
###########################################################################
# REDIS
###########################################################################
#
# Redis queda local dins la VM Ubuntu.
#
###########################################################################
redis:
image: redis:8-alpine
volumes:
- ./docker-volume/redis:/data
restart: "always"
###########################################################################
# POSTFIX
###########################################################################
#
# Servei de correu del compose oficial.
#
# El mantenim perquè PeerTube pot necessitar enviar correus.
# La configuració fina dependrà després de lSMTP que vulguem usar.
#
###########################################################################
postfix:
image: mwader/postfix-relay
env_file:
- .env
volumes:
- ./docker-volume/opendkim/keys:/etc/opendkim/keys
restart: "always"
###########################################################################
# XARXA DOCKER
###########################################################################
#
# Mantenim la xarxa definida pel compose oficial.
#
###########################################################################
networks:
default:
enable_ipv6: true
ipam:
driver: default
config:
- subnet: 172.18.0.0/16
- subnet: fdab:e4b3:21a2:ef1b::/64
###########################################################################
# VOLUMS DOCKER
###########################################################################
#
# El volum assets queda comentat perquè només era necessari per al webserver
# oficial.
#
# El volum certbot-www també queda comentat perquè no fem servir certbot dins
# aquesta VM.
#
###########################################################################
# volumes:
# assets:
# certbot-www:
```
## Aplicació del canvi
Podem substituir el fitxer actual així:
```bash
root@peer-tube:/opt/peertube# cp docker-compose.yml docker-compose.yml.original
```
```bash
root@peer-tube:/opt/peertube# nano docker-compose.yml
```
Enganxem el contingut modificat i desem.
## Validació del fitxer
Després comprovem que el YAML és correcte:
```bash
root@peer-tube:/opt/peertube# docker compose config
```
Si no hi ha errors, mirem quins serveis detecta:
```bash
root@peer-tube:/opt/peertube# docker compose config --services
```
El resultat esperat és:
```text
peertube
postgres
redis
postfix
```
No han daparèixer:
```text
webserver
certbot
webserver-reloader
```
## Decisió documentada
El `docker-compose.yml` queda adaptat per funcionar amb un proxy invers extern.
PeerTube queda exposat internament a:
```text
http://192.168.100.111:9000
```
I el CT Apache serà qui publicarà el servei amb HTTPS cap a internet.
## Separació de dades
```text
Local VM Ubuntu:
./docker-volume/db
./docker-volume/redis
./docker-volume/config
./docker-volume/opendkim
TrueNAS:
./docker-volume/data
-> /mnt/truenas-peertube/data
```
## 18. Validar sintaxi del compose
Després de modificar el fitxer, validem la configuració:
```bash
root@peer-tube:/opt/peertube# docker compose config
```
Si hi ha errors de YAML, aquesta ordre els mostrarà.
Si tot és correcte, imprimirà la configuració final expandida.
## 19. Comprovar que el webserver ja no hi és
Podem mirar quins serveis detecta Compose:
```bash
root@peer-tube:/opt/peertube# docker compose config --services
```
Resultat esperat aproximat:
```text
postgres
redis
postfix
peertube
```
No haurien daparèixer:
```text
webserver
certbot
webserver-reloader
```
## 20. Primera descàrrega dimatges
Quan la configuració sigui vàlida, descarreguem imatges:
```bash
root@peer-tube:/opt/peertube# docker compose pull
```
Això descarregarà:
```text
PeerTube
PostgreSQL
Redis
Postfix
```
## 21. Primera arrencada
Arrenquem en segon pla:
```bash
root@peer-tube:/opt/peertube# docker compose up -d
```
## 22. Veure estat dels contenidors
```bash
root@peer-tube:/opt/peertube# docker compose ps
```
Resultat esperat:
```text
postgres running
redis running
postfix running
peertube running
```
## 23. Veure logs de PeerTube
```bash
root@peer-tube:/opt/peertube# docker compose logs -f peertube
```
En aquesta primera arrencada poden sortir missatges dinicialització de base de dades i configuració.
ERRORS PRIMER UP
falten unes dobles cometes per separat array de proxy
# Correcció de `PEERTUBE_TRUST_PROXY`
## Error detectat
Després de la primera arrencada amb:
```bash
root@peer-tube:/opt/peertube# docker compose up -d
```
els logs de PeerTube mostren aquest error:
```text
TypeError: invalid range on address: 172.18.0.0/16, 192.168.100.104
```
## Diagnosi
El problema és a la variable:
```env
PEERTUBE_TRUST_PROXY
```
PeerTube està rebent aquesta part:
```text
172.18.0.0/16, 192.168.100.104
```
com si fos **una única adreça o rang**, i això no és vàlid.
El que volem és que ho interpreti com una llista de proxys o xarxes de confiança.
## Valor incorrecte probable
Al `.env` probablement hi ha alguna cosa semblant a:
```env
PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "172.18.0.0/16, 192.168.100.104"]
```
El problema és que aquesta part està dins les mateixes cometes:
```text
"172.18.0.0/16, 192.168.100.104"
```
Això ho converteix en una sola entrada.
## Valor correcte
Cal posar cada element separat dins larray:
```env
PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "172.18.0.0/16", "192.168.100.104"]
```
## Què representa cada entrada
```text
127.0.0.1
localhost
loopback
rangs loopback reconeguts per Express/Node
172.18.0.0/16
xarxa interna Docker definida al docker-compose.yml
192.168.100.104
IP del CT Apache Reverse Proxy
```
## Important
La IP `192.168.100.104` ha de ser la IP real del CT Apache que farà de proxy invers.
Si el CT Apache té una altra IP, cal posar aquella.
Per exemple, si el CT Apache fos:
```text
192.168.100.50
```
la línia hauria de ser:
```env
PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "172.18.0.0/16", "192.168.100.50"]
```
## Correcció del fitxer .env
Editem el fitxer:
```bash
root@peer-tube:/opt/peertube# nano .env
```
Busquem:
```env
PEERTUBE_TRUST_PROXY=
```
I deixem la línia així:
```env
PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "172.18.0.0/16", "192.168.100.104"]
```
## Aturar i recrear contenidors
Després de canviar el `.env`, cal recrear el contenidor perquè agafi la nova variable.
Primer aturem:
```bash
root@peer-tube:/opt/peertube# docker compose down
```
Després tornem a aixecar:
```bash
root@peer-tube:/opt/peertube# docker compose up -d
```
## Comprovar estat
```bash
root@peer-tube:/opt/peertube# docker compose ps
```
## Consultar logs
```bash
root@peer-tube:/opt/peertube# docker compose logs -f peertube
```
Ja no hauria daparèixer:
```text
invalid range on address
```
## Comprovar la variable dins del contenidor
Podem comprovar què ha rebut realment el contenidor:
```bash
root@peer-tube:/opt/peertube# docker compose exec peertube printenv | grep PEERTUBE_TRUST_PROXY
```
El resultat esperat és:
```text
PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "172.18.0.0/16", "192.168.100.104"]
```
## Validar el compose
També podem validar:
```bash
root@peer-tube:/opt/peertube# docker compose config | grep PEERTUBE_TRUST_PROXY
```
## Decisió documentada
El CT Apache Reverse Proxy queda declarat com a proxy de confiança de PeerTube.
Això és necessari perquè PeerTube interpreti correctament capçaleres com:
```text
X-Forwarded-For
X-Forwarded-Proto
Host
```
Sense aquesta configuració, PeerTube pot interpretar malament:
```text
IP real del client
protocol públic HTTPS
domini públic
```
## Resum
Valor corregit:
```env
PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "172.18.0.0/16", "192.168.100.104"]
```
Accions:
```bash
root@peer-tube:/opt/peertube# docker compose down
root@peer-tube:/opt/peertube# docker compose up -d
root@peer-tube:/opt/peertube# docker compose logs -f peertube
```
## 24. Comprovar que escolta el port 9000
```bash
root@peer-tube:/opt/peertube# ss -lntp | grep 9000
```
Resultat esperat:
```text
LISTEN ... :9000
```
## 25. Prova HTTP local
Des de la mateixa VM:
```bash
root@peer-tube:/opt/peertube# curl -I http://127.0.0.1:9000
```
Des del Proxmox:
```bash
root@base:~# curl -I http://192.168.100.111:9000
```
Des del CT Apache també hauria de respondre:
```bash
root@apache-proxy:~# curl -I http://192.168.100.111:9000
```
## 26. Obtenir la contrasenya inicial de root
Un cop PeerTube hagi arrencat, podem buscar la contrasenya inicial de lusuari `root` als logs:
```bash
root@peer-tube:/opt/peertube# docker compose logs peertube | grep -A1 root
```
Si cal reiniciar-la manualment:
```bash
root@peer-tube:/opt/peertube# docker compose exec -u peertube peertube npm run reset-password -- -u root
```
## 27. Comprovar que la DATA escriu al TrueNAS
Mentre PeerTube arrenca, comprovem que el directori `data` continua sent lenllaç cap al TrueNAS:
```bash
root@peer-tube:/opt/peertube# ls -lna docker-volume
```
Resultat esperat:
```text
data -> /mnt/truenas-peertube/data
```
Comprovem el muntatge:
```bash
root@peer-tube:/opt/peertube# df -h | grep truenas
```
Si no surt, forcem lautomount:
```bash
root@peer-tube:/opt/peertube# ls -lna /mnt/truenas-peertube
```
I tornem a provar:
```bash
root@peer-tube:/opt/peertube# df -h | grep truenas
```
## 28. Decisió documentada
El desplegament de PeerTube queda adaptat així:
```text
Serveis Docker actius:
postgres
redis
postfix
peertube
Serveis Docker desactivats:
webserver
certbot
webserver-reloader
```
El servei públic no lexposa PeerTube directament.
Lexposició pública es farà amb:
```text
CT Apache Reverse Proxy
→ http://192.168.100.111:9000
```
## 29. Estat esperat al final daquesta fase
```text
docker compose config
→ sense errors
docker compose config --services
→ postgres
→ redis
→ postfix
→ peertube
docker compose ps
→ contenidors running
curl -I http://127.0.0.1:9000
→ resposta HTTP
curl -I http://192.168.100.111:9000
→ resposta HTTP des del Proxmox o CT Apache
```
## 30. Següent fase
La següent fase serà configurar el CT Apache com a reverse proxy cap a:
```text
http://192.168.100.111:9000
```
I validar laccés públic amb:
```text
https://DOMINI_TRIAT
```
# Validació inicial de PeerTube
## Situació
Després de corregir el valor de `PEERTUBE_TRUST_PROXY`, el contenidor de PeerTube saixeca correctament.
La comprovació HTTP contra el port intern de la VM retorna resposta vàlida.
## Prova feta des de la VM i des del Proxmox
```bash
root@base:~# curl -I http://192.168.100.111:9000
```
Resultat:
```text
HTTP/1.1 200 OK
x-powered-by: PeerTube
X-Frame-Options: DENY
Tk: N
Access-Control-Allow-Origin: *
X-RateLimit-Limit: 500
X-RateLimit-Remaining: 499
Date: Sat, 06 Jun 2026 10:27:19 GMT
X-RateLimit-Reset: 1780741650
Content-Type: text/html; charset=utf-8
Cache-Control: max-age=0, no-cache, must-revalidate
Vary: Accept-Language
Content-Length: 21165
ETag: W/"52ad-8Td+OFxxict6kAkUm1NvqAWynKU"
Connection: keep-alive
Keep-Alive: timeout=5
```
## Resultat de la prova
La resposta és correcta:
```text
HTTP/1.1 200 OK
```
I confirma que el servei que respon és PeerTube:
```text
x-powered-by: PeerTube
```
## Diagnosi
PeerTube està funcionant internament a:
```text
http://192.168.100.111:9000
```
Això confirma que:
```text
Docker funciona
docker compose funciona
PostgreSQL funciona
Redis funciona
PeerTube arrenca
El port 9000 està exposat correctament
La VM respon des de la xarxa interna
```
## Correcció aplicada
El problema anterior venia de la variable:
```env
PEERTUBE_TRUST_PROXY
```
El valor havia de tenir cada element separat i amb les cometes correctes.
Exemple correcte:
```env
PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "172.18.0.0/16", "192.168.100.104"]
```
El valor incorrecte feia que PeerTube interpretés més duna adreça com si fos un únic rang.
## Estat actual del desplegament
```text
VM PeerTube:
IP: 192.168.100.111
Port intern: 9000
Estat: respon HTTP 200 OK
TrueNAS:
IP: 192.168.100.101
Muntatge NFS: funcional
DATA gran: muntada a /mnt/truenas-peertube/data
Docker:
PeerTube: aixecat
PostgreSQL: aixecat
Redis: aixecat
Postfix: aixecat
Proxy Apache:
pendent de configurar
```
## Comprovacions útils ara
Veure contenidors:
```bash
root@peer-tube:/opt/peertube# docker compose ps
```
Veure logs de PeerTube:
```bash
root@peer-tube:/opt/peertube# docker compose logs --tail=100 peertube
```
Comprovar que el muntatge TrueNAS continua actiu:
```bash
root@peer-tube:/opt/peertube# ls -lna /mnt/truenas-peertube
```
```bash
root@peer-tube:/opt/peertube# df -h | grep truenas
```
Comprovar que `docker-volume/data` apunta al TrueNAS:
```bash
root@peer-tube:/opt/peertube# ls -lna docker-volume
```
Resultat esperat:
```text
data -> /mnt/truenas-peertube/data
```
## Decisió documentada
El backend PeerTube queda validat abans de configurar el proxy invers.
Això és important perquè separa dos problemes diferents:
```text
1. PeerTube funciona internament
2. Apache publicarà PeerTube cap a fora
```
Ara ja sabem que el punt 1 està resolt.
## Següent fase
El següent pas és configurar el CT Apache Reverse Proxy perquè publiqui:
```text
https://DOMINI_TRIAT
```
cap al backend intern:
```text
http://192.168.100.111:9000
```
El virtualhost Apache haurà de gestionar:
```text
TLS / certificat
ProxyPass
ProxyPassReverse
capçaleres X-Forwarded-Proto
capçaleres X-Forwarded-For
WebSocket si cal
límit de mida de pujada
```
PROBLEMA AMB CERTBOT I CADDY
# Diagnosi Apache / Certbot: port 80 i 443 ocupats
## 1. Situació observada
Sha creat el VirtualHost dApache per PeerTube, sha activat amb `a2ensite` i sha fet `reload`.
Posteriorment, en executar Certbot, Apache falla amb:
```text
Action 'graceful' failed
```
El log mostra:
```text
(98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
(98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
AH00015: Unable to open logs
```
També es veu:
```text
AH00112: Warning: DocumentRoot [/home/rtd/public/m16] does not exist
```
## 2. Estat actual dels ports
Com a usuari normal sha executat:
```bash
rtd@Vhost:~$ ss -ltnp | grep ':80'
```
I mostra:
```text
LISTEN 0 4096 *:80 *:*
```
També:
```bash
rtd@Vhost:~$ ss -ltnp | grep ':443'
```
I mostra:
```text
LISTEN 0 4096 *:443 *:*
```
Això confirma que els ports 80 i 443 estan ocupats.
Però com que lordre no sha executat com a root, no mostra quin procés els ocupa.
## 3. Primera comprovació important
Cal executar `ss` com a root:
```bash
root@Vhost:~# ss -ltnp | grep -E ':80|:443'
```
O bé, si encara estem com a `rtd`:
```bash
rtd@Vhost:~$ sudo ss -ltnp | grep -E ':80|:443'
```
El resultat hauria de mostrar el procés, per exemple:
```text
users:(("apache2",pid=...,fd=...))
```
o bé:
```text
users:(("nginx",pid=...,fd=...))
```
o bé:
```text
users:(("docker-proxy",pid=...,fd=...))
```
## 4. Hipòtesi més probable
Pel log, sembla que Apache estava funcionant, però durant el reload/start ha quedat en estat inconsistent.
Això es veu aquí:
```text
apache2.service: Killing process 1310773 (apache2) with signal SIGKILL.
apache2.service: Killing process 1310775 (apache2) with signal SIGKILL.
apache2.service: Failed with result 'exit-code'.
```
Després, quan systemd intenta tornar-lo a iniciar:
```text
Address already in use
```
Això pot passar si han quedat processos Apache vius fora del control normal de systemd, o si un altre servei ha agafat el port.
## 5. Comprovar lestat real dApache
```bash
root@Vhost:~# systemctl status apache2
```
També:
```bash
root@Vhost:~# ps aux | grep apache2
```
I:
```bash
root@Vhost:~# apache2ctl -S
```
Aquesta última ordre mostra quins VirtualHosts veu Apache i pot ajudar a detectar configuracions duplicades o estranyes.
## 6. Comprovar sintaxi de configuració
Abans de tocar Certbot, Apache ha de passar aquest test:
```bash
root@Vhost:~# apache2ctl configtest
```
El resultat correcte és:
```text
Syntax OK
```
Si surt qualsevol altre error, cal corregir-lo abans de tornar a executar Certbot.
## 7. Localitzar el DocumentRoot inexistent
El warning és:
```text
DocumentRoot [/home/rtd/public/m16] does not exist
```
Busquem quin VirtualHost el declara:
```bash
root@Vhost:~# grep -R "/home/rtd/public/m16" /etc/apache2/sites-available /etc/apache2/sites-enabled
```
Si és un site antic que ja no fem servir, el desactivem:
```bash
root@Vhost:~# a2dissite NOM_DEL_SITE.conf
```
Si encara el volem mantenir, creem el directori:
```bash
root@Vhost:~# mkdir -p /home/rtd/public/m16
```
I opcionalment un index mínim:
```bash
root@Vhost:~# echo "OK m16" > /home/rtd/public/m16/index.html
```
Aquest warning no sembla el bloqueig principal, però convé deixar-lo net.
## 8. Si els ports 80/443 els ocupa Apache
Si aquesta ordre:
```bash
root@Vhost:~# ss -ltnp | grep -E ':80|:443'
```
mostra que qui ocupa els ports és `apache2`, però `systemctl status apache2` diu que el servei està fallit, fem neteja controlada.
Primer intentem aturar Apache:
```bash
root@Vhost:~# systemctl stop apache2
```
Comprovem si encara queda escoltant:
```bash
root@Vhost:~# ss -ltnp | grep -E ':80|:443'
```
Si encara apareixen processos `apache2`, els mirem:
```bash
root@Vhost:~# ps aux | grep apache2
```
I només si cal, matem processos Apache penjats:
```bash
root@Vhost:~# pkill apache2
```
Tornem a comprovar:
```bash
root@Vhost:~# ss -ltnp | grep -E ':80|:443'
```
Ara no hauria de sortir res ocupant 80/443.
Després netegem lestat de systemd:
```bash
root@Vhost:~# systemctl reset-failed apache2
```
Validem configuració:
```bash
root@Vhost:~# apache2ctl configtest
```
I arrenquem Apache:
```bash
root@Vhost:~# systemctl start apache2
```
Comprovem:
```bash
root@Vhost:~# systemctl status apache2
```
I ports:
```bash
root@Vhost:~# ss -ltnp | grep -E ':80|:443'
```
Ara haurien de sortir ocupats per Apache, però amb el servei en estat correcte:
```text
active (running)
```
## 9. Si els ports els ocupa un altre servei
Si `ss` mostra `nginx`:
```bash
root@Vhost:~# systemctl status nginx
```
Si no el necessitem:
```bash
root@Vhost:~# systemctl stop nginx
```
```bash
root@Vhost:~# systemctl disable nginx
```
Si mostra `docker-proxy`:
```bash
root@Vhost:~# docker ps
```
Caldrà veure quin contenidor publica 80/443 i aturar-lo o canviar-li ports.
## 10. Tornar a provar Apache net
Quan els ports estiguin sota control, fem:
```bash
root@Vhost:~# apache2ctl configtest
```
```bash
root@Vhost:~# systemctl restart apache2
```
```bash
root@Vhost:~# systemctl status apache2
```
```bash
root@Vhost:~# ss -ltnp | grep -E ':80|:443'
```
## 11. Provar el VirtualHost HTTP abans de Certbot
Abans de tornar a Certbot, el VirtualHost HTTP ha de respondre.
Des del mateix CT Apache:
```bash
root@Vhost:~# curl -I http://DOMINI_TRIAT
```
També provem el backend PeerTube:
```bash
root@Vhost:~# curl -I http://192.168.100.111:9000
```
El backend PeerTube hauria de respondre:
```text
HTTP/1.1 200 OK
x-powered-by: PeerTube
```
## 12. Tornar a executar Certbot
Només quan Apache estigui en estat correcte:
```text
apache2ctl configtest → Syntax OK
systemctl status apache2 → active (running)
curl http://DOMINI_TRIAT → respon
```
tornem a Certbot:
```bash
root@Vhost:~# certbot --apache -d DOMINI_TRIAT
```
## 13. Comandes immediates recomanades
Ara mateix executaria aquest bloc:
```bash
root@Vhost:~# ss -ltnp | grep -E ':80|:443'
root@Vhost:~# systemctl status apache2
root@Vhost:~# ps aux | grep apache2
root@Vhost:~# apache2ctl configtest
root@Vhost:~# apache2ctl -S
```
## 14. Interpretació ràpida
El punt clau és aquest:
```text
El port 80 està ocupat, però Apache/systemd està en estat fallit.
```
Això sha de resoldre abans de Certbot.
Certbot no podrà instal·lar ni modificar correctament el VirtualHost mentre Apache no pugui fer reload/restart netament.
# Diagnosi: per què Caddy està ocupant els ports 80 i 443?
## 1. Situació
Apache no pot arrencar perquè els ports 80 i 443 ja estan ocupats.
La comprovació mostra:
```bash
root@Vhost:~# ss -ltnp | grep ':80'
```
Resultat:
```text
LISTEN 0 4096 *:80 *:* users:(("caddy",pid=1311928,fd=8))
```
I també:
```bash
root@Vhost:~# ss -ltnp | grep ':443'
```
Resultat:
```text
LISTEN 0 4096 *:443 *:* users:(("caddy",pid=1311928,fd=6))
```
Per tant, el procés que ocupa els ports públics és:
```text
caddy
```
Ara cal saber:
```text
qui ha arrencat Caddy
si està habilitat al boot
si depèn de systemd
si lha iniciat algun script, timer o contenidor
si forma part dun servei antic del CT Vhost
```
## 2. Veure lestat del servei Caddy
Primer mirem si Caddy està gestionat per systemd:
```bash
root@Vhost:~# systemctl status caddy
```
Aquesta ordre ens dirà:
```text
si el servei està actiu
des de quan està actiu
quin PID principal té
quin fitxer de servei utilitza
si està habilitat o no
```
Cal mirar especialment línies com:
```text
Loaded: loaded (...; enabled; ...)
Active: active (running) since ...
Main PID: 1311928 (caddy)
```
Si diu:
```text
enabled
```
vol dir que Caddy està configurat per arrencar automàticament amb la màquina.
## 3. Veure si Caddy està habilitat al boot
```bash
root@Vhost:~# systemctl is-enabled caddy
```
Resultats possibles:
```text
enabled
```
Vol dir que Caddy arrenca automàticament.
```text
disabled
```
Vol dir que no hauria darrencar sol amb el boot, però algú lha pogut iniciar manualment.
```text
static
```
Vol dir que no sactiva directament, però pot ser requerit per una altra unitat.
## 4. Veure qui és el pare del procés Caddy
Comprovem larbre de processos:
```bash
root@Vhost:~# ps -fp 1311928
```
I també:
```bash
root@Vhost:~# pstree -sp 1311928
```
Resultat esperat si lha arrencat systemd:
```text
systemd───caddy
```
Això indicaria que Caddy és un servei normal gestionat per systemd.
Si sortís una altra cosa, per exemple un script o un procés Docker, caldria investigar aquell procés pare.
## 5. Veure la unitat systemd de Caddy
```bash
root@Vhost:~# systemctl cat caddy
```
Això mostrarà el fitxer de servei, normalment alguna cosa com:
```text
/etc/systemd/system/caddy.service
```
o:
```text
/lib/systemd/system/caddy.service
```
Cal mirar sobretot:
```text
ExecStart=
ExecReload=
User=
Group=
```
Això ens dirà com sestà arrencant Caddy.
## 6. Veure quan sha arrencat Caddy
Mirem el journal del servei:
```bash
root@Vhost:~# journalctl -u caddy -n 100 --no-pager
```
Per veure només el boot actual:
```bash
root@Vhost:~# journalctl -u caddy -b --no-pager
```
Això ens hauria de dir si Caddy ha arrencat durant larrencada del sistema.
Busquem línies semblants a:
```text
Started caddy.service - Caddy.
```
o:
```text
systemd[1]: Starting caddy.service
```
## 7. Comparar amb larrencada del sistema
Mirem quan ha arrencat el CT o la màquina:
```bash
root@Vhost:~# uptime -s
```
I comparem-ho amb:
```bash
root@Vhost:~# systemctl status caddy
```
Si lhora dinici de Caddy coincideix amb larrencada del sistema, és gairebé segur que està habilitat al boot.
## 8. Veure si Caddy va arrencar després dun reinici nocturn
Com que has vist activitat de matinada, mirem el boot actual:
```bash
root@Vhost:~# journalctl -b --no-pager | grep -i caddy
```
També podem mirar reinicis anteriors:
```bash
root@Vhost:~# journalctl --list-boots
```
Això mostrarà una llista de boots.
Exemple:
```text
-1 boot anterior
0 boot actual
```
Podem mirar Caddy al boot anterior:
```bash
root@Vhost:~# journalctl -u caddy -b -1 --no-pager
```
I al boot actual:
```bash
root@Vhost:~# journalctl -u caddy -b 0 --no-pager
```
## 9. Veure si algun timer o procés ha tocat Caddy
Llistem timers actius:
```bash
root@Vhost:~# systemctl list-timers --all
```
Busquem coses relacionades amb Caddy o renovació de certificats:
```bash
root@Vhost:~# systemctl list-timers --all | grep -Ei 'caddy|cert|renew|letsencrypt'
```
Caddy normalment no necessita un timer extern de renovació com Certbot, perquè gestiona certificats ell mateix.
Però pot haver-hi algun timer o script del sistema.
## 10. Veure si Caddy està instal·lat com a paquet
```bash
root@Vhost:~# dpkg -l | grep caddy
```
També podem mirar quan es va instal·lar:
```bash
root@Vhost:~# grep -i caddy /var/log/apt/history.log
```
Si els logs estan rotats:
```bash
root@Vhost:~# zgrep -i caddy /var/log/apt/history.log*
```
Això pot dir-nos si Caddy es va instal·lar en una sessió anterior del projecte.
## 11. Veure la configuració actual de Caddy
```bash
root@Vhost:~# ls -lna /etc/caddy
```
```bash
root@Vhost:~# cat /etc/caddy/Caddyfile
```
Això ens dirà quins dominis està servint actualment.
És important perquè potser Caddy ja està publicant altres serveis del CT.
## 12. Veure si Caddy té fitxers de configuració alternatius
Busquem referències:
```bash
root@Vhost:~# grep -R "reverse_proxy\|:80\|:443\|tls\|http://" /etc/caddy /etc/systemd/system /lib/systemd/system 2>/dev/null
```
Això pot mostrar:
```text
quins dominis serveix
a quins backends fa proxy
si hi ha configuracions personalitzades
```
## 13. Veure si Apache està habilitat també al boot
Per saber si hi ha conflicte permanent entre Apache i Caddy:
```bash
root@Vhost:~# systemctl is-enabled apache2
```
I:
```bash
root@Vhost:~# systemctl status apache2
```
Si tots dos estan habilitats:
```text
caddy enabled
apache2 enabled
```
llavors al boot poden competir pels ports 80/443.
## 14. Diagnosi probable
Si `systemctl status caddy` mostra:
```text
Loaded: loaded (...; enabled; ...)
Active: active (running) since ...
```
aleshores la resposta és:
```text
Caddy sha disparat perquè està habilitat com a servei systemd.
Ha arrencat automàticament en reiniciar el CT/màquina.
```
Això explicaria que després del reinici nocturn Caddy hagi recuperat els ports 80 i 443.
## 15. Comandes mínimes que cal executar ara
```bash
root@Vhost:~# systemctl status caddy
```
```bash
root@Vhost:~# systemctl is-enabled caddy
```
```bash
root@Vhost:~# pstree -sp 1311928
```
```bash
root@Vhost:~# journalctl -u caddy -b --no-pager
```
```bash
root@Vhost:~# cat /etc/caddy/Caddyfile
```
```bash
root@Vhost:~# systemctl is-enabled apache2
```
## 16. Possibles conclusions
### Cas A: Caddy està enabled
Conclusió:
```text
Caddy arrenca automàticament al boot.
```
Si volem fer servir Apache, caldrà desactivar Caddy:
```bash
root@Vhost:~# systemctl disable --now caddy
```
Després:
```bash
root@Vhost:~# systemctl restart apache2
```
### Cas B: Caddy està disabled però actiu
Conclusió:
```text
Algú lha iniciat manualment o algun altre servei lha cridat.
```
Caldrà mirar:
```bash
root@Vhost:~# journalctl -u caddy -b --no-pager
```
i:
```bash
root@Vhost:~# pstree -sp 1311928
```
### Cas C: Caddy no és servei systemd normal
Si `systemctl status caddy` no troba el servei, però el procés existeix, caldrà mirar don surt:
```bash
root@Vhost:~# ps aux | grep caddy
```
```bash
root@Vhost:~# readlink -f /proc/1311928/exe
```
```bash
root@Vhost:~# cat /proc/1311928/cmdline | tr '\0' ' '
```
## 17. Decisió pendent
Encara no decidim si ens quedem amb Caddy o Apache.
Primer documentem qui ha aixecat Caddy.
Després decidirem:
```text
Opció A: Caddy com a frontal únic
Opció B: Apache com a frontal únic i Caddy desactivat
```
//////////////
està clar que el caddy era una rèmora de test d'uns continers que es van quedar funcionant "sols"
/////////////
queden purgats i seguim
# Publicació de PeerTube darrere Apache Reverse Proxy
## 1. Arquitectura final
Lescenari queda així:
```text
Internet
|
| HTTPS / 443
v
CT Vhost - Apache + Certbot
|
| HTTP intern
v
VM PeerTube
192.168.100.111:9000
```
PeerTube no publica directament HTTPS a Internet.
PeerTube escolta internament a:
```text
http://192.168.100.111:9000
```
Apache fa de frontal públic:
```text
https://DOMINI_PEERTUBE
```
## 2. Comprovació prèvia del backend PeerTube
Des del CT `Vhost`:
```bash
root@Vhost:~# curl -I http://192.168.100.111:9000
```
Resultat esperat:
```text
HTTP/1.1 200 OK
x-powered-by: PeerTube
```
Això confirma que Apache pot arribar al backend.
## 3. Activar mòduls necessaris dApache
PeerTube necessita Apache com a reverse proxy HTTP.
Activem els mòduls bàsics:
```bash
root@Vhost:~# a2enmod proxy
root@Vhost:~# a2enmod proxy_http
root@Vhost:~# a2enmod proxy_wstunnel
root@Vhost:~# a2enmod headers
root@Vhost:~# a2enmod ssl
root@Vhost:~# a2enmod rewrite
```
També pot ser útil:
```bash
root@Vhost:~# a2enmod http2
```
Comprovem sintaxi:
```bash
root@Vhost:~# apache2ctl configtest
```
Resultat esperat:
```text
Syntax OK
```
Recarreguem Apache:
```bash
root@Vhost:~# systemctl reload apache2
```
## 4. VirtualHost HTTP inicial
Abans de Certbot, podem crear un VirtualHost HTTP senzill.
Fitxer:
```text
/etc/apache2/sites-available/peertube.conf
```
Crear-lo:
```bash
root@Vhost:~# nano /etc/apache2/sites-available/peertube.conf
```
Contingut inicial:
```apache
<VirtualHost *:80>
ServerName DOMINI_PEERTUBE
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://192.168.100.111:9000/
ProxyPassReverse / http://192.168.100.111:9000/
RequestHeader set X-Forwarded-Proto "http"
RequestHeader set X-Forwarded-Port "80"
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}s"
ErrorLog ${APACHE_LOG_DIR}/peertube-error.log
CustomLog ${APACHE_LOG_DIR}/peertube-access.log combined
</VirtualHost>
```
Activem el site:
```bash
root@Vhost:~# a2ensite peertube.conf
```
Comprovem:
```bash
root@Vhost:~# apache2ctl configtest
```
Recarreguem:
```bash
root@Vhost:~# systemctl reload apache2
```
Prova HTTP:
```bash
root@Vhost:~# curl -I http://DOMINI_PEERTUBE
```
Resultat esperat:
```text
HTTP/1.1 200 OK
x-powered-by: PeerTube
```
## 5. Certificat TLS amb Certbot
Quan HTTP ja funciona, demanem el certificat:
```bash
root@Vhost:~# certbot --apache -d DOMINI_PEERTUBE
```
Certbot crearà o modificarà el VirtualHost SSL.
Després comprovem:
```bash
root@Vhost:~# apache2ctl configtest
```
```bash
root@Vhost:~# systemctl reload apache2
```
Prova HTTPS:
```bash
root@Vhost:~# curl -I https://DOMINI_PEERTUBE
```
## 6. VirtualHost HTTPS recomanat
Després de Certbot, el fitxer pot quedar repartit entre:
```text
/etc/apache2/sites-available/peertube.conf
/etc/apache2/sites-available/peertube-le-ssl.conf
```
La part HTTPS hauria de quedar semblant a això:
```apache
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName DOMINI_PEERTUBE
Protocols h2 http/1.1
ProxyPreserveHost On
ProxyRequests Off
# Permet pujades grans de vídeo.
LimitRequestBody 0
# Timeouts llargs per pujades, importacions i transcodificació.
ProxyTimeout 600
Timeout 600
# Capçaleres importants perquè PeerTube sàpiga que està darrere HTTPS.
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
RequestHeader append X-Forwarded-For "%{REMOTE_ADDR}s"
RequestHeader set X-Real-IP "%{REMOTE_ADDR}s"
# Proxy principal cap a PeerTube.
ProxyPass / http://192.168.100.111:9000/ retry=0 timeout=600
ProxyPassReverse / http://192.168.100.111:9000/
ErrorLog ${APACHE_LOG_DIR}/peertube-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/peertube-ssl-access.log combined
SSLCertificateFile /etc/letsencrypt/live/DOMINI_PEERTUBE/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/DOMINI_PEERTUBE/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
```
## 7. Redirecció HTTP cap a HTTPS
El VirtualHost de port 80 pot quedar només com a redirecció:
```apache
<VirtualHost *:80>
ServerName DOMINI_PEERTUBE
RewriteEngine On
RewriteCond %{SERVER_NAME} =DOMINI_PEERTUBE
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
ErrorLog ${APACHE_LOG_DIR}/peertube-error.log
CustomLog ${APACHE_LOG_DIR}/peertube-access.log combined
</VirtualHost>
```
## 8. WebSocket
PeerTube normalment funciona bé amb el reverse proxy HTTP, però si detectem problemes amb WebSocket o connexions persistents, podem afegir regles específiques.
Primer assegurem el mòdul:
```bash
root@Vhost:~# a2enmod proxy_wstunnel
```
Una versió amb detecció dupgrade seria:
```apache
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule /(.*) ws://192.168.100.111:9000/$1 [P,L]
```
I després mantenim el proxy HTTP normal:
```apache
ProxyPass / http://192.168.100.111:9000/ retry=0 timeout=600
ProxyPassReverse / http://192.168.100.111:9000/
```
Això quedaria dins del VirtualHost HTTPS.
## 9. Límit de mida de pujada
Per evitar problemes pujant vídeos grans:
```apache
LimitRequestBody 0
```
Això vol dir que Apache no imposa un límit propi de mida.
També és útil tenir timeouts llargs:
```apache
ProxyTimeout 600
Timeout 600
```
Si es preveuen pujades molt lentes o fitxers molt grossos, podem pujar-ho a:
```apache
ProxyTimeout 1800
Timeout 1800
```
## 10. Configuració PeerTube `.env`
A la VM PeerTube, cal que el `.env` reflecteixi que el servei públic va per HTTPS.
Fitxer:
```text
/opt/peertube/.env
```
Valors importants:
```env
PEERTUBE_WEBSERVER_HOSTNAME=DOMINI_PEERTUBE
PEERTUBE_WEBSERVER_PORT=443
PEERTUBE_WEBSERVER_HTTPS=true
```
També cal confiar en el proxy Apache.
Si el CT `Vhost` té, per exemple, la IP:
```text
192.168.100.104
```
la línia hauria de ser:
```env
PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "172.18.0.0/16", "192.168.100.104"]
```
Després de canviar el `.env`:
```bash
root@peer-tube:/opt/peertube# docker compose down
root@peer-tube:/opt/peertube# docker compose up -d
```
O, si volem fer només restart:
```bash
root@peer-tube:/opt/peertube# docker compose restart peertube
```
## 11. Fitxer Apache final compacte
Fitxer recomanat:
```text
/etc/apache2/sites-available/peertube.conf
```
Contingut complet:
```apache
<VirtualHost *:80>
ServerName DOMINI_PEERTUBE
RewriteEngine On
RewriteCond %{SERVER_NAME} =DOMINI_PEERTUBE
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
ErrorLog ${APACHE_LOG_DIR}/peertube-error.log
CustomLog ${APACHE_LOG_DIR}/peertube-access.log combined
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName DOMINI_PEERTUBE
Protocols h2 http/1.1
ProxyPreserveHost On
ProxyRequests Off
LimitRequestBody 0
ProxyTimeout 600
Timeout 600
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
RequestHeader append X-Forwarded-For "%{REMOTE_ADDR}s"
RequestHeader set X-Real-IP "%{REMOTE_ADDR}s"
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule /(.*) ws://192.168.100.111:9000/$1 [P,L]
ProxyPass / http://192.168.100.111:9000/ retry=0 timeout=600
ProxyPassReverse / http://192.168.100.111:9000/
ErrorLog ${APACHE_LOG_DIR}/peertube-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/peertube-ssl-access.log combined
SSLCertificateFile /etc/letsencrypt/live/DOMINI_PEERTUBE/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/DOMINI_PEERTUBE/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
```
## 12. Activació final
```bash
root@Vhost:~# a2enmod proxy proxy_http proxy_wstunnel headers ssl rewrite http2
```
```bash
root@Vhost:~# a2ensite peertube.conf
```
```bash
root@Vhost:~# apache2ctl configtest
```
Resultat esperat:
```text
Syntax OK
```
```bash
root@Vhost:~# systemctl reload apache2
```
## 13. Proves finals
Des del CT `Vhost`:
```bash
root@Vhost:~# curl -I http://192.168.100.111:9000
```
```bash
root@Vhost:~# curl -I https://DOMINI_PEERTUBE
```
Des de fora:
```bash
curl -I https://DOMINI_PEERTUBE
```
Resultat esperat:
```text
HTTP/2 200
x-powered-by: PeerTube
```
O bé:
```text
HTTP/1.1 200 OK
x-powered-by: PeerTube
```
segons si HTTP/2 queda actiu.
## 14. Logs útils
Apache:
```bash
root@Vhost:~# tail -f /var/log/apache2/peertube-ssl-error.log
```
```bash
root@Vhost:~# tail -f /var/log/apache2/peertube-ssl-access.log
```
PeerTube:
```bash
root@peer-tube:/opt/peertube# docker compose logs -f peertube
```
## 15. Renovació de certificat
Certbot instal·la normalment renovació automàtica.
Comprovació:
```bash
root@Vhost:~# systemctl list-timers | grep certbot
```
Prova de renovació:
```bash
root@Vhost:~# certbot renew --dry-run
```
## 16. Estat final esperat
```text
Vhost:
Apache actiu
Certbot actiu
ports 80/443 ocupats per apache2
PeerTube:
Docker actiu a la VM 192.168.100.111
backend intern a port 9000
Publicació:
https://DOMINI_PEERTUBE
Capçaleres:
X-Forwarded-Proto=https
X-Forwarded-Port=443
X-Forwarded-For
X-Real-IP
Pujades:
LimitRequestBody 0
ProxyTimeout ampliat
```
# Incidència durant la recreació del desplegament PeerTube
Durant la recreació duna instància prèvia de PeerTube es va reutilitzar una configuració anterior del VirtualHost dApache. La configuració era substancialment correcta: `ProxyPass`, `ProxyPassReverse`, capçaleres `X-Forwarded-*`, TLS amb Certbot i límits adequats per a la publicació de vídeo.
La incidència no va estar causada directament per PeerTube, sinó per lestat previ del servidor `Vhost`.
## Origen de la incidència
El servidor `Vhost` contenia encara restes dun desplegament Docker antic, relacionat amb proves de Snikket/XMPP i altres serveis com Caddy, Bluesky PDS i Watchtower.
Aquest stack havia quedat residual al servidor des de proves anteriors. En condicions normals no interferia perquè Apache ocupava els ports públics:
```text
80/tcp
443/tcp
```
Però en algun moment del procés —probablement durant una aturada, reload fallit o recreació de configuració dApache/Certbot— Apache va deixar lliures aquests ports.
En aquell moment, un contenidor Caddy gestionat per Docker/containerd va ocupar `80` i `443`.
Això va provocar que Apache ja no pogués tornar a arrencar correctament.
## Símptoma observat
Apache fallava amb errors de tipus:
```text
Address already in use
could not bind to address 0.0.0.0:80
could not bind to address [::]:80
no listening sockets available
```
Inicialment semblava un problema dApache, de Certbot o del VirtualHost de PeerTube.
Però la comprovació dels ports va revelar que qui ocupava `80` i `443` era `caddy`:
```text
users:(("caddy",pid=...,fd=...))
```
## Diagnosi real
La comprovació amb `systemctl` va mostrar que no hi havia cap servei `caddy.service` instal·lat al sistema:
```bash
systemctl status caddy
```
retornava:
```text
Unit caddy.service could not be found.
```
Però larbre de processos mostrava:
```text
systemd
└── containerd-shim
└── caddy
```
Això confirmava que Caddy no era un servei del sistema, sinó un procés dins dun contenidor Docker.
Posteriorment, `docker ps` va revelar contenidors antics relacionats amb:
```text
caddy
pds
watchtower
snikket
snikket-proxy
snikket-portal
snikket-certs
```
## Causa profunda
La causa profunda era la coexistència no desitjada de dos mecanismes de publicació web al mateix host:
```text
Apache + Certbot
Docker/Caddy/Snikket
```
Tots dos volien fer servir els mateixos ports públics:
```text
80
443
```
Això és incompatible si no hi ha una decisió explícita sobre quin servei fa de frontal principal.
## Neteja realitzada
La incidència va servir per detectar i eliminar configuració residual antiga, no només sobrera sinó realment problemàtica.
Es va decidir eliminar el Docker residual del `Vhost`, incloent contenidors antics i restes de Snikket/Caddy/PDS/Watchtower.
Això va permetre recuperar el model net:
```text
Vhost = Apache + Certbot
PeerTube = VM separada amb Docker
```
## Sobre Certbot i la configuració reciclada
En recrear el desplegament de PeerTube es va reutilitzar un `.conf` anterior del VirtualHost.
A més, shavien eliminat certificats creats per Certbot, però havien quedat línies dins la configuració dApache que encara apuntaven a aquests certificats.
Aquest és un cas típic:
```apache
SSLCertificateFile /etc/letsencrypt/live/DOMINI/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/DOMINI/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
```
Si sesborra el certificat però queda el VirtualHost SSL apuntant-hi, Apache pot fallar en arrencar o recarregar.
Per tant, quan es purga un certificat de Certbot, cal revisar també:
```text
/etc/apache2/sites-available/
/etc/apache2/sites-enabled/
```
i comprovar que no quedin referències a certificats inexistents.
## Comprovacions útils
Per detectar referències antigues a certificats:
```bash
root@Vhost:~# grep -R "letsencrypt" /etc/apache2/sites-available /etc/apache2/sites-enabled
```
Per veure quins certificats coneix Certbot:
```bash
root@Vhost:~# certbot certificates
```
Per eliminar correctament un certificat:
```bash
root@Vhost:~# certbot delete --cert-name NOM_CERTIFICAT
```
Per validar Apache després de qualsevol canvi:
```bash
root@Vhost:~# apache2ctl configtest
```
Resultat esperat:
```text
Syntax OK
```
I després:
```bash
root@Vhost:~# systemctl reload apache2
```
## Estat final
Un cop eliminada la interferència del Docker antic i corregides les referències residuals de Certbot/Apache, el `Vhost` torna a funcionar correctament com a frontal Apache.
Larquitectura queda:
```text
Internet
|
| HTTPS 443
v
Apache + Certbot al CT Vhost
|
| HTTP intern
v
PeerTube VM
192.168.100.111:9000
```
I PeerTube queda publicat amb:
```text
TLS / certificat
ProxyPass
ProxyPassReverse
X-Forwarded-Proto
X-Forwarded-For
timeouts amplis
límit de pujada adequat
```
## Lliçó apresa
Abans de reutilitzar un host com a reverse proxy, cal comprovar si ja hi ha altres serveis ocupant o intentant ocupar `80/443`.
Comandes clau:
```bash
root@Vhost:~# ss -ltnp | grep -E ':80|:443'
```
```bash
root@Vhost:~# docker ps
```
```bash
root@Vhost:~# systemctl status apache2
```
```bash
root@Vhost:~# apache2ctl configtest
```
La incidència ha servit per deixar el servidor més net i evitar futures interferències entre serveis antics i el nou desplegament PeerTube.
# Entendre Certbot, Apache i el fitxer `-le-ssl.conf`
## 1. Què passa quan tens un `.cat.conf`
Suposem que tens aquest fitxer:
```text
/etc/apache2/sites-available/vm.domini.cat.conf
```
Amb un VirtualHost HTTP:
```apache
<VirtualHost *:80>
ServerName vm.domini.cat
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://192.168.100.111:9000/
ProxyPassReverse / http://192.168.100.111:9000/
ErrorLog ${APACHE_LOG_DIR}/vm.domini.cat-error.log
CustomLog ${APACHE_LOG_DIR}/vm.domini.cat-access.log combined
</VirtualHost>
```
Quan executes:
```bash
root@Vhost:~# certbot --apache -d vm.domini.cat
```
Certbot fa diverses coses:
```text
1. Llegeix la configuració dApache.
2. Busca un VirtualHost que tingui ServerName vm.domini.cat.
3. Intenta validar el domini per HTTP, normalment pel port 80.
4. Demana el certificat a Lets Encrypt.
5. Escriu o modifica configuració Apache per activar SSL.
6. Recarrega Apache.
```
## 2. Per què apareix `-le-ssl.conf`
Quan Certbot troba un VirtualHost `*:80` però no troba un VirtualHost SSL equivalent, sovint crea un fitxer nou:
```text
/etc/apache2/sites-available/vm.domini.cat-le-ssl.conf
```
Aquest fitxer sol contenir el VirtualHost HTTPS:
```apache
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName vm.domini.cat
SSLCertificateFile /etc/letsencrypt/live/vm.domini.cat/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vm.domini.cat/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
```
Per tant, sí: el `-le-ssl.conf` **complementa** el `.conf` original.
Normalment queda així:
```text
vm.domini.cat.conf
→ VirtualHost *:80
vm.domini.cat-le-ssl.conf
→ VirtualHost *:443
```
## 3. Què passa si el `.conf` ja té `*:443`
Si el teu fitxer original ja conté això:
```apache
<VirtualHost *:80>
ServerName vm.domini.cat
...
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName vm.domini.cat
...
</VirtualHost>
</IfModule>
```
Certbot pot fer una de dues coses:
```text
1. Modificar el bloc *:443 existent.
2. Crear igualment un -le-ssl.conf si no sap encaixar bé la configuració.
```
Aquí és on poden començar els embolics.
Per exemple, pots acabar tenint **dos VirtualHosts per al mateix domini i port 443**:
```text
vm.domini.cat.conf
→ <VirtualHost *:443>
→ ServerName vm.domini.cat
vm.domini.cat-le-ssl.conf
→ <VirtualHost *:443>
→ ServerName vm.domini.cat
```
Això no sempre fa petar Apache, però pot fer que Apache triï un VirtualHost que no és el que esperaves.
## 4. La línia `Include /etc/letsencrypt/options-ssl-apache.conf`
Aquesta línia:
```apache
Include /etc/letsencrypt/options-ssl-apache.conf
```
inclou paràmetres SSL recomanats per Certbot.
Normalment defineix coses com:
```text
protocols TLS
ciphers
opcions SSL
headers relacionats amb SSL
```
Però no és el certificat en si.
Les línies realment vinculades al certificat són aquestes:
```apache
SSLCertificateFile /etc/letsencrypt/live/vm.domini.cat/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vm.domini.cat/privkey.pem
```
Si aquestes apunten a fitxers inexistents, Apache falla.
## 5. Què vol dir “línia vídua”
En el teu cas, la línia vídua era:
```apache
Include /etc/letsencrypt/options-ssl-apache.conf
```
Això vol dir que havia quedat una resta de configuració Certbot dins dun VirtualHost reciclat.
Per si sola pot no ser fatal, però indica que aquell fitxer havia estat tractat com a VirtualHost SSL.
La situació perillosa és aquesta:
```apache
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName vm.domini.cat
ProxyPass / http://192.168.100.111:9000/
ProxyPassReverse / http://192.168.100.111:9000/
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
```
Aquí falta el certificat:
```apache
SSLCertificateFile ...
SSLCertificateKeyFile ...
```
O bé hi són, però apunten a un certificat esborrat.
## 6. Com mirar què veu Apache realment
La comanda clau és:
```bash
root@Vhost:~# apache2ctl -S
```
Això et diu:
```text
quins VirtualHosts hi ha
quin fitxer els defineix
quin és el default de cada port
si tens duplicats
```
Per exemple:
```text
*:80 vm.domini.cat (/etc/apache2/sites-enabled/vm.domini.cat.conf:1)
*:443 vm.domini.cat (/etc/apache2/sites-enabled/vm.domini.cat-le-ssl.conf:2)
```
Això seria correcte.
Però si veus:
```text
*:443 vm.domini.cat (/etc/apache2/sites-enabled/vm.domini.cat.conf:20)
*:443 vm.domini.cat (/etc/apache2/sites-enabled/vm.domini.cat-le-ssl.conf:2)
```
aleshores tens duplicació de VirtualHost SSL.
## 7. Model net recomanat
Per entendre-ho i evitar embolics, jo faria servir aquest model:
```text
Fitxer principal:
/etc/apache2/sites-available/vm.domini.cat.conf
Conté:
VirtualHost *:80
VirtualHost *:443
No faig servir:
vm.domini.cat-le-ssl.conf
O bé:
Fitxer principal:
vm.domini.cat.conf → només port 80
Fitxer Certbot:
vm.domini.cat-le-ssl.conf → només port 443
Però no barrejaria els dos models.
```
Per a documentació i control manual, jo prefereixo tenir-ho tot en un únic fitxer:
```text
/etc/apache2/sites-available/vm.domini.cat.conf
```
i desactivar/eliminar el `-le-ssl.conf` si ja no el vols:
```bash
root@Vhost:~# a2dissite vm.domini.cat-le-ssl.conf
```
Després:
```bash
root@Vhost:~# apache2ctl configtest
root@Vhost:~# systemctl reload apache2
```
## 8. El socket: què està passant realment
Quan diem:
```apache
ProxyPass / http://192.168.100.111:9000/
```
Apache fa de client HTTP contra PeerTube.
Lesquema real és:
```text
navegador
|
| HTTPS
| port 443
v
Apache al Vhost
|
| HTTP intern
| socket TCP cap a 192.168.100.111:9000
v
PeerTube
```
No hi ha cap “volum” de disc compartit entre proxy i VM.
El que hi ha és una **passarel·la TCP/HTTP**.
Apache rep la petició HTTPS, la desxifra, i obre una connexió HTTP interna cap a:
```text
192.168.100.111:9000
```
Això és el socket:
```text
IP origen: CT Vhost
IP destí: 192.168.100.111
Port destí: 9000
Protocol: TCP
Aplicació: HTTP
```
## 9. ProxyPass i ProxyPassReverse
Això:
```apache
ProxyPass / http://192.168.100.111:9000/
```
vol dir:
```text
tot el que arribi a https://vm.domini.cat/
envia-ho internament a http://192.168.100.111:9000/
```
Això:
```apache
ProxyPassReverse / http://192.168.100.111:9000/
```
serveix perquè si el backend respon amb capçaleres de redirecció, Apache les corregeixi.
Exemple:
```text
Backend diu:
Location: http://192.168.100.111:9000/login
Apache ho transforma en:
Location: https://vm.domini.cat/login
```
Això evita que lusuari vegi URLs internes.
## 10. X-Forwarded-Proto
Aquesta és crítica:
```apache
RequestHeader set X-Forwarded-Proto "https"
```
PeerTube per dins rep HTTP, perquè Apache li parla per:
```text
http://192.168.100.111:9000
```
Però lusuari real està entrant per:
```text
https://vm.domini.cat
```
Per tant, Apache ha davisar PeerTube:
```text
ei, encara que jo testic parlant per HTTP intern,
la connexió pública original era HTTPS
```
Això és `X-Forwarded-Proto`.
Si això no està bé, PeerTube pot generar URLs malament:
```text
http://vm.domini.cat
```
en comptes de:
```text
https://vm.domini.cat
```
## 11. X-Forwarded-For
Aquesta capçalera diu a PeerTube quina era la IP real del client.
Sense això, PeerTube només veuria com a client la IP del proxy Apache.
Amb:
```apache
RequestHeader append X-Forwarded-For "%{REMOTE_ADDR}s"
```
o amb configuració equivalent, PeerTube pot saber millor don venen les peticions.
També és habitual:
```apache
RequestHeader set X-Real-IP "%{REMOTE_ADDR}s"
```
## 12. Timeouts
Aquests paràmetres:
```apache
ProxyTimeout 600
Timeout 600
```
volen dir que Apache esperarà més temps abans de tallar connexions lentes o llargues.
A PeerTube això té sentit perquè hi ha operacions lentes:
```text
pujada de vídeos grans
processament
importacions
connexions llargues
respostes lentes del backend
```
Si el timeout és massa curt, pots veure errors tipus:
```text
504 Gateway Timeout
proxy timeout
connection reset
```
Valors raonables:
```apache
ProxyTimeout 600
Timeout 600
```
Per pujades molt grosses o línies lentes:
```apache
ProxyTimeout 1800
Timeout 1800
```
## 13. Límit de mida de pujada
Això:
```apache
LimitRequestBody 0
```
vol dir:
```text
Apache no imposa límit de mida al cos de la petició
```
És important perquè una pujada de vídeo pot ser gran.
Sense això, Apache pot tallar abans que PeerTube rebi el fitxer.
Ara bé: això només elimina el límit dApache. PeerTube, Node, Docker, disc i configuració interna també poden tenir altres límits.
## 14. WebSocket
WebSocket és una connexió HTTP que fa un “upgrade” a una connexió persistent.
Apache necessita el mòdul:
```bash
root@Vhost:~# a2enmod proxy_wstunnel
```
I es pot configurar així:
```apache
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule /(.*) ws://192.168.100.111:9000/$1 [P,L]
```
Això diu:
```text
si la petició demana WebSocket,
envia-la al backend com a ws://
```
Però no sempre cal posar-ho si laplicació funciona bé només amb HTTP proxy normal. Jo ho deixaria si volem una configuració robusta.
## 15. Configuració Apache neta i comprensible
Un model net seria aquest:
```apache
<VirtualHost *:80>
ServerName vm.domini.cat
RewriteEngine On
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
ErrorLog ${APACHE_LOG_DIR}/vm.domini.cat-error.log
CustomLog ${APACHE_LOG_DIR}/vm.domini.cat-access.log combined
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName vm.domini.cat
Protocols h2 http/1.1
ProxyPreserveHost On
ProxyRequests Off
LimitRequestBody 0
ProxyTimeout 600
Timeout 600
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
RequestHeader append X-Forwarded-For "%{REMOTE_ADDR}s"
RequestHeader set X-Real-IP "%{REMOTE_ADDR}s"
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule /(.*) ws://192.168.100.111:9000/$1 [P,L]
ProxyPass / http://192.168.100.111:9000/ retry=0 timeout=600
ProxyPassReverse / http://192.168.100.111:9000/
ErrorLog ${APACHE_LOG_DIR}/vm.domini.cat-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/vm.domini.cat-ssl-access.log combined
SSLCertificateFile /etc/letsencrypt/live/vm.domini.cat/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vm.domini.cat/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
```
## 16. Ordre mental correcta
Jo ho pensaria així:
```text
1. El VirtualHost *:80 existeix perquè Lets Encrypt pugui validar i perquè puguem redirigir a HTTPS.
2. El VirtualHost *:443 existeix perquè és el servei real publicat.
3. Certbot pot crear el *:443 automàticament en un fitxer -le-ssl.conf.
4. Si volem control manual, podem consolidar-ho tot en un únic .conf.
5. Les línies SSLCertificateFile i SSLCertificateKeyFile són les que lliguen Apache amb el certificat.
6. La línia Include options-ssl-apache.conf només carrega opcions SSL recomanades.
7. ProxyPass és el túnel HTTP cap a PeerTube.
8. ProxyPassReverse arregla redireccions internes.
9. X-Forwarded-Proto informa PeerTube que lusuari venia per HTTPS.
10. Timeout i LimitRequestBody eviten que Apache talli pujades grosses o connexions lentes.
```
## 17. Comandes de control
Per veure si hi ha certificats:
```bash
root@Vhost:~# certbot certificates
```
Per veure si Apache té duplicats:
```bash
root@Vhost:~# apache2ctl -S
```
Per veure referències a Lets Encrypt:
```bash
root@Vhost:~# grep -R "letsencrypt" /etc/apache2/sites-available /etc/apache2/sites-enabled
```
Per validar abans de recarregar:
```bash
root@Vhost:~# apache2ctl configtest
```
Per veure qui ocupa ports:
```bash
root@Vhost:~# ss -ltnp | grep -E ':80|:443'
```
## 18. Conclusió curta
La teva idea és correcta:
```text
Certbot crea el -le-ssl.conf segons el que troba al .conf original.
```
Si troba només `*:80`, crea el complement `*:443`.
Si ja troba `*:443`, pot modificar-lo o embolicar-se segons com estigui estructurat.
Per això, en servidors que reutilitzem sovint, és molt important mirar:
```bash
apache2ctl -S
```
i netejar línies velles de:
```apache
SSLCertificateFile
SSLCertificateKeyFile
Include /etc/letsencrypt/options-ssl-apache.conf
```
quan reciclem VirtualHosts. [queda tallat !!!]
t'ho acabo jo: quan reciclem hi ha perill
# Consolidació del VirtualHost Apache de PeerTube en un únic `.conf`
## 1. Objectiu
Volem passar dun esquema generat/fragmentat per Certbot:
```text
vm.domini.cat.conf
→ VirtualHost *:80
vm.domini.cat-le-ssl.conf
→ VirtualHost *:443 generat per Certbot
```
a un esquema més net i controlat manualment:
```text
vm.domini.cat.conf
├── VirtualHost *:80
└── VirtualHost *:443
```
És a dir: un únic fitxer Apache site que contingui tant la redirecció HTTP com el reverse proxy HTTPS cap a PeerTube.
Larquitectura final queda:
```text
Internet
|
| HTTPS 443
v
Apache al CT Vhost
|
| HTTP intern
v
PeerTube VM
192.168.100.111:9000
```
---
## 2. Context de la incidència
Durant la recreació del desplegament de PeerTube es va reutilitzar un VirtualHost anterior.
La configuració reciclada contenia restes de configuració de Certbot, especialment línies com:
```apache
Include /etc/letsencrypt/options-ssl-apache.conf
```
i, en alguns casos, referències a certificats:
```apache
SSLCertificateFile /etc/letsencrypt/live/vm.domini.cat/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vm.domini.cat/privkey.pem
```
El problema no era només sintàctic.
En aquest cas:
```bash
root@Vhost:~# apache2ctl configtest
```
podia no petar clarament.
Però en el moment del `reload` o del `start`, Apache podia intentar aixecar un VirtualHost SSL incomplet, sense certificat coherent o amb referències residuals.
Això deixava Apache en un estat fallit.
En quedar lliures temporalment els ports:
```text
80
443
```
un contenidor Caddy antic, procedent dun stack Docker/Snikket abandonat, va ocupar-los.
Per això lerror final semblava un problema dApache o Certbot, però en realitat era una combinació de:
```text
VirtualHost SSL reciclat/inconsistent
+
certificats Certbot esborrats o referències vídues
+
Docker antic amb Caddy ocupant 80/443
```
---
## 3. Què fa Certbot habitualment
Quan tenim un fitxer Apache inicial com aquest:
```text
/etc/apache2/sites-available/vm.domini.cat.conf
```
amb un bloc HTTP:
```apache
<VirtualHost *:80>
ServerName vm.domini.cat
...
</VirtualHost>
```
i executem:
```bash
root@Vhost:~# certbot --apache -d vm.domini.cat
```
Certbot busca un VirtualHost que coincideixi amb:
```apache
ServerName vm.domini.cat
```
Si troba un bloc `*:80`, però no troba un bloc SSL clar, normalment crea un fitxer nou:
```text
/etc/apache2/sites-available/vm.domini.cat-le-ssl.conf
```
Aquest fitxer conté el VirtualHost HTTPS:
```apache
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName vm.domini.cat
SSLCertificateFile /etc/letsencrypt/live/vm.domini.cat/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vm.domini.cat/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
```
Això vol dir que, per defecte, Certbot pot deixar lestructura així:
```text
vm.domini.cat.conf
→ port 80
vm.domini.cat-le-ssl.conf
→ port 443
```
Això és funcional, però pot ser més incòmode de mantenir quan estem reciclant VirtualHosts o fent desplegaments de prova.
---
## 4. Model que volem deixar
Volem deixar un únic fitxer:
```text
/etc/apache2/sites-available/vm.domini.cat.conf
```
amb aquesta estructura:
```apache
<VirtualHost *:80>
...
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
...
</VirtualHost>
</IfModule>
```
El bloc `*:80` només redirigeix a HTTPS.
El bloc `*:443` és el reverse proxy real cap a PeerTube.
---
## 5. Configuració Apache consolidada
Fitxer:
```text
/etc/apache2/sites-available/vm.domini.cat.conf
```
Contingut recomanat:
```apache
<VirtualHost *:80>
ServerAdmin xab
ServerName vm.domini.cat
ServerAlias www.vm.domini.cat
RewriteEngine On
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
ErrorLog ${APACHE_LOG_DIR}/peertubeVM_80_error.log
CustomLog ${APACHE_LOG_DIR}/peertubeVM_80_access.log combined
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin xab
ServerName vm.domini.cat
ServerAlias www.vm.domini.cat
Protocols h2 http/1.1
# Uploads sense límit imposat per Apache
LimitRequestBody 0
# Timeouts llargs per pujades, importacions i connexions lentes
ProxyTimeout 600
Timeout 600
# Reverse proxy
ProxyPreserveHost On
ProxyRequests Off
# Capçaleres perquè PeerTube entengui la connexió pública real
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
RequestHeader set X-Forwarded-Host "%{HTTP_HOST}s"
RequestHeader append X-Forwarded-For "%{REMOTE_ADDR}s"
RequestHeader set X-Real-IP "%{REMOTE_ADDR}s"
# WebSocket, només si PeerTube o alguna funció ho necessita
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule /(.*) ws://192.168.100.111:9000/$1 [P,L]
# Proxy principal cap a PeerTube
ProxyPass / http://192.168.100.111:9000/ retry=0 timeout=600
ProxyPassReverse / http://192.168.100.111:9000/
# Logs
ErrorLog ${APACHE_LOG_DIR}/peertubeVM_443_error.log
CustomLog ${APACHE_LOG_DIR}/peertubeVM_443_access.log combined
# SSL configuration
SSLCertificateFile /etc/letsencrypt/live/vm.domini.cat/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vm.domini.cat/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
```
---
## 6. Correccions aplicades respecte al bloc inicial
### 6.1. Eliminar `ProxyPass` duplicat
No convé tenir això dues vegades:
```apache
ProxyPass / http://192.168.100.111:9000/ retry=0 timeout=600
ProxyPassReverse / http://192.168.100.111:9000/
ProxyPass / http://192.168.100.111:9000/
ProxyPassReverse / http://192.168.100.111:9000/
```
Deixem només:
```apache
ProxyPass / http://192.168.100.111:9000/ retry=0 timeout=600
ProxyPassReverse / http://192.168.100.111:9000/
```
Així Apache té una sola regla clara per passar-ho tot cap a PeerTube.
---
### 6.2. Corregir `X-Forwarded-Host`
No deixem aquesta línia buida:
```apache
RequestHeader set X-Forwarded-Host ""
```
Això pot confondre el backend.
Millor:
```apache
RequestHeader set X-Forwarded-Host "%{HTTP_HOST}s"
```
O, en alguns escenaris, simplement es podria eliminar perquè:
```apache
ProxyPreserveHost On
```
ja conserva la capçalera `Host`.
Però si volem deixar-ho explícit:
```apache
RequestHeader set X-Forwarded-Host "%{HTTP_HOST}s"
```
és més clar.
---
### 6.3. Separar logs de port 80 i port 443
És útil tenir logs separats:
```apache
ErrorLog ${APACHE_LOG_DIR}/peertubeVM_80_error.log
CustomLog ${APACHE_LOG_DIR}/peertubeVM_80_access.log combined
```
i:
```apache
ErrorLog ${APACHE_LOG_DIR}/peertubeVM_443_error.log
CustomLog ${APACHE_LOG_DIR}/peertubeVM_443_access.log combined
```
Això ajuda a distingir:
```text
errors de redirecció HTTP
errors del reverse proxy HTTPS
problemes de certificat
problemes de backend PeerTube
```
---
## 7. Desmuntar el sistema de dos fitxers
Primer mirem què veu Apache:
```bash
root@Vhost:~# apache2ctl -S
```
Ens interessa detectar si hi ha dos fitxers actius per al mateix domini:
```text
vm.domini.cat.conf
vm.domini.cat-le-ssl.conf
```
Si volem consolidar-ho tot en un únic fitxer, desactivem el fitxer `-le-ssl.conf`:
```bash
root@Vhost:~# a2dissite vm.domini.cat-le-ssl.conf
```
Ens assegurem que el fitxer principal està actiu:
```bash
root@Vhost:~# a2ensite vm.domini.cat.conf
```
Activem els mòduls necessaris:
```bash
root@Vhost:~# a2enmod proxy proxy_http proxy_wstunnel headers ssl rewrite http2
```
Validem configuració:
```bash
root@Vhost:~# apache2ctl configtest
```
Resultat esperat:
```text
Syntax OK
```
Recarreguem Apache:
```bash
root@Vhost:~# systemctl reload apache2
```
---
## 8. Comprovar que no queda duplicació
Després del canvi:
```bash
root@Vhost:~# apache2ctl -S
```
El resultat bo hauria de ser semblant a:
```text
*:80 vm.domini.cat (/etc/apache2/sites-enabled/vm.domini.cat.conf:1)
*:443 vm.domini.cat (/etc/apache2/sites-enabled/vm.domini.cat.conf:13)
```
No hauria daparèixer:
```text
vm.domini.cat-le-ssl.conf
```
Si apareix, encara està activat o hi ha un enllaç dins:
```text
/etc/apache2/sites-enabled/
```
Es pot revisar amb:
```bash
root@Vhost:~# ls -l /etc/apache2/sites-enabled/
```
---
## 9. Buscar restes de Certbot o certificats antics
Per veure referències a Lets Encrypt dins els sites actius:
```bash
root@Vhost:~# grep -R "letsencrypt" /etc/apache2/sites-enabled/
```
Per veure referències a certificats:
```bash
root@Vhost:~# grep -R "SSLCertificate" /etc/apache2/sites-enabled/
```
Per veure qualsevol referència al domini:
```bash
root@Vhost:~# grep -R "vm.domini.cat" /etc/apache2/sites-enabled/
```
També és útil mirar tant `sites-available` com `sites-enabled`:
```bash
root@Vhost:~# grep -R "vm.domini.cat\|letsencrypt\|SSLCertificate" /etc/apache2/sites-available /etc/apache2/sites-enabled
```
---
## 10. Comprovar certificats existents
Certbot pot tenir o no tenir el certificat registrat.
Comprovem:
```bash
root@Vhost:~# certbot certificates
```
Si el certificat existeix, hauríem de veure alguna cosa semblant a:
```text
Certificate Name: vm.domini.cat
Domains: vm.domini.cat
Expiry Date: ...
Certificate Path: /etc/letsencrypt/live/vm.domini.cat/fullchain.pem
Private Key Path: /etc/letsencrypt/live/vm.domini.cat/privkey.pem
```
Aquests camins han de coincidir amb el VirtualHost:
```apache
SSLCertificateFile /etc/letsencrypt/live/vm.domini.cat/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vm.domini.cat/privkey.pem
```
Si els fitxers no existeixen, Apache no podrà aixecar correctament el VirtualHost SSL.
Comprovació directa:
```bash
root@Vhost:~# ls -l /etc/letsencrypt/live/vm.domini.cat/
```
---
## 11. Si cal recrear el certificat
Si el certificat havia estat esborrat, primer podem deixar només el bloc `*:80` actiu o assegurar que el bloc `*:443` no apunta a certificats inexistents.
La via neta és:
```bash
root@Vhost:~# certbot --apache -d vm.domini.cat
```
Però si vols mantenir el model dun únic fitxer, després revisa si Certbot tha tornat a crear:
```text
vm.domini.cat-le-ssl.conf
```
Si lha creat, pots tornar a consolidar:
```bash
root@Vhost:~# apache2ctl -S
root@Vhost:~# a2dissite vm.domini.cat-le-ssl.conf
root@Vhost:~# nano /etc/apache2/sites-available/vm.domini.cat.conf
root@Vhost:~# apache2ctl configtest
root@Vhost:~# systemctl reload apache2
```
També es pot fer amb `certonly` si prefereixes que Certbot només generi certificat i no toqui Apache:
```bash
root@Vhost:~# certbot certonly --apache -d vm.domini.cat
```
Després poses manualment les línies:
```apache
SSLCertificateFile /etc/letsencrypt/live/vm.domini.cat/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vm.domini.cat/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
```
al teu VirtualHost `*:443`.
---
## 12. Explicació de `ProxyPass`
Aquesta línia:
```apache
ProxyPass / http://192.168.100.111:9000/ retry=0 timeout=600
```
diu a Apache:
```text
tot el que arribi a https://vm.domini.cat/
envia-ho internament a http://192.168.100.111:9000/
```
És una passarel·la HTTP.
No comparteix fitxers ni volums.
Apache rep una petició HTTPS pública, la desxifra i fa una nova petició HTTP interna cap a la VM PeerTube.
---
## 13. Explicació de `ProxyPassReverse`
Aquesta línia:
```apache
ProxyPassReverse / http://192.168.100.111:9000/
```
serveix per corregir redireccions del backend.
Per exemple, si PeerTube respongués:
```text
Location: http://192.168.100.111:9000/login
```
Apache pot transformar-ho en:
```text
Location: https://vm.domini.cat/login
```
Això evita que lusuari vegi o sigui enviat cap a la IP interna.
---
## 14. Explicació de les capçaleres `X-Forwarded-*`
PeerTube rep trànsit intern per HTTP:
```text
http://192.168.100.111:9000
```
Però lusuari real entra per HTTPS:
```text
https://vm.domini.cat
```
Per això Apache ha dinformar PeerTube de la situació real.
### `X-Forwarded-Proto`
```apache
RequestHeader set X-Forwarded-Proto "https"
```
Indica que el protocol públic original era HTTPS.
Això evita que PeerTube generi URLs amb `http://`.
---
### `X-Forwarded-Port`
```apache
RequestHeader set X-Forwarded-Port "443"
```
Indica que el port públic era el 443.
---
### `X-Forwarded-Host`
```apache
RequestHeader set X-Forwarded-Host "%{HTTP_HOST}s"
```
Indica quin host havia demanat el client.
Per exemple:
```text
vm.domini.cat
```
---
### `X-Forwarded-For`
```apache
RequestHeader append X-Forwarded-For "%{REMOTE_ADDR}s"
```
Afegeix la IP del client original.
Sense això, PeerTube veuria sobretot la IP del proxy Apache.
---
### `X-Real-IP`
```apache
RequestHeader set X-Real-IP "%{REMOTE_ADDR}s"
```
Una altra manera habitual dindicar la IP real del client.
---
## 15. Explicació dels timeouts
Aquestes línies:
```apache
ProxyTimeout 600
Timeout 600
```
donen més marge a Apache per esperar respostes del backend.
PeerTube pot tenir operacions llargues:
```text
pujada de vídeos
importació remota
transcodificació
respostes lentes
connexions persistents
```
Amb timeouts massa curts poden aparèixer errors:
```text
504 Gateway Timeout
proxy timeout
connection reset
```
Un valor de 600 segons és raonable.
Si hi ha pujades molt lentes o fitxers molt grans, es podria ampliar:
```apache
ProxyTimeout 1800
Timeout 1800
```
---
## 16. Explicació de `LimitRequestBody`
Aquesta línia:
```apache
LimitRequestBody 0
```
vol dir:
```text
Apache no imposa un límit propi a la mida del cos de la petició.
```
Això és important per pujar vídeos grans.
Ara bé: això només elimina el límit dApache. Encara poden existir altres límits en:
```text
PeerTube
Node.js
Docker
disc
NFS
configuració interna de la instància
```
---
## 17. Explicació de WebSocket
Aquest bloc:
```apache
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule /(.*) ws://192.168.100.111:9000/$1 [P,L]
```
detecta peticions que demanen WebSocket.
WebSocket comença com una petició HTTP normal, però demana un canvi de protocol amb:
```text
Upgrade: websocket
Connection: upgrade
```
Quan Apache detecta això, envia la connexió al backend amb:
```text
ws://192.168.100.111:9000/
```
Per això cal el mòdul:
```bash
root@Vhost:~# a2enmod proxy_wstunnel
```
Si PeerTube funciona bé sense aquest bloc, podria no ser necessari. Però deixar-lo configurat és una opció robusta.
---
## 18. Relació amb el `.env` de PeerTube
A la VM PeerTube, el fitxer:
```text
/opt/peertube/.env
```
ha de ser coherent amb el domini públic.
Valors importants:
```env
PEERTUBE_WEBSERVER_HOSTNAME=vm.domini.cat
PEERTUBE_WEBSERVER_PORT=443
PEERTUBE_WEBSERVER_HTTPS=true
```
També cal que PeerTube confiï en el proxy Apache.
Si el CT `Vhost` té, per exemple, la IP:
```text
192.168.100.104
```
llavors:
```env
PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "172.18.0.0/16", "192.168.100.104"]
```
Després de canviar `.env`:
```bash
root@peer-tube:/opt/peertube# docker compose down
root@peer-tube:/opt/peertube# docker compose up -d
```
O bé:
```bash
root@peer-tube:/opt/peertube# docker compose restart peertube
```
---
## 19. Proves del backend PeerTube
Des del CT `Vhost`:
```bash
root@Vhost:~# curl -I http://192.168.100.111:9000
```
Resultat esperat:
```text
HTTP/1.1 200 OK
x-powered-by: PeerTube
```
Això confirma que Apache pot arribar al backend.
---
## 20. Proves del domini públic
Prova HTTP:
```bash
root@Vhost:~# curl -I http://vm.domini.cat
```
Resultat esperat:
```text
HTTP/1.1 301 Moved Permanently
Location: https://vm.domini.cat/
```
Prova HTTPS:
```bash
root@Vhost:~# curl -I https://vm.domini.cat
```
Resultat esperat:
```text
HTTP/2 200
```
o:
```text
HTTP/1.1 200 OK
```
i idealment alguna capçalera com:
```text
x-powered-by: PeerTube
```
---
## 21. Comprovació de ports
```bash
root@Vhost:~# ss -ltnp | grep -E ':80|:443'
```
Resultat esperat:
```text
apache2
```
No hauria de sortir:
```text
caddy
docker-proxy
nginx
```
---
## 22. Logs útils
Logs Apache del port 80:
```bash
root@Vhost:~# tail -f /var/log/apache2/peertubeVM_80_error.log
```
```bash
root@Vhost:~# tail -f /var/log/apache2/peertubeVM_80_access.log
```
Logs Apache del port 443:
```bash
root@Vhost:~# tail -f /var/log/apache2/peertubeVM_443_error.log
```
```bash
root@Vhost:~# tail -f /var/log/apache2/peertubeVM_443_access.log
```
Logs PeerTube:
```bash
root@peer-tube:/opt/peertube# docker compose logs -f peertube
```
---
## 23. Renovació del certificat
Comprovem timers de Certbot:
```bash
root@Vhost:~# systemctl list-timers | grep certbot
```
Prova de renovació:
```bash
root@Vhost:~# certbot renew --dry-run
```
Si tot està bé, Certbot renovarà el certificat quan pertoqui.
Important: encara que consolidem el VirtualHost en un únic fitxer, Certbot pot renovar igualment perquè els certificats continuen vivint a:
```text
/etc/letsencrypt/live/vm.domini.cat/
```
El que cal evitar és que Certbot torni a generar o activar un `-le-ssl.conf` duplicat sense adonar-nos-en.
---
## 24. Checklist final
```bash
root@Vhost:~# apache2ctl -S
```
Ha de mostrar només:
```text
*:80 vm.domini.cat (...vm.domini.cat.conf...)
*:443 vm.domini.cat (...vm.domini.cat.conf...)
```
Validació:
```bash
root@Vhost:~# apache2ctl configtest
```
Resultat:
```text
Syntax OK
```
Ports:
```bash
root@Vhost:~# ss -ltnp | grep -E ':80|:443'
```
Ha de sortir:
```text
apache2
```
Certificat:
```bash
root@Vhost:~# certbot certificates
```
Ha dexistir:
```text
vm.domini.cat
```
Backend:
```bash
root@Vhost:~# curl -I http://192.168.100.111:9000
```
Domini públic:
```bash
root@Vhost:~# curl -I https://vm.domini.cat
```
Docker antic:
```bash
root@Vhost:~# docker ps
```
Si Docker ja sha purgat, aquesta ordre pot no existir o no retornar res. El que importa és que no hi hagi cap `caddy` ocupant `80/443`.
---
## 25. Resum conceptual
El sistema queda així:
```text
Apache:
escolta a 80 i 443
gestiona TLS amb Certbot
redirigeix HTTP cap a HTTPS
fa reverse proxy cap a PeerTube
PeerTube:
escolta internament a 192.168.100.111:9000
sap que el domini públic és vm.domini.cat
sap que el públic entra per HTTPS
TrueNAS/NFS:
conté les dades grosses de vídeo
no participa en el reverse proxy
Docker antic del Vhost:
eliminat o aturat
ja no interfereix amb ports 80/443
```
El punt essencial és:
```text
Entre Apache i PeerTube no hi ha volums ni fitxers compartits.
Hi ha una connexió HTTP/TCP interna.
```
Els volums grossos són una altra capa:
```text
PeerTube VM → NFS → TrueNAS
```
El Vhost només fa de passarel·la web pública.
# NEXT — Afinament post-desplegament PeerTube
## 0. Estat actual
Tenim operativa aquesta arquitectura:
```text
Internet
|
| HTTPS 443
v
Apache + Certbot al CT Vhost
|
| HTTP intern
v
PeerTube VM
192.168.100.111:9000
|
| NFS
v
TrueNAS
/mnt/AV/VM/peertube
```
El `Vhost` ja funciona i publica la nova instància PeerTube.
Ara toca afinar:
```text
1. UID/GID i propietat dels fitxers al TrueNAS
2. SMTP i correu sortint dels contenidors PeerTube
3. Federació / migració / clonació de contingut entre instàncies PeerTube
4. Importació de contingut de YouTube amb yt-dlp / youtube-dl
5. Repàs del full de ruta de desplegament
```
---
# 1. Propietat UID/GID al TrueNAS
## Objectiu
Garantir que PeerTube pot escriure correctament al dataset NFS del TrueNAS:
```text
/mnt/AV/VM/peertube
```
i especialment a:
```text
/mnt/AV/VM/peertube/data
```
A la VM PeerTube aquest dataset entra com:
```text
/mnt/truenas-peertube
```
i després PeerTube lusa mitjançant:
```text
/opt/peertube/docker-volume/data -> /mnt/truenas-peertube/data
```
## Problema típic
PeerTube dins Docker no necessàriament escriu com a `root`.
Pot escriure amb un UID/GID concret dins del contenidor.
Per tant, encara que al TrueNAS sembli que `root` pot escriure, pot passar que el contenidor PeerTube tingui problemes si el UID real que escriu no té permisos.
## Comprovacions
A la VM PeerTube:
```bash
root@peer-tube:~# ls -lna /mnt/truenas-peertube
root@peer-tube:~# ls -lna /mnt/truenas-peertube/data
root@peer-tube:~# ls -lna /opt/peertube/docker-volume
```
Prova descriptura des del host VM:
```bash
root@peer-tube:~# touch /mnt/truenas-peertube/data/prova-root-vm.txt
```
Prova descriptura des del contenidor PeerTube:
```bash
root@peer-tube:/opt/peertube# docker compose exec peertube sh
```
Dins del contenidor:
```bash
id
touch /data/prova-des-del-contenidor.txt
ls -lna /data
exit
```
Això ens dirà amb quin UID/GID escriu realment PeerTube.
## Acció probable
Quan sapiguem el UID/GID real, al TrueNAS podem ajustar propietat:
```bash
root@truenas:~# chown -R UID:GID /mnt/AV/VM/peertube/data
```
o bé, si volem una solució més permissiva de laboratori:
```bash
root@truenas:~# chmod -R 775 /mnt/AV/VM/peertube
```
Però la solució bona és identificar UID/GID i deixar-ho coherent.
---
# 2. SMTP entre contenidors i `.env`
## Objectiu
Que PeerTube pugui enviar correus:
```text
registre dusuaris
recuperació de contrasenya
notificacions
moderació
confirmacions
```
## Elements implicats
Al `.env` de PeerTube hi ha variables SMTP.
Hem de decidir si PeerTube enviarà correu via:
```text
1. contenidor postfix inclòs al docker-compose
2. SMTP extern real
3. SMTP propi del domini
4. relay SMTP dun proveïdor
```
## Recomanació
Per una instància realista, jo no confiaria massa en un Postfix intern si el domini públic ha dentregar correu bé.
Millor usar SMTP extern autenticat.
Exemple conceptual:
```env
PEERTUBE_SMTP_HOSTNAME=smtp.domini.cat
PEERTUBE_SMTP_PORT=587
PEERTUBE_SMTP_USERNAME=usuari@domini.cat
PEERTUBE_SMTP_PASSWORD=PASSWORD
PEERTUBE_SMTP_TLS=true
PEERTUBE_SMTP_DISABLE_STARTTLS=false
PEERTUBE_SMTP_FROM=noreply@domini.cat
```
Cal revisar els noms exactes segons el `.env` oficial que tens descarregat.
## Comprovacions
A la VM PeerTube:
```bash
root@peer-tube:/opt/peertube# grep -i smtp .env
```
Logs després de modificar SMTP:
```bash
root@peer-tube:/opt/peertube# docker compose logs -f peertube
```
Reinici del servei:
```bash
root@peer-tube:/opt/peertube# docker compose restart peertube
```
## Prova funcional
Des de la interfície web:
```text
Administration → Configuration → Email / SMTP
```
o prova de registre / recuperació de contrasenya.
També podem mirar si el contenidor intenta connectar:
```bash
root@peer-tube:/opt/peertube# docker compose exec peertube sh
```
i dins:
```bash
nc -vz smtp.domini.cat 587
```
si `nc` existeix.
---
# 3. Federar / clonar / replicar entre instàncies PeerTube
Aquí cal separar conceptes perquè no són exactament el mateix.
## 3.1. Federar
Federar vol dir que dues instàncies PeerTube es veuen entre elles via ActivityPub.
Això permet:
```text
seguir canals remots
veure vídeos remots
interactuar entre instàncies
tenir visibilitat federada
```
Però federar no vol dir clonar tota una instància.
## 3.2. Importar / migrar contingut
Això és portar vídeos, metadades o canals duna instància antiga a una nova.
Pot requerir:
```text
exportació de base de dades
còpia de fitxers
ús deines internes de PeerTube
importació via URL
repujada de vídeos
```
## 3.3. Replicar
PeerTube té funcionalitats de redundància/replicació entre instàncies, però no equival exactament a “clonar tota la plataforma”.
La replicació pot servir per tenir còpies de vídeos duna altra instància, però cal configurar-ho bé.
## Objectiu pràctic nostre
Tenim una instància antiga en CT i una nova en VM.
Volem garantir que és possible:
```text
1. que la nova instància federi amb lantiga
2. que la nova pugui importar vídeos de lantiga
3. que, si cal, es pugui migrar contingut
4. que no perdem dades ni fitxers
```
## Comprovacions inicials
A la instància antiga:
```text
domini antic
estat
accés admin
volum de vídeos
versió PeerTube
```
A la nova:
```text
domini nou
estat admin
versió PeerTube
configuració federation enabled
```
A la nova instància cal comprovar:
```text
Administration → Configuration → Federation
```
i confirmar que la federació està activa.
## Proves mínimes
Des de la nova instància:
```text
buscar un canal remot de la instància antiga
seguir-lo
veure si apareixen vídeos
provar importació per URL dun vídeo públic antic
```
## Punt important
Si el que volem és “clonar” la instància antiga, no ho faria a cegues amb `rsync` de volums i base de dades si la versió, domini i ruta han canviat.
Caldria preparar un pla específic de migració:
```text
backup DB antiga
backup data antiga
compatibilitat de versions
restauració controlada
canvi de domini si aplica
regeneració de configuració
```
Però si el que volem és poblar la nova amb contingut seleccionat, és més segur usar importació/federació.
---
# 4. Connectar internament amb YouTube / yt-dlp
## Objectiu
Volem que els usuaris de PeerTube puguin “agregar contingut” de YouTube als seus perfils.
Això normalment vol dir permetre importació per URL externa.
PeerTube pot importar vídeos remots si té les eines corresponents disponibles dins del contenidor o en la imatge utilitzada.
## Punt tècnic
Actualment el món YouTube canvia sovint i `youtube-dl` queda obsolet ràpidament. El més habitual és usar:
```text
yt-dlp
```
Caldrà comprovar si la imatge PeerTube ja porta suport dimportació o si cal adaptar-ho.
## Comprovacions
A la interfície dadministració PeerTube:
```text
Administration → Configuration → Import
```
Cal buscar opcions com:
```text
enable video import
enable import via URL
allow users to import videos
```
A nivell contenidor:
```bash
root@peer-tube:/opt/peertube# docker compose exec peertube sh
```
Dins:
```bash
which youtube-dl
which yt-dlp
yt-dlp --version
youtube-dl --version
```
## Decisió
Hi ha dues formes:
```text
A. Usar el suport intern de PeerTube si ja funciona.
B. Crear una integració controlada amb yt-dlp externa.
```
Per seguretat i manteniment, primer provaria lopció A.
## Riscos
Permetre als usuaris importar contingut de YouTube implica:
```text
consum de disc
consum de CPU per transcodificació
riscos de copyright
contingut no desitjat
possibles bloquejos o fallades de YouTube
cookies si el vídeo requereix sessió
```
Per tant, convé controlar:
```text
qui pot importar
quota per usuari
límit de mida
límit de durada
moderació
```
---
# 5. Full de ruta de desplegament
## Fase 1 — Infraestructura base
Ja feta:
```text
VM Ubuntu PeerTube
Docker Compose
NFS TrueNAS
Apache Vhost
Certbot/TLS
reverse proxy funcional
```
## Fase 2 — Permisos i persistència
Pendent immediat:
```text
UID/GID real del contenidor PeerTube
propietat del dataset TrueNAS
prova descriptura des del contenidor
prova de pujada real de vídeo
verificació de thumbnails, previews, HLS i originals
```
## Fase 3 — Correu
Pendent:
```text
decidir SMTP final
configurar .env
reiniciar PeerTube
provar enviament
verificar logs
```
## Fase 4 — Federació i migració
Pendent:
```text
activar/verificar federació
provar seguiment entre instàncies
provar importació dun vídeo antic
definir si volem migració completa o només població selectiva
```
## Fase 5 — Importació YouTube
Pendent:
```text
comprovar yt-dlp/youtube-dl dins PeerTube
activar importació per URL
definir permisos dusuari
provar importació dun vídeo curt
revisar consum de disc i CPU
```
## Fase 6 — Hardening mínim
Pendent:
```text
firewall bàsic
només ports necessaris oberts
backups
rotació de logs
monitoratge despai NFS
actualitzacions controlades
```
## Fase 7 — Documentació final
Pendent:
```text
arquitectura
fitxers modificats
docker-compose.yml
.env anonimitzat
fstab NFS
Apache vhost
procediment de recuperació
procediment de migració
proves finals
```
---
# 6. Ordre recomanat de treball
Jo seguiria aquest ordre:
```text
1. UID/GID i permisos TrueNAS
2. SMTP
3. prova de pujada de vídeo pròpia
4. federació amb instància antiga
5. importació des de la instància antiga
6. importació YouTube / yt-dlp
7. backups i monitoratge
```
La raó és senzilla:
```text
sense permisos correctes → no podem confiar en pujades/importacions
sense SMTP → la plataforma queda coixa per a usuaris
sense proves de pujada → no sabem si NFS/PeerTube funciona del tot
sense això estable → no té sentit obrir importacions massives
```
---
# 7. Primer bloc de treball: UID/GID TrueNAS
Per començar el NEXT real, jo faria això.
A la VM PeerTube:
```bash
root@peer-tube:/opt/peertube# docker compose exec peertube id
```
També:
```bash
root@peer-tube:/opt/peertube# docker compose exec peertube sh -c 'id && touch /data/prova-des-del-contenidor.txt && ls -lna /data/prova-des-del-contenidor.txt'
```
Després al host VM:
```bash
root@peer-tube:/opt/peertube# ls -lna /mnt/truenas-peertube/data
```
I al TrueNAS:
```bash
root@truenas:~# ls -lna /mnt/AV/VM/peertube/data
```
Amb això sabrem:
```text
quin UID/GID escriu dins el contenidor
com apareix al NFS
si TrueNAS ho veu igual
si cal fer chown o ajustar ACL
```
---
# 8. Segon bloc: SMTP
A la VM PeerTube:
```bash
root@peer-tube:/opt/peertube# grep -i smtp .env
```
I després decidim si usem:
```text
SMTP extern autenticat
Postfix intern del compose
relay propi
```
La configuració SMTP és millor fer-la després dels permisos, perquè si PeerTube ja pot escriure bé i està estable, els errors que quedin seran només de correu.
---
# 9. Tercer bloc: federació i importació
Quan permisos i SMTP estiguin tancats:
```text
prova de pujada local
prova de visualització
prova dimportació remota
prova de federació amb la instància antiga
prova dimportació YouTube
```
No faria importacions grans fins haver validat una pujada petita i una importació curta.
---
# 10. NEXT immediat
El següent pas concret seria:
```bash
root@peer-tube:/opt/peertube# docker compose exec peertube id
root@peer-tube:/opt/peertube# docker compose exec peertube sh -c 'touch /data/prova-des-del-contenidor.txt && ls -lna /data/prova-des-del-contenidor.txt'
root@peer-tube:/opt/peertube# ls -lna /mnt/truenas-peertube/data
```
A partir daquesta sortida decidim el `chown` correcte al TrueNAS.
Els fitxers apareixen com `999:999` perquè laplicació PeerTube dins del contenidor Docker escriu les dades amb aquest UID/GID. NFS no tradueix aquests valors a “usuaris humans”, sinó que transporta els identificadors numèrics fins al TrueNAS. Per això al NAS poden aparèixer amb noms locals com `netdata` o `docker`, però la dada rellevant és el número `999:999`, visible amb `ls -lna`.
El 999 ja existeix com a UID/GID de sistema en diversos llocs, però no representa la mateixa “persona”. És només el mateix número. PeerTube/Docker lutilitza per les seves dades; NFS conserva el número; TrueNAS i Ubuntu li posen noms locals diferents.
# Refinament de permisos del dataset NFS de PeerTube
## 1. Situació inicial
Durant la instal·lació inicial de PeerTube es va crear al TrueNAS el directori de dades persistents:
```text
/mnt/AV/VM/peertube/data
```
Aquest directori es va crear manualment des del TrueNAS com a `root`, per tant inicialment tenia propietat:
```text
0:0
```
És a dir:
```text
UID 0 → root
GID 0 → root
```
En fase de laboratori es van aplicar permisos amplis:
```bash
chmod -R 775 /mnt/AV/VM/peertube
```
Això es va fer per garantir que la VM Ubuntu i els contenidors Docker de PeerTube poguessin escriure sobre el muntatge NFS sense quedar bloquejats per permisos abans de validar el funcionament general del servei.
Aquest `775` era una configuració provisional de desplegament, útil per arrencar i provar, però no és la configuració final més neta.
---
## 2. Circuit real de dades
El circuit de dades és aquest:
```text
TrueNAS
/mnt/AV/VM/peertube/data
|
| NFS
v
VM Ubuntu PeerTube
/mnt/truenas-peertube/data
|
| volum / bind mount Docker
v
Contenidor PeerTube
/data
```
El `Vhost` Apache no accedeix directament als fitxers del NAS.
Apache només fa de reverse proxy:
```text
Navegador
|
| HTTPS
v
Apache Vhost
|
| HTTP intern
v
PeerTube VM:9000
```
Qui llegeix i escriu els fitxers de vídeo, miniatures, HLS, imports i temporals és PeerTube dins del seu contenidor.
---
## 3. Per què apareix `999:999`
En inspeccionar `/data` dins del contenidor PeerTube es veu que lestructura de dades principal apareix com:
```text
999:999
```
Per exemple:
```text
drwxrwxr-x 23 999 999 data
drwxr-xr-x 3 999 999 tmp
drwxr-xr-x 3 999 999 uploads
drwxr-xr-x 6 999 999 cache
```
Això indica que la imatge Docker de PeerTube o el seu procés dinicialització prepara la carpeta de dades amb lUID/GID:
```text
UID 999
GID 999
```
Aquests números no són “noms dusuari universals”. Són identificadors numèrics.
NFS transporta aquests identificadors numèrics entre sistemes. Per això, quan PeerTube crea o modifica fitxers com `999:999`, el TrueNAS els desa amb aquests mateixos números.
---
## 4. Per què al TrueNAS pot aparèixer com `netdata:docker`
Cada sistema té la seva pròpia taula local dusuaris i grups:
```text
/etc/passwd
/etc/group
```
Per tant, el mateix número pot tenir noms diferents segons el sistema.
Per exemple:
```text
Dins del contenidor:
999:999 pot aparèixer com un usuari intern de laplicació o només com número.
A la VM Ubuntu:
999 pot correspondre a algun usuari o grup de sistema.
Al TrueNAS:
UID 999 pot aparèixer com netdata.
GID 999 pot aparèixer com docker.
```
Això no vol dir que `netdata` estigui executant PeerTube.
Vol dir que el TrueNAS veu el número `999` i el tradueix al nom local que ell té associat a aquest UID/GID.
Per evitar confusions, en aquest escenari sempre convé mirar els permisos en format numèric:
```bash
ls -lna
```
En comptes de:
```bash
ls -la
```
La dada fiable és:
```text
999:999
```
No el nom local que cada sistema li assigna.
---
## 5. NFS no converteix `0:0` en `999:999`
Un punt important és que NFS no transforma automàticament els fitxers `root:root` en `999:999`.
Això es va veure clarament quan es va entrar manualment al contenidor:
```bash
docker compose exec peertube sh
```
I dins del contenidor:
```bash
id
```
va retornar:
```text
uid=0(root) gid=0(root)
```
Quan es va crear un fitxer manualment:
```bash
touch /data/prova-des-del-contenidor.txt
```
aquest fitxer va aparèixer com:
```text
0:0
```
Això demostra que si escriu `root`, arriba `root`.
Per tant:
```text
fitxers 0:0 → els ha creat un procés que escrivia com root
fitxers 999:999 → els ha creat o preparat PeerTube/entrypoint amb UID/GID 999
```
NFS conserva els números que li arriben.
---
## 6. Per què fem `chown -R 999:999`
Un cop PeerTube ja ha inicialitzat la seva estructura i veiem que treballa amb `999:999`, la solució coherent és fer que la carpeta de dades del NAS tingui aquesta propietat:
```bash
chown -R 999:999 /mnt/AV/VM/peertube/data
```
Això vol dir:
```text
la DATA de PeerTube pertany a lUID 999 i al GID 999
```
No estem donant permisos a tothom.
Estem fent que el propietari del dataset coincideixi amb lusuari/grup que laplicació espera.
És una solució millor que mantenir `775`, perquè no depèn de permisos oberts, sinó de propietat correcta.
---
## 7. Diferència entre `chown` i `chmod`
### `chown`
Canvia el propietari i el grup:
```bash
chown -R 999:999 /mnt/AV/VM/peertube/data
```
Respon a la pregunta:
```text
de qui són aquests fitxers?
```
### `chmod`
Canvia els permisos:
```bash
chmod 2750 directori
chmod 640 fitxer
```
Respon a la pregunta:
```text
què pot fer el propietari, el grup i la resta dusuaris?
```
Per tant, el refinament té dues parts:
```text
1. canviar propietat a 999:999
2. reduir permisos respecte al 775 inicial
```
---
## 8. Explicació del mode `0775`
El mode clàssic de permisos té tres xifres principals:
```text
775
```
Que volen dir:
```text
7 → propietari
7 → grup
5 → altres
```
Cada xifra és la suma de:
```text
4 → read / lectura
2 → write / escriptura
1 → execute / execució o entrada en directori
```
Per tant:
```text
7 = 4+2+1 = read + write + execute
5 = 4+1 = read + execute
```
Un directori amb `775` queda així:
```text
drwxrwxr-x
```
Això vol dir:
```text
propietari → pot llegir, escriure i entrar
grup → pot llegir, escriure i entrar
altres → poden llegir i entrar
```
Funciona en laboratori, però és més permissiu del necessari.
---
## 9. El “quart dígit” de chmod
A més de les tres xifres normals, chmod pot tenir una quarta xifra al davant:
```text
2750
```
Aquest primer dígit activa permisos especials.
Els valors són:
```text
4 → setuid
2 → setgid
1 → sticky bit
```
Es poden combinar, igual que els permisos normals.
Per exemple:
```text
4755 → setuid
2750 → setgid
1777 → sticky bit
```
---
## 10. Setuid
El bit `setuid` és el valor especial:
```text
4
```
En fitxers executables, fa que el programa sexecuti amb els permisos del propietari del fitxer.
Exemple clàssic:
```text
/usr/bin/passwd
```
El programa `passwd` necessita modificar fitxers del sistema com `/etc/shadow`, però els usuaris normals no hi poden escriure directament. El bit setuid permet que el programa sexecuti amb privilegis controlats.
En aquest cas de PeerTube **no necessitem setuid**.
Per tant, no farem servir modes tipus:
```text
4750
4640
```
---
## 11. Setgid
El bit `setgid` és el valor especial:
```text
2
```
En directoris, és molt útil.
Quan un directori té setgid activat, els fitxers i subdirectoris nous tendeixen a heretar el grup del directori pare.
Per exemple:
```bash
chmod 2750 /mnt/AV/VM/peertube/data
```
El directori queda així:
```text
drwxr-s---
```
La `s` en la part del grup indica que el setgid està activat.
Això ajuda a mantenir la coherència del grup:
```text
999
```
Per això és recomanable per a directoris de dades gestionats per una aplicació.
---
## 12. Sticky bit
El sticky bit és el valor especial:
```text
1
```
És típic en directoris compartits com:
```text
/tmp
```
Un directori amb sticky bit pot aparèixer així:
```text
drwxrwxrwt
```
Serveix perquè diversos usuaris puguin escriure dins del directori, però no puguin esborrar fitxers daltres usuaris.
En aquest cas de PeerTube **no és necessari**, perquè no volem un directori públic compartit entre molts usuaris de sistema.
---
## 13. Per què `2750` per directoris
Els directoris necessiten el bit `x` per poder-hi entrar.
Per això un directori massa tancat com:
```text
2640
```
no és adequat per a directoris, perquè no dona execució/entrada.
Per a directoris de PeerTube proposem:
```text
2750
```
Que equival a:
```text
drwxr-s---
```
Desglossat:
```text
2 → setgid
7 → propietari: lectura, escriptura i entrada
5 → grup: lectura i entrada
0 → altres: cap permís
```
Això permet que lusuari propietari `999` gestioni les dades, que el grup `999` pugui llegir i entrar, i que la resta dusuaris no tingui accés.
---
## 14. Per què `640` per fitxers
Els fitxers no necessiten el bit `x` si no són executables.
Per això proposem:
```text
640
```
Que equival a:
```text
-rw-r-----
```
Desglossat:
```text
6 → propietari: lectura i escriptura
4 → grup: lectura
0 → altres: cap permís
```
Això és suficient per a fitxers de dades, vídeos, miniatures, manifests, temporals i metadades, sempre que PeerTube sigui el procés que els serveix.
No cal que “altres” usuaris del sistema puguin llegir directament aquests fitxers.
---
## 15. Per què no `2640`
El mode `2640` té sentit sobretot per a fitxers si es volgués activar setgid, però en fitxers normals no aporta el mateix benefici pràctic que en directoris.
A més, en directoris seria problemàtic perquè:
```text
2640
```
equival aproximadament a:
```text
drw-r-S---
```
La `S` majúscula indica que hi ha setgid però falta el bit dexecució del grup.
En un directori, sense execució no es pot entrar correctament.
Per això:
```text
directoris → 2750
fitxers → 640
```
és molt més net.
---
## 16. Permisos finals proposats
Al TrueNAS:
```bash
root@truenas:~# chown -R 999:999 /mnt/AV/VM/peertube/data
root@truenas:~# find /mnt/AV/VM/peertube/data -type d -exec chmod 2750 {} \;
root@truenas:~# find /mnt/AV/VM/peertube/data -type f -exec chmod 640 {} \;
```
Això deixa:
```text
directoris → drwxr-s---
fitxers → -rw-r-----
propietat → 999:999
```
---
## 17. No hauria de trencar PeerTube?
No hauria de trencar-lo si PeerTube realment treballa amb `999:999`, com ja hem vist en la seva estructura de `/data`.
El canvi fa que les dades siguin propietat de lUID/GID que PeerTube ja està usant.
A més, si hi hagués cap problema, és fàcil revertir temporalment a un mode més permissiu:
```bash
root@truenas:~# find /mnt/AV/VM/peertube/data -type d -exec chmod 775 {} \;
root@truenas:~# find /mnt/AV/VM/peertube/data -type f -exec chmod 664 {} \;
```
Però la configuració final recomanada és més restrictiva:
```text
2750 per directoris
640 per fitxers
```
---
## 18. Com validar després del canvi
Des del TrueNAS:
```bash
root@truenas:~# ls -lna /mnt/AV/VM/peertube/data | head
```
Resultat esperat:
```text
drwxr-s--- 999 999 ...
```
Des de la VM PeerTube:
```bash
root@peer-tube:~# ls -lna /mnt/truenas-peertube/data | head
```
Buscar fitxers recents:
```bash
root@peer-tube:~# find /mnt/truenas-peertube/data -type f -printf '%TY-%Tm-%Td %TH:%TM %U:%G %m %s %p\n' | sort | tail -30
```
Comprovar que el backend continua funcionant:
```bash
root@peer-tube:/opt/peertube# docker compose logs -f peertube
```
I des de la web:
```text
1. reproduir un vídeo existent
2. pujar un vídeo curt
3. comprovar miniatura
4. comprovar reproducció
```
---
## 19. On queden els vídeos pujats
Els vídeos no tenen per què aparèixer amb el nom original.
PeerTube pot distribuir-los en carpetes com:
```text
/mnt/AV/VM/peertube/data/original-video-files
/mnt/AV/VM/peertube/data/videos
/mnt/AV/VM/peertube/data/streaming-playlists
/mnt/AV/VM/peertube/data/thumbnails
/mnt/AV/VM/peertube/data/previews
/mnt/AV/VM/peertube/data/tmp
```
Per trobar els fitxers recents al TrueNAS:
```bash
root@truenas:~# find /mnt/AV/VM/peertube/data -type f -printf '%TY-%Tm-%Td %TH:%TM %U:%G %m %s %p\n' | sort | tail -50
```
Per veure fitxers grans:
```bash
root@truenas:~# find /mnt/AV/VM/peertube/data -type f -size +10M -printf '%TY-%Tm-%Td %TH:%TM %U:%G %m %s %p\n' | sort | tail -30
```
---
## 20. Resum final
La seqüència correcta és:
```text
1. El dataset es crea al TrueNAS com root:root perquè el crea ladministrador.
2. En laboratori saplica 775 per evitar bloquejos inicials.
3. PeerTube inicialitza /data i crea estructura amb UID/GID 999:999.
4. NFS conserva aquests números entre contenidor, VM i TrueNAS.
5. Els noms com netdata/docker/systemd-journal són traduccions locals dels mateixos números.
6. El criteri fiable és mirar sempre amb ls -lna.
7. La configuració final coherent és chown -R 999:999.
8. Els permisos finals recomanats són 2750 per directoris i 640 per fitxers.
```
La idea de fons és:
```text
No fem el dataset obert perquè funcioni.
Fem que sigui propietat de lUID/GID que realment lha de fer servir.
```
En aquest desplegament:
```text
PeerTube /data → 999:999
TrueNAS dataset → 999:999
```
# Diagnosi SMTP PeerTube: `wrong version number`
## 1. Error observat
Als logs de PeerTube apareix:
```text
Processing email in job 1.
```
i després:
```text
SSL routines:tls_validate_record_header:wrong version number
code: ESOCKET
command: CONN
```
Això passa quan PeerTube intenta enviar un correu, en aquest cas probablement el correu de recuperació de contrasenya.
## 2. Interpretació
Aquest error no sol voler dir que la contrasenya SMTP sigui incorrecta.
Tampoc sol voler dir que el servidor SMTP estigui caigut.
Normalment vol dir que PeerTube està intentant parlar amb el servidor SMTP amb un mode TLS equivocat.
Hi ha dues formes habituals de SMTP segur:
```text
Port 587:
SMTP normal inicial
després STARTTLS
no és TLS directe des del primer byte
Port 465:
SMTPS
TLS directe des del començament
```
Si PeerTube intenta TLS directe contra un port 587, el servidor respon amb SMTP normal i OpenSSL diu:
```text
wrong version number
```
Perquè esperava una resposta TLS, però ha rebut text SMTP.
## 3. Taula pràctica
| Port | Mode correcte | TLS directe | STARTTLS |
|---:|---|---|---|
| 25 | SMTP clàssic / relay intern | no | opcional |
| 587 | Submission | no | sí |
| 465 | SMTPS | sí | no |
Per tant:
```text
587 → secure false + STARTTLS true
465 → secure true + STARTTLS false
```
## 4. Què revisar al `.env`
A la VM PeerTube:
```bash
root@peer-tube:/opt/peertube# grep -i smtp .env
```
Cal mirar especialment:
```env
PEERTUBE_SMTP_HOSTNAME=
PEERTUBE_SMTP_PORT=
PEERTUBE_SMTP_USERNAME=
PEERTUBE_SMTP_PASSWORD=
PEERTUBE_SMTP_TLS=
PEERTUBE_SMTP_DISABLE_STARTTLS=
PEERTUBE_SMTP_FROM=
```
Els noms exactes poden variar segons la versió del `.env`, però la idea és aquesta.
## 5. Configuració típica per SMTP port 587
Si el teu servidor SMTP usa el port 587, la configuració hauria de ser daquest estil:
```env
PEERTUBE_SMTP_HOSTNAME=smtp.domini.cat
PEERTUBE_SMTP_PORT=587
PEERTUBE_SMTP_USERNAME=usuari@domini.cat
PEERTUBE_SMTP_PASSWORD=CONTRASENYA
PEERTUBE_SMTP_TLS=false
PEERTUBE_SMTP_DISABLE_STARTTLS=false
PEERTUBE_SMTP_FROM=noreply@domini.cat
```
La idea és:
```text
TLS directe: no
STARTTLS: sí
```
Per això:
```env
PEERTUBE_SMTP_TLS=false
PEERTUBE_SMTP_DISABLE_STARTTLS=false
```
## 6. Configuració típica per SMTP port 465
Si el teu servidor SMTP usa el port 465, la configuració hauria de ser:
```env
PEERTUBE_SMTP_HOSTNAME=smtp.domini.cat
PEERTUBE_SMTP_PORT=465
PEERTUBE_SMTP_USERNAME=usuari@domini.cat
PEERTUBE_SMTP_PASSWORD=CONTRASENYA
PEERTUBE_SMTP_TLS=true
PEERTUBE_SMTP_DISABLE_STARTTLS=true
PEERTUBE_SMTP_FROM=noreply@domini.cat
```
La idea és:
```text
TLS directe: sí
STARTTLS: no
```
## 7. El cas que probablement tens ara
Pel missatge:
```text
tls_validate_record_header:wrong version number
```
jo sospito una configuració així:
```text
port 587
+
TLS directe activat
```
És a dir, probablement tens alguna cosa semblant a:
```env
PEERTUBE_SMTP_PORT=587
PEERTUBE_SMTP_TLS=true
```
Això acostuma a petar.
Per a port 587, prova:
```env
PEERTUBE_SMTP_PORT=587
PEERTUBE_SMTP_TLS=false
PEERTUBE_SMTP_DISABLE_STARTTLS=false
```
## 8. Aplicar canvi
Editar `.env`:
```bash
root@peer-tube:/opt/peertube# nano .env
```
Després reiniciar PeerTube:
```bash
root@peer-tube:/opt/peertube# docker compose restart peertube
```
Si vols reiniciar tot lstack:
```bash
root@peer-tube:/opt/peertube# docker compose down
root@peer-tube:/opt/peertube# docker compose up -d
```
Mirar logs:
```bash
root@peer-tube:/opt/peertube# docker compose logs -f peertube
```
## 9. Provar connexió SMTP des del contenidor
Primer comprovem connectivitat bàsica.
Per port 587:
```bash
root@peer-tube:/opt/peertube# docker compose exec peertube sh -c 'nc -vz smtp.domini.cat 587'
```
Per port 465:
```bash
root@peer-tube:/opt/peertube# docker compose exec peertube sh -c 'nc -vz smtp.domini.cat 465'
```
Si `nc` no existeix dins del contenidor, es pot provar des de la VM:
```bash
root@peer-tube:~# nc -vz smtp.domini.cat 587
```
o instal·lar eines al host:
```bash
root@peer-tube:~# apt install -y swaks openssl
```
## 10. Prova STARTTLS port 587
Des de la VM:
```bash
root@peer-tube:~# openssl s_client -starttls smtp -connect smtp.domini.cat:587 -crlf
```
Si funciona, veuràs negociació TLS i certificat.
Això confirma que el port 587 espera STARTTLS, no TLS directe.
## 11. Prova SMTPS port 465
Des de la VM:
```bash
root@peer-tube:~# openssl s_client -connect smtp.domini.cat:465 -crlf
```
Si funciona, el TLS comença directament.
## 12. Exemple amb `swaks`
Per provar SMTP de manera clara:
```bash
root@peer-tube:~# swaks \
--to correu-desti@example.net \
--from noreply@domini.cat \
--server smtp.domini.cat \
--port 587 \
--auth LOGIN \
--auth-user usuari@domini.cat \
--auth-password 'CONTRASENYA' \
--tls
```
Per port 465:
```bash
root@peer-tube:~# swaks \
--to correu-desti@example.net \
--from noreply@domini.cat \
--server smtp.domini.cat \
--port 465 \
--auth LOGIN \
--auth-user usuari@domini.cat \
--auth-password 'CONTRASENYA' \
--tls-on-connect
```
## 13. Checklist de coherència
Per port 587:
```text
PEERTUBE_SMTP_PORT=587
PEERTUBE_SMTP_TLS=false
PEERTUBE_SMTP_DISABLE_STARTTLS=false
```
Per port 465:
```text
PEERTUBE_SMTP_PORT=465
PEERTUBE_SMTP_TLS=true
PEERTUBE_SMTP_DISABLE_STARTTLS=true
```
També comprovar:
```text
usuari SMTP correcte
password correcte
FROM permès pel servidor SMTP
domini del FROM coherent
firewall sortint cap al port SMTP
```
## 14. Punt important sobre `FROM`
Molts servidors SMTP no deixen enviar com qualsevol remitent.
Si autentiques com:
```text
usuari@domini.cat
```
però poses:
```env
PEERTUBE_SMTP_FROM=noreply@altresdomini.cat
```
pot fallar o enviar a spam.
Millor començar amb:
```env
PEERTUBE_SMTP_FROM=usuari@domini.cat
```
i després afinar.
## 15. Resum
Lerror actual apunta fortament a una combinació incorrecta de TLS:
```text
TLS directe contra un port que espera SMTP normal + STARTTLS
```
La correcció més probable, si uses port 587, és:
```env
PEERTUBE_SMTP_TLS=false
PEERTUBE_SMTP_DISABLE_STARTTLS=false
```
Després:
```bash
root@peer-tube:/opt/peertube# docker compose restart peertube
```
I tornar a provar el reset de contrasenya.
Després:
Bash
root@peer-tube:/opt/peertube# docker compose up -d --force-recreate peertube
root@peer-tube:/opt/peertube# docker compose exec peertube env | grep -i SMTP
root@peer-tube:/opt/peertube# docker compose logs -f peertube
# Fase final pendent del desplegament PeerTube
## 1. Importació de vídeos / YouTube / yt-dlp
Objectiu:
```text
Permetre que PeerTube pugui importar vídeos des dURLs externes.
```
Això inclou:
```text
YouTube
altres PeerTube
vídeos remots directes
altres plataformes compatibles amb yt-dlp
```
La peça tècnica important és:
```text
yt-dlp
```
Abans es parlava molt de `youtube-dl`, però avui dia normalment es fa servir `yt-dlp`, perquè està més mantingut i suporta millor canvis de plataformes com YouTube.
### Comprovacions
A la VM PeerTube:
```bash
root@peer-tube:/opt/peertube# docker compose exec peertube sh
```
Dins del contenidor:
```bash
which yt-dlp
yt-dlp --version
which youtube-dl
youtube-dl --version
```
Si no hi ha `yt-dlp`, cal decidir si:
```text
1. La imatge PeerTube ja té mecanisme propi dimportació i només cal activar-lo.
2. Cal instal·lar o muntar yt-dlp.
3. Cal reconstruir una imatge derivada amb yt-dlp inclòs.
```
### Prova funcional
Des de la interfície dadministració de PeerTube cal mirar:
```text
Administration → Configuration → Import
```
I activar, si cal:
```text
video import
URL import
user import permissions
```
Després provar amb un vídeo curt i no problemàtic.
---
## 2. Migració / importació des de la instància antiga PeerTube
Aquí cal distingir tres coses:
```text
federar
importar
clonar
```
### Federar
Federar vol dir que la nova instància pot seguir canals o comptes de lantiga.
No és una còpia completa.
Serveix per:
```text
veure contingut remot
seguir canals
validar ActivityPub
relacionar instàncies
```
### Importar
Importar vol dir agafar un vídeo remot i incorporar-lo a la nova instància.
Això pot ser el camí més pràctic si volem portar contingut seleccionat de la instància antiga.
### Clonar / migrar
Clonar tota la instància és una altra cosa.
Això implicaria:
```text
base de dades
fitxers de vídeo
configuració
dominis
usuaris
canals
UUIDs
versions compatibles
```
No ho faria a cegues si la instància nova ja està funcionant i té domini/configuració pròpia.
## 3. Prova de federació entre instàncies
A la nova instància:
```text
Administration → Configuration → Federation
```
Comprovar que la federació està activada.
Després provar:
```text
buscar un canal remot de la instància antiga
seguir-lo
veure si apareixen vídeos remots
provar la reproducció
```
Això valida que la nova instància parla bé amb el món federat.
## 4. Prova dimportació des de la instància antiga
La prova mínima seria:
```text
1. Agafar URL pública dun vídeo de la instància antiga.
2. Des de la nova instància, fer import by URL.
3. Comprovar que descarrega.
4. Comprovar que transcodifica.
5. Comprovar que queda al NAS.
6. Comprovar que es reprodueix.
```
Després al TrueNAS podem veure si ha escrit fitxers nous:
```bash
root@truenas:~# find /mnt/AV/VM/peertube/data -type f -printf '%TY-%Tm-%Td %TH:%TM %U:%G %m %s %p\n' | sort | tail -50
```
## 5. Quota, permisos i política dimportació
Abans dobrir importació a usuaris, cal decidir:
```text
qui pot importar vídeos
quanta quota té cada usuari
mida màxima de fitxer
durada màxima
si cal moderació
si es permet importar de YouTube
si es permet importar només daltres PeerTube
```
Perquè YouTube/yt-dlp pot consumir:
```text
disc
CPU
temps de transcodificació
ample de banda
```
I també pot tenir implicacions de drets/copyright.
## 6. Backups
Ara que ja funciona, toca documentar o preparar còpies de seguretat.
Com a mínim:
```text
/opt/peertube/.env
/opt/peertube/docker-compose.yml
/opt/peertube/docker-volume/config
/opt/peertube/docker-volume/db
/opt/peertube/docker-volume/redis
/mnt/AV/VM/peertube/data
/etc/apache2/sites-available/vm.domini.cat.conf
/etc/letsencrypt
/etc/fstab de la VM
```
La base de dades és crítica. No nhi ha prou amb copiar vídeos.
## 7. Monitoratge bàsic
Comprovar regularment:
```bash
root@peer-tube:~# df -h
root@peer-tube:~# df -h /mnt/truenas-peertube
root@peer-tube:/opt/peertube# docker compose ps
root@peer-tube:/opt/peertube# docker compose logs --tail=100 peertube
```
Al TrueNAS:
```bash
root@truenas:~# du -sh /mnt/AV/VM/peertube/data
```
## 8. Documentació final
Ara ja tenim material per fer aquests documents:
```text
01_creacio_vm_peertube.md
02_truenas_nfs_permisos.md
03_docker_compose_peertube.md
04_vhost_apache_certbot.md
05_postdesplegament_smtp_permisos.md
06_importacio_federacio_ytdlp.md
07_incidencies.md
```
La incidència Docker/Caddy/Snikket aniria a `07_incidencies.md`.
---
# Ordre recomanat ara
Jo faria aquest ordre:
```text
1. Confirmar importació URL / yt-dlp dins PeerTube.
2. Provar importació dun vídeo curt extern.
3. Provar importació dun vídeo de la instància antiga.
4. Provar federació entre instància antiga i nova.
5. Decidir si volem migració selectiva o clonació completa.
6. Definir backups.
7. Tancar documentació.
```
## Proxy RTMP per a emissions en directe
A més del proxy HTTPS habitual cap a PeerTube, cal tenir en compte que les emissions en directe amb OBS no entren per HTTP/HTTPS, sinó per **RTMP**.
En aquest desplegament, la part web de PeerTube funciona així:
```text
Internet
|
| HTTPS 443
v
CT Vhost / Apache
|
| HTTP intern 9000
v
VM PeerTube
192.168.100.111:9000
```
Però les emissions en directe fan servir el port TCP `1935`:
```text
OBS
|
| RTMP TCP 1935
v
CT Vhost / HAProxy
|
| TCP 1935
v
VM PeerTube
192.168.100.111:1935
```
Per tant, Apache no resol aquesta part. Apache fa de reverse proxy per al web, però **RTMP necessita un proxy TCP**. En aquest cas es fa servir **HAProxy** al mateix CT `Vhost`.
### Configuració de HAProxy
Al fitxer:
```bash
/etc/haproxy/haproxy.cfg
```
sha afegit el següent frontend/backend:
```haproxy
frontend rtmp_front
bind *:1935
mode tcp
option tcplog
default_backend peertube_rtmp
backend peertube_rtmp
mode tcp
server peertube 192.168.100.111:1935 check
```
Aquesta configuració fa que qualsevol connexió entrant al port `1935` del `Vhost` sigui reenviada cap al port `1935` de la VM PeerTube.
### Validació de la configuració
Després de modificar HAProxy, cal validar la configuració:
```bash
root@Vhost:~# haproxy -c -f /etc/haproxy/haproxy.cfg
```
Si la configuració és correcta, es pot recarregar el servei:
```bash
root@Vhost:~# systemctl reload haproxy
```
O bé reiniciar-lo:
```bash
root@Vhost:~# systemctl restart haproxy
```
Comprovació del servei:
```bash
root@Vhost:~# systemctl status haproxy
```
Comprovació que HAProxy escolta al port RTMP:
```bash
root@Vhost:~# ss -ltnp | grep ':1935'
```
La sortida esperada és semblant a:
```text
LISTEN 0 4096 0.0.0.0:1935 0.0.0.0:* users:(("haproxy",pid=...,fd=...))
```
### Comprovació des del Vhost cap a PeerTube
Abans de provar OBS, és útil comprovar que el CT `Vhost` arriba al port RTMP de la VM PeerTube:
```bash
root@Vhost:~# nc -vz 192.168.100.111 1935
```
La resposta esperada és:
```text
Connection to 192.168.100.111 1935 port [tcp/*] succeeded!
```
### Comprovació a la VM PeerTube
A la VM PeerTube, el contenidor ha destar exposant el port `1935`:
```bash
root@peer-tube:/opt/peertube# ss -ltnp | grep ':1935'
```
Sortida esperada:
```text
LISTEN 0 4096 0.0.0.0:1935 0.0.0.0:* users:(("docker-proxy",pid=...,fd=...))
LISTEN 0 4096 [::]:1935 [::]:* users:(("docker-proxy",pid=...,fd=...))
```
Al `docker-compose.yml`, el servei `peertube` ha de tenir exposat el port:
```yaml
ports:
- "9000:9000"
- "1935:1935"
```
Després de modificar aquest fitxer, cal recrear el contenidor:
```bash
root@peer-tube:/opt/peertube# docker compose up -d --force-recreate peertube
```
### Prova amb OBS
Lusuari crea un directe des de PeerTube i copia la URL RTMP i la clau demissió.
A OBS:
```text
Service: Custom
Server: rtmp://domini.exemple.cat:1935/live
Stream Key: CLAU_DEL_DIRECTE
```
És important no confondre el proxy HTTPS amb el proxy RTMP:
```text
443 → Apache → PeerTube:9000
1935 → HAProxy → PeerTube:1935
```
### Incidència detectada
Durant les proves, OBS es connectava i es desconnectava en bucle. La causa era que el port públic `1935` encara estava associat a una instància PeerTube antiga en CT.
En apagar el CT antic, OBS deixava de trobar servidor. Això va permetre identificar que el trànsit RTMP no estava arribant a la nova VM PeerTube.
La solució va ser revisar HAProxy al CT `Vhost` i canviar el backend RTMP perquè apuntés a la nova VM:
```haproxy
server peertube 192.168.100.111:1935 check
```
Després de recarregar HAProxy, OBS va poder emetre correctament cap a la nova instància PeerTube.