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ă

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.

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:
- 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:
- 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 peertubeApoi 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 0Ca 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-selinuxOdată 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_1Aceasta 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 upVei î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.txtPe 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/tcpRularea PeerTube
Dacă politicile de securitate și firewall-ul sunt configurate, tot ce mai rămâne de făcut este să rulezi
podman compose upFelicită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.targetOdată 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.targetAcum 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.serviceIar 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.serviceOdată 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 peertubeActualizare 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.shAcum, 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.targetDupă 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.timerVerificâ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! 🎆🎆🎆🎆