production.md 10.5 KB
Newer Older
1
2
# Production guide

Chocobozzz's avatar
Chocobozzz committed
3
  * [Installation](#installation)
4
  * [Upgrade](#upgrade)
Chocobozzz's avatar
Chocobozzz committed
5

6
7
## Installation

Chocobozzz's avatar
Chocobozzz committed
8
Please don't install PeerTube for production on a device behind a low bandwidth connection (example: your ADSL link).
Rigel Kent's avatar
Rigel Kent committed
9
If you want information about the appropriate hardware to run PeerTube, please see the [FAQ](https://joinpeertube.org/en_US/faq#should-i-have-a-big-server-to-run-peertube).
Chocobozzz's avatar
Chocobozzz committed
10

11
12
### Dependencies

13
**Follow the steps of the [dependencies guide](dependencies.md).**
14
15
16

### PeerTube user

17
Create a `peertube` user with `/var/www/peertube` home:
18

Chocobozzz's avatar
Chocobozzz committed
19
```
20
$ sudo useradd -m -d /var/www/peertube -s /bin/bash -p peertube peertube
Thomas Citharel's avatar
Thomas Citharel committed
21
22
23
24
```

Set its password:
```
Chocobozzz's avatar
Chocobozzz committed
25
$ sudo passwd peertube
26
27
```

28
29
30
31
32
33
34
35
**On FreeBSD**

```
$ sudo pw useradd -n peertube -d /var/www/peertube -s /usr/local/bin/bash -m
$ sudo passwd peertube
```
or use `adduser` to create it interactively.

36
37
### Database

Thomas Citharel's avatar
Thomas Citharel committed
38
Create the production database and a peertube user inside PostgreSQL:
39

Chocobozzz's avatar
Chocobozzz committed
40
```
41
$ cd /var/www/peertube
Chocobozzz's avatar
Chocobozzz committed
42
$ sudo -u postgres createuser -P peertube
43
44
```

Chocobozzz's avatar
Chocobozzz committed
45
46
Here you should enter a password for PostgreSQL `peertube` user, that should be copied in `production.yaml` file.
Don't just hit enter else it will be empty.
47
48

```
49
$ sudo -u postgres createdb -O peertube -E UTF8 -T template0 peertube_prod
50
51
```

Chocobozzz's avatar
Chocobozzz committed
52
53
54
55
56
57
58
Then enable extensions PeerTube needs:

```
$ sudo -u postgres psql -c "CREATE EXTENSION pg_trgm;" peertube_prod
$ sudo -u postgres psql -c "CREATE EXTENSION unaccent;" peertube_prod
```

Chocobozzz's avatar
Chocobozzz committed
59
### Prepare PeerTube directory
60

Thomas Citharel's avatar
Thomas Citharel committed
61
62
63
64
Fetch the latest tagged version of Peertube
```
$ 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"
```
65

Thomas Citharel's avatar
Thomas Citharel committed
66
67
Open the peertube directory, create a few required directories
```
Chocobozzz's avatar
Chocobozzz committed
68
69
$ cd /var/www/peertube
$ sudo -u peertube mkdir config storage versions
Chocobozzz's avatar
Chocobozzz committed
70
$ sudo -u peertube chmod 750 config/
Thomas Citharel's avatar
Thomas Citharel committed
71
```
72

Thomas Citharel's avatar
Thomas Citharel committed
73
Download the latest version of the Peertube client, unzip it and remove the zip
Chocobozzz's avatar
Chocobozzz committed
74
```
Chocobozzz's avatar
Chocobozzz committed
75
$ cd /var/www/peertube/versions
Thomas Citharel's avatar
Thomas Citharel committed
76
$ sudo -u peertube wget -q "https://github.com/Chocobozzz/PeerTube/releases/download/${VERSION}/peertube-${VERSION}.zip"
77
$ sudo -u peertube unzip -q peertube-${VERSION}.zip && sudo -u peertube rm peertube-${VERSION}.zip
Thomas Citharel's avatar
Thomas Citharel committed
78
```
79

David Libeau's avatar
David Libeau committed
80
Install Peertube:
Thomas Citharel's avatar
Thomas Citharel committed
81
```
Chocobozzz's avatar
Chocobozzz committed
82
83
$ cd /var/www/peertube
$ sudo -u peertube ln -s versions/peertube-${VERSION} ./peertube-latest
84
$ cd ./peertube-latest && sudo -H -u peertube yarn install --production --pure-lockfile
85
86
87
88
```

### PeerTube configuration

Chocobozzz's avatar
Chocobozzz committed
89
90
91
92
Copy the default configuration file that contains the default configuration provided by PeerTube.
You **must not** update this file.

```
Chocobozzz's avatar
Chocobozzz committed
93
94
$ cd /var/www/peertube
$ sudo -u peertube cp peertube-latest/config/default.yaml config/default.yaml
Chocobozzz's avatar
Chocobozzz committed
95
96
97
```

Now copy the production example configuration:
98

Chocobozzz's avatar
Chocobozzz committed
99
```
Chocobozzz's avatar
Chocobozzz committed
100
101
$ cd /var/www/peertube
$ sudo -u peertube cp peertube-latest/config/production.yaml.example config/production.yaml
102
103
104
```

Then edit the `config/production.yaml` file according to your webserver
Chocobozzz's avatar
Chocobozzz committed
105
106
and database configuration (`webserver`, `database`, `redis`, `smtp` and `admin.email` sections in particular).
Keys defined in `config/production.yaml` will override keys defined in `config/default.yaml`.
107

Chocobozzz's avatar
Chocobozzz committed
108
**PeerTube does not support webserver host change**. Even though [PeerTube CLI can help you to switch hostname](https://docs.joinpeertube.org/maintain-tools?id=update-hostjs) there's no official support for that since it is a risky operation that might result in unforeseen errors.
109

110
111
### Webserver

112
113
We only provide official configuration files for Nginx.

114
115
Copy the nginx configuration template:

Chocobozzz's avatar
Chocobozzz committed
116
```
117
$ sudo cp /var/www/peertube/peertube-latest/support/nginx/peertube /etc/nginx/sites-available/peertube
118
119
```

Chocobozzz's avatar
Chocobozzz committed
120
121
Then set the domain for the webserver configuration file.
Replace `[peertube-domain]` with the domain for the peertube server.
122
123

```
124
$ sudo sed -i 's/${WEBSERVER_HOST}/[peertube-domain]/g' /etc/nginx/sites-available/peertube
125
$ sudo sed -i 's/${PEERTUBE_HOST}/127.0.0.1:9000/g' /etc/nginx/sites-available/peertube
126
127
```

Chocobozzz's avatar
Chocobozzz committed
128
129
Then modify the webserver configuration file. Please pay attention to the `alias` keys of the static locations.
It should correspond to the paths of your storage directories (set in the configuration file inside the `storage` key).
130

Chocobozzz's avatar
Chocobozzz committed
131
```
132
133
134
$ sudo vim /etc/nginx/sites-available/peertube
```

Chocobozzz's avatar
Chocobozzz committed
135
136
137
138
139
140
141
142
143
144
Activate the configuration file:

```
$ sudo ln -s /etc/nginx/sites-available/peertube /etc/nginx/sites-enabled/peertube
```

To generate the certificate for your domain as required to make https work you can use [Let's Encrypt](https://letsencrypt.org/):

```
$ sudo systemctl stop nginx
G4dter's avatar
G4dter committed
145
$ sudo certbot certonly --standalone --post-hook "systemctl restart nginx"
146
$ sudo systemctl reload nginx
147
148
```

Chocobozzz's avatar
Chocobozzz committed
149
Now you have the certificates you can reload nginx:
150

Chocobozzz's avatar
Chocobozzz committed
151
```
152
153
154
$ sudo systemctl reload nginx
```

Chocobozzz's avatar
Chocobozzz committed
155
156
157
158
159
Certbot should have installed a cron to automatically renew your certificate.
Since our nginx template supports webroot renewal, we suggest you to update the renewal config file to use the `webroot` authenticator:

```
$ # Replace authenticator = standalone by authenticator = webroot
G4dter's avatar
G4dter committed
160
$ # Add webroot_path = /var/www/certbot
Chocobozzz's avatar
Chocobozzz committed
161
162
163
$ sudo vim /etc/letsencrypt/renewal/your-domain.com.conf
```

164
165
166
167
168
169
170
**FreeBSD**
On FreeBSD you can use [Dehydrated](https://dehydrated.io/) `security/dehydrated` for [Let's Encrypt](https://letsencrypt.org/)

```
$ sudo pkg install dehydrated
```

171
172
173
174
175
176
177
178
179
180
181
182
183
### TCP/IP Tuning

**On Linux**

```
$ sudo cp /var/www/peertube/peertube-latest/support/sysctl.d/30-peertube-tcp.conf /etc/sysctl.d/
$ sudo sysctl -p /etc/sysctl.d/30-peertube-tcp.conf
```

Your distro may enable this by default, but at least Debian 9 does not, and the default FIFO
scheduler is quite prone to "Buffer Bloat" and extreme latency when dealing with slower client
links as we often encounter in a video server.

Chocobozzz's avatar
Chocobozzz committed
184
### systemd
185

Chocobozzz's avatar
Chocobozzz committed
186
If your OS uses systemd, copy the configuration template:
187

Chocobozzz's avatar
Chocobozzz committed
188
```
189
$ sudo cp /var/www/peertube/peertube-latest/support/systemd/peertube.service /etc/systemd/system/
190
191
```

Chocobozzz's avatar
Chocobozzz committed
192
Check the service file (PeerTube paths and security directives):
193

Chocobozzz's avatar
Chocobozzz committed
194
```
Chocobozzz's avatar
Chocobozzz committed
195
$ sudo vim /etc/systemd/system/peertube.service
196
197
198
199
200
```


Tell systemd to reload its config:

Chocobozzz's avatar
Chocobozzz committed
201
```
Chocobozzz's avatar
Chocobozzz committed
202
$ sudo systemctl daemon-reload
203
204
```

Chocobozzz's avatar
Chocobozzz committed
205
206
207
If you want to start PeerTube on boot:

```
taziden's avatar
taziden committed
208
$ sudo systemctl enable peertube
Chocobozzz's avatar
Chocobozzz committed
209
210
```

Chocobozzz's avatar
Chocobozzz committed
211
Run:
212

Chocobozzz's avatar
Chocobozzz committed
213
```
Chocobozzz's avatar
Chocobozzz committed
214
215
$ sudo systemctl start peertube
$ sudo journalctl -feu peertube
216
217
```

Chocobozzz's avatar
Chocobozzz committed
218
219
**FreeBSD**
On FreeBSD, copy the startup script and update rc.conf:
Gérald Niel's avatar
Gérald Niel committed
220
221

```
222
223
$ sudo install -m 0555 /var/www/peertube/peertube-latest/support/freebsd/peertube /usr/local/etc/rc.d/
$ sudo sysrc peertube_enable="YES"
Gérald Niel's avatar
Gérald Niel committed
224
225
```

Chocobozzz's avatar
Chocobozzz committed
226
Run:
Gérald Niel's avatar
Gérald Niel committed
227
228
229
230
231

```
$ sudo service peertube start
```

232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
### OpenRC

If your OS uses OpenRC, copy the service script:

```
$ sudo cp /var/www/peertube/peertube-latest/support/init.d/peertube /etc/init.d/
```

If you want to start PeerTube on boot:

```
$ sudo rc-update add peertube default
```

Run and print last logs:

```
$ sudo /etc/init.d/peertube start
$ tail -f /var/log/peertube/peertube.log
```

253
254
### Administrator

Chocobozzz's avatar
Chocobozzz committed
255
256
The administrator password is automatically generated and can be found in the PeerTube
logs (path defined in `production.yaml`). You can also set another password with:
257

Chocobozzz's avatar
Chocobozzz committed
258
```
259
$ cd /var/www/peertube/peertube-latest && NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run reset-password -- -u root
260
261
```

262
263
264
Alternatively you can set the environment variable `PT_INITIAL_ROOT_PASSWORD`,
to your own administrator password, although it must be 6 characters or more.

265
266
267
### What now?

Now your instance is up you can:
Chocobozzz's avatar
Chocobozzz committed
268

Steffen Möller's avatar
Steffen Möller committed
269
 * Add your instance to the public PeerTube instances index if you want to: https://instances.joinpeertube.org/
270
 * Check [available CLI tools](/support/doc/tools.md)
Chocobozzz's avatar
Chocobozzz committed
271

272
273
## Upgrade

Chocobozzz's avatar
Chocobozzz committed
274
### PeerTube instance
275
276
277

**Check the changelog (in particular BREAKING CHANGES!):** https://github.com/Chocobozzz/PeerTube/blob/develop/CHANGELOG.md

278
#### Auto
279

280
281
The password it asks is PeerTube's database user password.

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

Chocobozzz's avatar
Chocobozzz committed
287
288
#### Manually

289
Make a SQL backup
290
291
292

```
$ SQL_BACKUP_PATH="backup/sql-peertube_prod-$(date -Im).bak" && \
293
    cd /var/www/peertube && sudo -u peertube mkdir -p backup && \
294
    sudo -u postgres pg_dump -F c peertube_prod | sudo -u peertube tee "$SQL_BACKUP_PATH" >/dev/null
295
296
```

297
Fetch the latest tagged version of Peertube:
298
299

```
300
$ 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"
301
302
```

303
Download the new version and unzip it:
304

Chocobozzz's avatar
Chocobozzz committed
305
```
306
$ cd /var/www/peertube/versions && \
307
    sudo -u peertube wget -q "https://github.com/Chocobozzz/PeerTube/releases/download/${VERSION}/peertube-${VERSION}.zip" && \
308
309
310
311
    sudo -u peertube unzip -o peertube-${VERSION}.zip && \
    sudo -u peertube rm peertube-${VERSION}.zip
```

Chocobozzz's avatar
Chocobozzz committed
312
Install node dependencies:
313
314

```
Chocobozzz's avatar
Chocobozzz committed
315
$ cd /var/www/peertube/versions/peertube-${VERSION} && \
316
    sudo -H -u peertube yarn install --production --pure-lockfile
317
318
```

Chocobozzz's avatar
Chocobozzz committed
319
Copy new configuration defaults values and update your configuration file:
320

321
```
Chocobozzz's avatar
Chocobozzz committed
322
$ sudo -u peertube cp /var/www/peertube/versions/peertube-${VERSION}/config/default.yaml /var/www/peertube/config/default.yaml
Chocobozzz's avatar
Chocobozzz committed
323
$ diff /var/www/peertube/versions/peertube-${VERSION}/config/production.yaml.example /var/www/peertube/config/production.yaml
324
325
```

Chocobozzz's avatar
Chocobozzz committed
326
Change the link to point to the latest version:
327
328

```
Chocobozzz's avatar
Chocobozzz committed
329
$ cd /var/www/peertube && \
330
    sudo unlink ./peertube-latest && \
Chocobozzz's avatar
Chocobozzz committed
331
    sudo -u peertube ln -s versions/peertube-${VERSION} ./peertube-latest
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
### nginx

Check changes in nginx configuration:

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

### systemd

Check changes in systemd configuration:

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

### Restart PeerTube

If you changed your nginx configuration:

```
$ sudo systemctl reload nginx
```

If you changed your systemd configuration:
Chocobozzz's avatar
Chocobozzz committed
361

362
```
363
364
365
366
367
368
369
$ sudo systemctl daemon-reload
```

Restart PeerTube and check the logs:

```
$ sudo systemctl restart peertube && sudo journalctl -fu peertube
370
371
```

372
### Things went wrong?
373

374
Change `peertube-latest` destination to the previous version and restore your SQL backup:
375
376
377

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