Self-hosting PeerTube pe Fedora Server

  • 10 minute de citit
  • 30 exemple de cod în Shell și YAML
  • 2 imagini

Disponibil și în English

Pe această pagină

thumbnail

Salut tuturor! 👋

Acesta este primul meu articol de blog din 2025, și vreau să vorbesc despre experiența mea de self-hosting cu PeerTube pe Fedora Server și cum poți face și tu la fel.

În plus, am adăugat o categorie nouă pe blogul meu: Self Hosting

Vreau să celebrez și faptul că am 15k vizitatori unici pe lună (conform CloudFlare), însă majoritatea sunt scanări de porturi, exploatări și boți LLM care scanează tot și ignoră robots.txt. 😅


De ce PeerTube 📹

PeerTube este o platformă federată de partajare a videoclipurilor. Poți să-ți găzduiești propria instanță sau să creezi un cont pe o instanță populară, precum:

Federarea permite fiecărei instanțe să aibă propriile reguli și, în același timp, permite utilizatorilor din instanțe diferite să interacționeze între ei.

Federarea ajută, de asemenea, la prevenirea monopolului și a cenzurii.

Canalul meu de YouTube este mic, iar scopul meu nu este să devin influencer. Îmi place pur și simplu să fac videoclipuri din când în când și să-mi dețin propriile date.

Fedora Server 🐧

Am întrebat Fediverse-ul ce ar trebui să folosesc pentru a găzdui mașini virtuale, iar ei mi-au răspuns Fedora Server! Am fost atât de impresionat încât am decis să găzduiesc aici și alte lucruri.

https://mastodon.social/@nuculabs/113878846534991998

Înainte de Fedora Server aveam PeerTube pe un Raspberry Pi 5 cu 4GB RAM, iar apoi pe un PC cu Ubuntu Server. Am dezinstalat Ubuntu Server și am instalat Fedora Server.

Pi 5 nu s-a descurcat prea bine la codarea videoclipurilor. Un videoclip simplu de 5 minute putea dura până la 20 de minute ca să fie codat în rezoluțiile 1080p, 720p și 480p. Exista, de asemenea, un număr limitat de redări simultane acceptate.

Rămân la Fedora Server datorită Cockpit UI, suportului pentru Podman și suportului pentru mașini virtuale. Pentru cazurile mele de utilizare, este un avantaj uriaș să rulez mașinile virtuale pe un PC separat și să mă conectez la ele din browser.

cockpit ui screenshot

Cerințe preliminare

Ca să rămân scurt, dacă vrei să găzduiești PeerTube pe un Fedora Server cu Podman, vei avea nevoie de aceste cerințe preliminare:

  1. Self-host PeerTube pe PC-ul tău folosind Docker

Începe cu Docker și Docker Compose și află cum să faci self-host PeerTube pe PC-ul tău citind acest ghid:

  1. Ai nevoie de Fedora Server, Podman și de o conexiune SSH funcțională către server.

Cum să faci self-host PeerTube pe Fedora Server cu Podman

Poți folosi fișierul meu docker-compose.yaml împreună cu podman compose sau poți folosi propriul fișier.

În cazul meu, găzduiesc PostgresSQL pe un server separat și montez volumele Podman prin rețea, prin samba. Folosesc, de asemenea, un reverse proxy configurat pe alt sistem, așa că am eliminat containerele din fișierul oficial docker-compose.yaml.

services:  peertube:    container_name: peertube_peertube_1    image: chocobozzz/peertube:v7.0.0-bookworm    # Folosește un IP static pentru acest container, pentru că nginx nu gestionează schimbarea gazdei proxy fără reîncărcare    # Acest container poate fi repornit în caz de defecțiune, până când baza de date postgresql este gata pentru conexiuni    networks:      default:        ipv4_address: 173.18.0.42        ipv6_address: fdab:e4b3:21a2:ef1b::42    env_file:      - .env    ports:      - "1935:1935" # Comentează dacă nu vrei să folosești funcția de live      - "9000:9000"    volumes:      - /mnt/peertube/data:/data # /mnt/peertube este un volum samba      - /mnt/peertube/config:/config    depends_on:      - redis    restart: "always"    security_opt:      - "label=type:peertube_peertube_1.process"      # - "seccomp=unconfined"  redis:    image: redis:6-alpine    restart: "always"networks:  default:    enable_ipv6: true    ipam:      driver: default      config:        - subnet: 173.18.0.0/16        - subnet: fdab:e4b3:21a2:ef1b::/64

(Opțional) Configurarea volumelor Samba

Ca să configurez volumele samba, am creat un utilizator peertube cu

sudo useradd peertube

Apoi am modificat /etc/fstab ca să montez automat volumele de rețea:

//<ip-of-storage-server>/peertube/ /mnt/peertube cifs uid=peertube,gid=peertube,file_mode=0777,dir_mode=0777,username=peertube,password=peertube 0 0

Ca să permit Podman să acceseze volumele cifs, a trebuit să rulez următoarea comandă.

Această comandă modifică setările SELinux la nivel de sistem și permite tuturor mașinilor virtuale să acceseze fișierele CIFS (unitatea Samba).

sudo semanage boolean -m virt_use_samba --on

Încărcarea politicilor SELinux

SELinux poate fi confuz 😵‍💫.

https://mastodon.social/@nuculabs/113885073269577999

Încă nu știu să-l folosesc corect, dar cu puțină încercare și eroare am reușit să fac PeerTube să funcționeze.

Trebuie să instalezi:

dnf install udica container-selinux

Odată ce ai instalat udica, poți salva următorul conținut într-un fișier numit: peertube_peertube_1.cil

Fișierul conține toate permisiunile necesare ca PeerTube să funcționeze corect.

(block peertube_peertube_1    (blockinherit container)    (blockinherit restricted_net_container)    (allow process process ( capability ( chown dac_override fowner fsetid kill net_bind_service setfcap setgid setpcap setuid sys_chroot )))     (allow process flash_port_t ( tcp_socket (  name_bind )))     (allow process http_port_t ( tcp_socket (  name_bind )))     (allow process unreserved_port_t (tcp_socket (name_connect) ) )    (allow process cifs_t (dir (setattr)))    (allow process redis_port_t (tcp_socket (name_connect)))    (allow process smtp_port_t (tcp_socket (name_connect)))    (allow process container_file_t ( dir ( add_name create getattr ioctl lock open read remove_name rmdir search setattr write )))     (allow process container_file_t ( file ( append create getattr ioctl lock map open read rename setattr unlink write )))     (allow process container_file_t ( fifo_file ( getattr read write append ioctl lock open )))     (allow process container_file_t ( sock_file ( append getattr open read write )))     (allow process user_home_t ( dir ( add_name create getattr ioctl lock open read remove_name rmdir search setattr write )))     (allow process user_home_t ( file ( append create getattr ioctl lock map open read rename setattr unlink write )))     (allow process user_home_t ( fifo_file ( getattr read write append ioctl lock open )))     (allow process user_home_t ( sock_file ( append getattr open read write ))) )

După aceea, trebuie să le încarci cu următoarele comenzi:

sudo semodule -i peertube_peertube_1.cil /usr/share/udica/templates/{base_container.cil,net_container.cil}

Depanarea SELinux

Politicile SELinux nu sunt chiar intuitive. Nu am reușit să fac PeerTube să pornească cu politicile implicite și a trebuit să le modific.

Ca să generezi politicile implicite, trebuie să ai containerul creat și să rulezi:

podman inspect peertube_peertube_1 > peertube_peertube_1.jsonsudo udica -j peertube_peertube_1.json peertube_peertube_1

Aceasta va genera politicile .cil implicite. Dacă le încarci și pornești containerele

sudo semodule -i peertube_peertube_1.cil /usr/share/udica/templates/{base_container.cil,net_container.cil}podman compose up

Vei întâlni diverse erori, de exemplu containerul PeerTube nu se poate conecta la Redis.

Udica nu l-a detectat, iar SELinux blochează conexiunea TCP pentru a-ți proteja sistemul de un comportament nedorit.

Toate aceste încălcări ale politicilor sunt înregistrate în fișierul audit.log de la /var/share/audit/audit.log.

Poți apoi folosi comanda audit2allow ca să generezi politicile rămase.

sudo cat /var/log/audit/audit.log | audit2allow -a -C > audit.txt

Pe mașina mea, când am terminat configurarea, fișierul final audit.txt arăta așa:

;============= container_t ==============;!!!! This avc is allowed in the current policy(allow container_t cifs_t (dir (setattr)))(allow container_t user_home_t (dir (setattr)));============= peertube_peertube_1.process ==============;!!!! This avc is allowed in the current policy(allow peertube_peertube_1.process cifs_t (dir (setattr)));!!!! This avc is allowed in the current policy(allow peertube_peertube_1.process redis_port_t (tcp_socket (name_connect)));!!!! This avc is allowed in the current policy(allow peertube_peertube_1.process smtp_port_t (tcp_socket (name_connect)));!!!! This avc is allowed in the current policy(allow peertube_peertube_1.process unreserved_port_t (tcp_socket (name_connect)));============= systemd_homed_t ==============(allow systemd_homed_t var_t (dir (read)));============= systemd_logind_t ==============(allow systemd_logind_t iptables_var_run_t (dir (read)))

Tot ce mai rămânea de făcut era să copiez și să modific politicile refuzate în fișierul peertube_peertube_1.cil.

De exemplu:

(allow peertube_peertube_1.process redis_port_t (tcp_socket (name_connect)))

a devenit:

(block peertube_peertube_1    (blockinherit container)    (blockinherit restricted_net_container)    (allow process process ( capability ( chown dac_override fowner fsetid kill net_bind_service setfcap setgid setpcap setuid sys_chroot )))      ..    (allow process redis_port_t (tcp_socket (name_connect)))    ...)

După ce ai terminat, poți opri containerele cu podman compose down, încărca fișierul .cil în SELinux și încerca din nou.

Firewall

Fedora Server vine cu un firewall și, implicit, porturile PeerTube nu sunt deschise.

Va trebui să deschizi portul opțional 1935/TCP dacă folosești funcția de live a PeerTube, și portul 9000/TCP, ca PeerTube să funcționeze.

sudo firewall-cmd --permanent --add-port=1935/tcpsudo firewall-cmd --permanent --add-port=9000/tcp

Rularea PeerTube

Dacă politicile de securitate și firewall-ul sunt configurate, tot ce mai rămâne de făcut este să rulezi

podman compose up

Felicitări pentru finalizarea acestui pas!

Persistența după reporniri

Am vrut să salvez cea mai bună parte pentru ultima secțiune a acestui articol.

Când serverul repornește din cauza unei pene de curent sau din alt motiv, containerele vor fi oprite. Dacă acesta este comportamentul dorit, poți sări peste această secțiune.

Poți genera fișiere Podman Quadlet folosind podlet. Fișierele Quadlet sunt folosite pentru a rula containere cu systemd.

Odată instalat, poți rula podlet compose

Și va genera fișiere .container ca acesta:

# exemplu de redis.container generat[Container]Image=redis:6-alpinePublishPort=6379:6379[Service]Restart=always[Install] # adăugat de mineWantedBy=default.target

Odată ce fișierele sunt plasate în oricare dintre următoarele directoare, fișierele unit systemd vor fi generate din ele

/usr/share/containers/systemd//etc/containers/systemd/$HOME/.config/containers/systemd/

Fișierul redis.container va genera un fișier unit systemd redis.service, care poate fi plasat în /usr/share/containers/systemd/ ca containerul să pornească la boot.

Desigur, generarea fișierelor unit systemd este încă incompletă, iar în cazul nostru ar fi nevoie și de un fișier de rețea. podlet nu le-a generat pentru mine și a trebuit să le scriu manual. Am modificat și pe cele existente; le poți folosi copiind și lipind.

Asigură-te că nu ai containere și rețele rămase agățate în Podman, fie în modul utilizator, fie în modul systemd, altfel configurarea va eșua. Am avut o rețea agățată după ce am folosit sudo podman compose up și a trebuit să o șterg rulând sudo podman network ls și sudo porman network rm 123.

Ar trebui să creezi fiecare fișier în directorul curent

# peertube.network[Unit]Description=Peertube Network[Network]Subnet=173.18.0.42/16Gateway=173.18.0.1Label=app=peertube
# redis.container[Container]ContainerName=redisServiceName=redisImage=redis:6-alpineNetwork=peertube.network[Service]Restart=always[Install]WantedBy=default.target
# peertube.container[Unit]Requires=redis.serviceAfter=redis.service[Container]ContainerName=peertubeEnvironmentFile=/home/dnutiu/peertube/.env # Notă: va trebui să înlocuiești fișierul env.Image=chocobozzz/peertube:v7.0.0-bookwormPublishPort=1935:1935PublishPort=9000:9000Volume=/mnt/peertube/data:/dataVolume=/mnt/peertube/config:/configSecurityLabelType=peertube_peertube_1.processNetwork=peertube.network[Service]Restart=always[Install]WantedBy=default.target

Acum am pregătit un mic script pentru instalarea și rularea serviciilor, fie în modul utilizator, fie în modul root.

Pentru modul root, rulează:

sudo cp peertube.network /etc/containers/systemd/sudo cp redis.container /etc/containers/systemd/sudo cp peertube.container /etc/containers/systemd/sudo systemctl daemon-reloadsudo systemctl stop peertube.servicesudo systemctl stop redis.servicesudo systemctl start redis.servicesudo systemctl start peertube.service

Iar pentru modul utilizator:

mkdir -p $HOME/.config/containers/systemd/cp peertube.network $HOME/.config/containers/systemd/cp redis.container $HOME/.config/containers/systemd/cp peertube.container $HOME/.config/containers/systemd/systemctl --user daemon-reloadsystemctl --user stop peertube.servicesystemctl --user stop redis.servicesystemctl --user start redis.servicesystemctl --user start peertube.service

Odată ce ai rulat scriptul, poți rula podman ps sau cu sudo, dacă rulezi în modul root.

Și partea bună este că acest lucru va persista după reporniri.

dnutiu@legion:~/peertube$ sudo podman psCONTAINER ID  IMAGE                                          COMMAND           CREATED             STATUS             PORTS                                           NAMES6ee4f862d63f  docker.io/library/redis:6-alpine               redis-server      About a minute ago  Up About a minute  0.0.0.0:6379->6379/tcp                          systemd-redis0e7a6e9871ed  docker.io/chocobozzz/peertube:v7.0.0-bookworm  node dist/server  29 seconds ago      Up 29 seconds      0.0.0.0:1935->1935/tcp, 0.0.0.0:9000->9000/tcp  peertube

Actualizare 29 ian: Adăugarea PostgresSQL

Am spus anterior că folosesc PostgresSQL pe un alt server. Am decis să-l mut și pe Fedora Server, așa că vreau să împărtășesc cu voi fișierul .cil și fișierul .container.

Le-am obținut consultând comenzile și fluxul de lucru din acest articol.

# cat postgres.cil (block postgres    (blockinherit container)    (blockinherit restricted_net_container)    (allow process process ( capability ( chown dac_override fowner fsetid kill net_bind_service setfcap setgid setpcap setuid sys_chroot )))    (allow process default_t (file (link)))    (allow container_t default_t (dir (setattr)))    (allow process postgresql_port_t ( tcp_socket (  name_bind )))    (allow process default_t ( dir ( add_name create getattr ioctl lock open read remove_name rmdir search setattr write )))    (allow process default_t ( file ( append create getattr ioctl lock map open read rename setattr unlink write )))    (allow process default_t ( fifo_file ( getattr read write append ioctl lock open )))    (allow process default_t ( sock_file ( append getattr open read write ))))
# cat postgres.container [Unit]Requires=redis.serviceAfter=redis.service[Container]ServiceName=postgresContainerName=postgresEnvironmentFile=/home/dnutiu/peertube/.envImage=postgres:13-alpineVolume=/data/postgres:/var/lib/postgresql/dataNetwork=peertube.networkSecurityLabelType=postgres.process[Service]Restart=always[Install]WantedBy=default.target

Și, desigur, va trebui să actualizezi fișierul de mediu ca să ai hostname-ul bazei de date configurat corect: PEERTUBE_DB_HOSTNAME=postgres.

Actualizare 2 feb: Backup-ul datelor

Backup-ul datelor PeerTube poate fi făcut cu un script simplu care salvează toate directoarele și conținutul lor.

Pentru backup-ul meu, am creat un script simplu care face asta astfel:

# cat backup.shname=$(date '+%Y-%m-%d')cd /mnt/peertubetar -zcvf "$name.config.tar.gz" configtar -zcvf "$name.data.tar.gz" datamv *.tar.gz /mnt/peertube/backups/cd /datasystemctl stop postgres.servicetar -zcvf "$name.postgres.tar.gz" postgressystemctl start postgres.servicemv *.tar.gz /mnt/peertube/backups/

Și un serviciu systemd

# cat peertube-backup.service [Unit]Description=peertube-backup[Service]Type=oneshotUser=rootExecStart=/bin/bash /home/dnutiu/peertube/systemd/backup.sh

Acum, ca să pornești serviciul de backup, poți să o faci manual sau să folosești un timer systemd pentru declanșarea automată a job-ului de backup.

# cat peertube-backup.timer [Unit]Description=peertube-backup[Timer]OnCalendar=weeklyPersistent=true[Install]WantedBy=timers.target

După aceea, tot ce trebuie să faci este să instalezi backup-ul și timer-ul.

sudo cp peertube-backup.service /etc/systemd/system/sudo cp peertube-backup.timer /etc/systemd/system/sudo systemctl daemon-reloadsudo systemctl enable peertube-backup.timersudo systemctl start peertube-backup.timer

Verificând starea timer-ului, poți vedea că este activat și când va fi declanșat următoarea dată.

sudo systemctl status peertube-backup.timer ● peertube-backup.timer - peertube-backup     Loaded: loaded (/etc/systemd/system/peertube-backup.timer; enabled; preset: disabled)     Active: active (waiting) since Sun 2025-02-02 20:34:53 EET; 1s ago Invocation: b7a6749243b9472798b50475853690e2    Trigger: Mon 2025-02-03 00:00:00 EET; 3h 25min left   Triggers: ● peertube-backup.serviceFeb 02 20:34:53 systemd[1]: Started peertube-backup.timer - peertube-backup.

Concluzie

Am văzut ce înseamnă să rulezi PeerTube folosind podman compose pe mașină, cum să folosești audit2allow ca să depanezi probleme SELinux și să modifici politicile existente, pentru ca PeerTube să funcționeze corect fără să fie oprit de SELinux 🔪.

Până la urmă, am transformat fișierul docker-compose.yml în fișiere systemd pentru containere și rețele: redis.container, podman.container și podman.network, care au generat singure fișierele unit systemd.

Am explorat, de asemenea, cum să rulăm aceste containere în modul utilizator și în modul root, iar cel mai important lucru este că se repornesc automat atunci când serverul repornește. 😁

Atât, pentru moment! Mulțumesc că ai citit! 📚

Și un an nou fericit! 🎆🎆🎆🎆