summaryrefslogtreecommitdiff
path: root/content/peertube.md
blob: 97569e77cdfce0030639d7b629342fe4f3c66519 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
---
title: "PeerTube"
date: 2021-07-31
icon: "peertube.svg"
tags: ["service", "activity-pub"]
short_desc: "Your own self-hosted video-site also compatible with Activity Pub."
---

PeerTube is a self-hosted and (optionally) federated video sharing
platform that saves bandwith on videos the more people watch. PeerTube
instances can follow each other to share videos and grow the federated
network, but you can always keep your instance to yourself if you choose
to.

## Note on Bandwidth

Video sharing is the most bandwidth intensive thing on the internet! If
you plan on just having a small personal site with a few viewers and
friends, that won\'t be a big concern, but most VPS providers like Vultr
have caps on how much bandwidth can be used within a month without being
throttled. This level is far beyond what most sites need, but it might
be an issue with a video site!

So if you plan on having a big video-sharing PeerTube site, it\'s a good
idea to host it with a provider that offers infinite bandwidth. I
strongly recommend getting a separate VPS with
[Frantech/BuyVM](https://my.frantech.ca/aff.php?aff=3886). They have
unmetered bandwidth, extremely cheap block storage for hosting many,
many videos and they even have a good record of being censorship
resistant.

## Prerequisites

**Most** of PeerTube\'s dependencies can be installed with this command:

```sh
apt update
apt install -y curl sudo unzip vim ffmpeg postgresql postgresql-contrib g++ make redis-server git cron wget certbot nginx ffmpeg postgresql postgresql-contrib openssl g++ make redis-server git cron wget
apt install python3-dev python3-pip python-is-python3
python --version # Should be >= 3.8
ffmpeg -version # Should be >= 4.1
g++ -v # Should be >= 5.x
redis-server --version # Should be >= 6.x
```

It\'s also important to start all associated daemons:

```sh
systemctl start postgresql redis
```

PeerTube also requires **NodeJS 14** and **yarn** which cannot be
installed from the Debian repositories. This means they have to be
installed from separate, external repos:

```sh
curl -fsSL https://deb.nodesource.com/setup_22.x -o nodesource_setup.sh
bash nodesource_setup.sh
apt install -y nodejs
node -v # Should be 20.x or 22.x
```

Now we create a PeerTube user to run and handle PeerTube with the proper
permissions:

```sh
useradd -m -d /var/www/peertube -s /bin/bash -p peertube peertube
passwd peertube
ls -ld /var/www/peertube # Should be drwxr-xr-x
```

## Database

PeerTube requires a PostgreSQL database to function. To create it, first
make a new Postgres user named PeerTube:

```bash
su -l postgres
createuser -P peertube
createdb -O peertube -E UTF8 -T template0 peertube_prod
psql -c "CREATE EXTENSION pg_trgm;" peertube_prod
psql -c "CREATE EXTENSION unaccent;" peertube_prod
exit
```

Be sure to **make note of your Postgres user password,** as it will be
needed later when setting up PeerTube.

## Installation

Using `su -l`, we will become the PeerTube user to create the required
directories and download and install PeerTube itself with the proper
permissions. First, we create the required directories.

```sh
su -l peertube
mkdir config storage versions
chmod 750 config/
```

### Downloading PeerTube

Still as the PeerTube user, we can now check for the most recent
PeerTube versions number, download and install it in the newly created
`versiond` directory.

```bash
VERSION=$(curl -s https://api.github.com/repos/chocobozzz/peertube/releases/latest | grep tag_name | cut -d '"' -f 4) && echo "Latest Peertube version is $VERSION"
cd /var/www/peertube/versions
wget -q "https://github.com/Chocobozzz/PeerTube/releases/download/${VERSION}/peertube-${VERSION}.zip"
unzip -q peertube-${VERSION}.zip && rm peertube-${VERSION}.zip
```

### Installation via Yarn

The downloaded release can then be symbolically linked to
`/var/www/peertube/peertube-latest` and **yarn** is used to install
PeerTube:

```sh
cd /var/www/peertube
ln -s versions/peertube-${VERSION} ./peertube-latest
cd ./peertube-latest
yarn install --production --pure-lockfile
```

## Configuration

PeerTube's default config file can be copied over to
`/var/www/peertube/config/production.yaml` so it can actually be used:

Note that we are still running these as the PeerTube user (having run
`su -l peertube`).

```sh
cd /var/www/peertube
cp peertube-latest/config/default.yaml config/default.yaml
cp peertube-latest/config/production.yaml.example config/production.yaml
```

Now the `production.yaml` file must be edited in the following ways:

First, generate a secret key by `openssl rand -hex 32`:

```sh
sed -i "s/peertube: ''/peertube: '$(openssl rand -hex 32)'/" /var/www/peertube/config/production.yaml
```

```yaml
secrets:
  # Generate one using `openssl rand -hex 32`
  peertube: "5e55258877f5d259cb1b5e5562dcb0eded3a2c3373d9fafac65ed765fbb1936c"
```

Add the hostname:

```yaml
webserver:
  https: true
  hostname: "peertube.thesiah.xyz"
  port: 443
```

Then, the database:

```yaml
database:
  hostname: "localhost"
  port: 5432
  ssl: false
  suffix: "_prod"
  username: "peertube"
  password: "your_database_password"
  pool:
    max: 5
```

An email to generate the admin user:

```yaml
admin:
  # Used to generate the root user at first startup
  # And to receive emails from the contact form
  email: "peertube@thesiah.xyz"
```

And **optionally,** email server information:

```yaml
smtp:
  # smtp or sendmail
  transport: smtp
  # Path to sendmail command. Required if you use sendmail transport
  sendmail: null
  hostname: mail.thesiah.xyz
  port: 465 # If you use StartTLS: 587
  username: videos@thesiah.xyz
  password: your_email_password
  tls: true # If you use StartTLS: false
  disable_starttls: false
  ca_file: null # Used for self signed certificates
  from_address: "videos@thesiah.xyz"
```

At this point, we have done all we need to do as the PeerTube user. Run
`exit` or press <kbd>Ctrl-d</kbd> to log out and return to the root prompt where
we will configure Nginx and other system settings.

```sh
exit
```

## Nginx

PeerTube includes an Nginx configuration that can be copied over to
`/etc/nginx/sites-available:`

```sh
cp /var/www/peertube/peertube-latest/support/nginx/peertube /etc/nginx/sites-available/peertube
```

Because the PeerTube config is so long, it\'s recommended to use `sed`
to modify the contents of the file, replacing `${WEBSERVER_HOST}` with
your hostname, and `$(PEERTUBE_HOST)` with your localhost and port,
which by default should be `127.0.0.1:9000`:

```sh
sed -i 's/${WEBSERVER_HOST}/videos.thesiah.xyz/g' /etc/nginx/sites-available/peertube
sed -i 's/${PEERTUBE_HOST}/127.0.0.1:9000/g' /etc/nginx/sites-available/peertube
```

Once you\'re happy with the Nginx config file, link it to
`sites-enabled` to activate it:

```sh
ln -s /etc/nginx/sites-available/peertube /etc/nginx/sites-enabled/peertube
```

## Certbot

First, we will want a Certbot SSL certificate to encrypt connections to
our PeerTube instance. Just run the following:

```sh
systemctl stop nginx
certbot certonly --standalone -d videos.thesiah.xyz
systemctl restart nginx
```

## Running PeerTube

A config file for a systemd daemon is included in PeerTube and can be
setup and started like so:

```sh
cp /var/www/peertube/peertube-latest/support/systemd/peertube.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable --now peertube
systemctl start peertube
journalctl -feu peertube
```

PeerTube will take a minute or so to start, but after it does, you can check
its status with `systemctl status peertube` and at this point, your
PeerTube site should be live!

## Using PeerTube

To get the automatically generated admin password, run:

```sh
cat /var/www/peertube/storage/logs/peertube.log | grep password
```

To set a password for your admin user, run:

```sh
cd /var/www/peertube/peertube-latest
NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run reset-password -- -u root
```

Login to your PeerTube instance using the admin email specified in your
`production.yaml` file and the admin password you just set.

{{< img alt="PeerTube login" src="/pix/peertube-login.jpg" >}}

Once logged in, it\'s recommended to create a separate user without
admin privileges for uploading videos to PeerTube. This can be done
easily from the users tab in the administration section.

Enjoy your PeerTube instance!

---

## Updating PeerTube

PeerTube is constantly adding new features, so it\'s a good idea to
[check for new
updates](https://github.com/Chocobozzz/PeerTube/blob/develop/CHANGELOG.md)
and add them if you wish. Just in the past year, they have added
livestreaming and more.

### PeerTube instance

Updating is fairly easy now since an `upgrade.sh` script has been added.
Just run:

```sh
cd /var/www/peertube/peertube-latest/scripts && sudo -H -u peertube ./upgrade.sh
sudo systemctl restart peertube # Or use your OS command to restart PeerTube if you don't use systemd
```

### Update PeerTube configuration

Check for configuration changes, and report them in your `config/production.yaml` file:

```sh
cd /var/www/peertube/versions
diff -u "$(ls -t | head -2 | tail -1)/config/production.yaml.example" "$(ls -t | head -1)/config/production.yaml.example"
```

### Update nginx configuration

Check changes in nginx configuration:

```sh
cd /var/www/peertube/versions
diff -u "$(ls -t | head -2 | tail -1)/support/nginx/peertube" "$(ls -t | head -1)/support/nginx/peertube"
```

### Update systemd service

Check changes in systemd configuration:

```sh
cd /var/www/peertube/versions
diff -u "$(ls -t | head -2 | tail -1)/support/systemd/peertube.service" "$(ls -t | head -1)/support/systemd/peertube.service"
```

### Restart PeerTube

If you changed your nginx configuration:

```sh
sudo systemctl reload nginx
```

If you changed your systemd configuration:

```sh
sudo systemctl daemon-reload
```

Restart PeerTube and check the logs:

```sh
sudo systemctl restart peertube
sudo journalctl -fu peertube
```

Although check the
[changelog](https://github.com/Chocobozzz/PeerTube/blob/develop/CHANGELOG.md)
to see if there are additional manual requirements for particular
updates.

## Things went wrong?

Change peertube-latest destination to the previous version and restore your SQL backup:

```sh
OLD_VERSION="v0.42.42" && SQL_BACKUP_PATH="backup/sql-peertube_prod-2018-01-19T10:18+01:00.bak" && \
  cd /var/www/peertube && sudo -u peertube unlink ./peertube-latest && \
  sudo -u peertube ln -s "versions/peertube-$OLD_VERSION" peertube-latest && \
  sudo -u postgres pg_restore -c -C -d postgres "$SQL_BACKUP_PATH" && \
  sudo systemctl restart peertube
```

## Remote PeerTube CLI

`peertube-cli` is a tool that communicates with a PeerTube instance
using its REST API. It can be launched from a remote server/computer
to easily upload videos, manage plugins, redundancies etc.

### Installation

Ensure you have node installed on your system:

```sh
node --version # Should be >= 16.x
```

Then install the CLI:

```sh
sudo npm install -g @peertube/peertube-cli
```

### CLI wrapper

The wrapper provides a convenient interface to the following sub-commands.

The wrapper can keep track of instances you have an account on. We limit
to one account per instance for now.

```sh
peertube-cli auth add -u 'PEERTUBE_URL' -U 'PEERTUBE_USER' --password 'PEERTUBE_PASSWORD'
peertube-cli auth list
┌──────────────────────────────┬──────────────────────────────┐
│ instance                     │ login                        │
├──────────────────────────────┼──────────────────────────────┤
│ 'PEERTUBE_URL'               │ 'PEERTUBE_USER'              │
└──────────────────────────────┴──────────────────────────────┘
```

### peertube-cli upload

You can use this script to upload videos directly from the CLI.

Videos will be publicly available after transcoding
(you can see them before that in your account on the web interface).

```sh
cd ${CLONE}
peertube-cli upload --help
peertube-cli upload "videoFile"
peertube-cli plugins list
```

peertube-cli plugins

Install/update/uninstall or list local or NPM PeerTube plugins:

```sh
cd ${CLONE}
peertube-cli plugins --help
peertube-cli plugins list --help
peertube-cli plugins install --help
peertube-cli plugins update --help
peertube-cli plugins uninstall --help

peertube-cli plugins install --path /my/plugin/path
peertube-cli plugins install --npm-name peertube-theme-example
```

### peertube-cli redundancy

Manage (list/add/remove) video redundancies:

To list your videos that are duplicated by remote instances:

```sh
peertube-cli redundancy list-remote-redundancies
```

To list remote videos that your instance duplicated:

```sh
peertube-cli redundancy list-my-redundancies
```

To duplicate a specific video in your redundancy system:

```sh
peertube-cli redundancy add --video 823
```

To remove a video redundancy:

```sh
peertube-cli redundancy remove --video 823
```

---

_Written by [TheSiahxyz.](https://thesiah.xyz) Donate Monero
[here](https://thesiah.xyz/donate.html)
[\[QR\]](https://thesiah.xyz/images/monero.jpg)_