diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 989087728..dec6a5cd0 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -1,14 +1,12 @@
# Welcome to the contributing guide for PeerTube
-Interesting in contributing? Awesome :)
+Interesting in contributing? Awesome!
**Quick Links:**
* [Give your feedback](#give-your-feedback)
- * [Develop on the Server side](#develop-on-the-server-side)
- * [Develop on the Client side](#develop-on-the-client-side)
- * [Get started with development](#get-started-with-development)
* [Write documentation](#write-documentation)
+ * [Develop](#develop)
## Give your feedback
@@ -16,40 +14,32 @@ Interesting in contributing? Awesome :)
You don't need to know how to code to start contributing to PeerTube! Other
contributions are very valuable too, among which: you can test the software and
report bugs, you can give feedback on potential bugs, features that you are
-interested in, user interace, design, decentralized architecture...
+interested in, user interface, design, decentralized architecture...
-## Development
+## Write documentation
-## Develop on the Server side
+You can help to write the documentation of the REST API, code, architecture,
+demonstrations...
-The server is a web server developed with
-[NodeJS](https://nodejs.org)/[Express](http://expressjs.com).
-
-Newcomer? You can find a documentation of the server code/architecture
-[here](https://github.com/Chocobozzz/PeerTube/blob/master/support/doc/server/code.md).
+## Develop
Don't hesitate to talk about features you want to develop by creating an issue
before you start working on them :).
-
-## Develop on the Client side
-
-The client is a web application developed with
-[TypeScript](https://www.typescriptlang.org/)/[Angular2](https://angular.io/).
-
-Newcomer? You can find a documentation of the server code/architecture
-[here](https://github.com/Chocobozzz/PeerTube/blob/master/support/doc/client/code.md).
-
-
-## Get started with development
-
-In this mode, the server will run requests between instances more quickly, the
-video durations are limited to a few seconds.
-
### Prerequisites
-First, make sure that you have followed the steps to install the dependencies.
+First, make sure that you have followed
+[the steps](/support/doc/dependencies.md)
+to install the dependencies.
+
+Then clone the sources and install node modules:
+
+```bash
+$ git clone -b master https://github.com/Chocobozzz/PeerTube
+$ cd PeerTube
+$ yarn install --pure-lockfile
+```
Then, create a postgres database and user with the values set in the
`config/default.yaml` file. For instance, if you do not change the values
@@ -57,40 +47,51 @@ there, the following commands would create a new database called `peertube_dev`
and a postgres user called `peertube` with password `peertube`:
```bash
- # sudo -u postgres createuser -P peertube
- Enter password for new role: peertube
- # sudo -u postgres createdb -O peertube peertube_dev
+# sudo -u postgres createuser -P peertube
+Enter password for new role: peertube
+# sudo -u postgres createdb -O peertube peertube_dev
```
+In dev mode, administrator username is **root** and password is **test**.
+
### Server side
+You can find a documentation of the server code/architecture [here](/support/doc/development/server/code.md).
+
To develop on the server-side:
```bash
- $ npm run dev:server
+$ npm run dev:server
```
Then, the server will listen on `localhost:9000`. When server source files
change, these are automatically recompiled and the server will automatically
-restart.
+restart. Server is in `TEST` mode so it will run requests between instances more quickly.
### Client side
+You can find a documentation of the server code/architecture
+[here](/support/doc/development/client/code.md).
+
+
To develop on the client side:
```bash
- $ npm run dev:client
+$ npm run dev:client
```
The API will listen on `localhost:9000` and the frontend on `localhost:3000`.
Client files are automatically compiled on change, and the web browser will
reload them automatically thanks to hot module replacement.
-**Username**: *root*
-**Password**: *test*
+### Test federation
+This will run 3 nodes:
-## Write documentation
+```bash
+$ npm run clean:server:test
+$ npm run play
+```
-You can help to write the documentation of the REST API, code, architecture,
-demonstrations...
+Then you will get access to the three nodes at `http://localhost:900{1,2,3}`
+with the `root` as username and `test{1,2,3}` for the password.
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index 74ea70939..c6f2dd064 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -1,10 +1,15 @@
-
+
+
+* **PeerTube version or commit:**
+* **Browser name/version:**
+* **NodeJS version:**
+* **PostgreSQL version:**
+
+
+* **What is the expected behaviour?**
+* **What do you see instead?**
+
+
+* **Browser console log if useful (Gist/Pastebin...):**
+* **Server log if useful (Gist/Pastebin...):**
-* Browser name/version:
-* Console log if useful (Gist/Pastebin...):
diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md
index cf0dcfacd..160d6fc4f 100644
--- a/ARCHITECTURE.md
+++ b/ARCHITECTURE.md
@@ -18,7 +18,7 @@
* We use the [ActivityPub](https://www.w3.org/TR/activitypub/) protocol (only
server-server for now). Object models could be found in
[shared/models/activitypub
- directory](https://github.com/Chocobozzz/PeerTube/tree/develop/shared/models/activitypub).
+ directory](/shared/models/activitypub).
* All the requests are retried several times if they fail.
### Instance
diff --git a/FAQ.md b/FAQ.md
index 06c86ce10..1bcd6006a 100644
--- a/FAQ.md
+++ b/FAQ.md
@@ -31,9 +31,9 @@ We think it is acceptable for a video platform.
WEBM, MP4 or OGV videos.
-## I want to change my host or move to HTTPS, how can I do that?
+## I want to change my host, how can I do that?
If you already have followers, you can't.
If you don't have any followers, update your configuration and run
-`NODE_ENV=production npm run update-host` to update the torrent files.
+`NODE_ENV=production npm run update-host` to update the torrent files (they contain your domain name).
diff --git a/README.md b/README.md
index 094d81c4a..7972fbed8 100644
--- a/README.md
+++ b/README.md
@@ -64,13 +64,12 @@ donating them](https://soutenir.framasoft.org/en/).**
Want to see it in action?
- * [Demo server](http://peertube.cpy.re)
+ * Demonstration servers:
+ * [peertube.cpy.re](http://peertube.cpy.re)
+ * [peertube2.cpy.re](http://peertube2.cpy.re)
+ * [peertube3.cpy.re](http://peertube3.cpy.re)
* [Video](https://peertube.cpy.re/videos/watch/f78a97f8-a142-4ce1-a5bd-154bf9386504)
to see how the "decentralization feature" looks like
- * Experimental demo servers that share videos (they are in the same
- network): [peertube2](http://peertube2.cpy.re),
- [peertube3](http://peertube3.cpy.re). Since I do experiments with them,
- sometimes they might not work correctly.
## Why
@@ -83,12 +82,11 @@ So we need to have a decentralized network of servers seeding videos (as
enough because one video could become famous and overload the server. It's the
reason why we need to use a P2P protocol to limit the server load. Thanks to
[WebTorrent](https://github.com/feross/webtorrent), we can make P2P (thus
-bittorrent) inside the web browser, as of today.
+BitTorrent) inside the web browser, as of today.
## Features
-- [X] Frontend
- - [X] Angular frontend
+- [X] Angular frontend
- [X] Join the fediverse
- [X] Follow other instances
- [X] Unfollow an instance
@@ -103,8 +101,8 @@ bittorrent) inside the web browser, as of today.
- [X] OpenGraph tags
- [X] OEmbed
- [X] Update video
-- [X] Videos view counter
-- [X] Videos likes/dislikes
+- [X] Federated videos view counter
+- [X] Federated videos likes/dislikes
- [X] Transcoding to different definitions
- [X] Download file/torrent
- [X] User video bytes quota
@@ -115,140 +113,32 @@ bittorrent) inside the web browser, as of today.
- [X] User registration
- [X] Video privacy settings (public, unlisted or private)
- [X] Signaling a video to the admin origin PeerTube instance
-- [ ] Videos comments
+- [X] Federated videos comments
+- [ ] Video imports (URL, Torrent, YouTube...)
+- [ ] Advanced search
+- [ ] Subtitles
- [ ] User playlist
- [ ] User subscriptions (by tags, author...)
- [ ] Add "DDOS" security
-## Installation
+## Front compatibility
-See [wiki](https://github.com/Chocobozzz/PeerTube/wiki) for complete
-installation commands.
+ * Firefox
+ * Chrome/Chromium
-### Front compatibility
-
- * Chromium
- * Firefox (>= 42 for MediaSource support)
-
-### Dependencies
+## Dependencies
+ * nginx
+ * PostgreSQL
* **NodeJS >= 8.x**
* yarn
* OpenSSL (cli)
- * PostgreSQL
* FFmpeg
-#### Debian
+## Production
- 1. Install NodeJS 8.x (current LTS):
- [https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions](https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions)
- 2. Install yarn:
- [https://yarnpkg.com/en/docs/install](https://yarnpkg.com/en/docs/install)
- 4. Run:
-
-```bash
- $ apt-get update
- $ apt-get install ffmpeg postgresql openssl
-```
-
-#### Ubuntu 16.04
-
- 1. Install NodeJS 8.x (current LTS): (same as Debian)
- 2. Install yarn: (same as Debian)
- 3. Run:
-
-```bash
- $ apt-get update
- $ apt-get install ffmpeg postgresql openssl
-```
-
-#### Arch Linux
-
- 1. Run:
-
-```bash
- $ pacman -S nodejs yarn ffmpeg postgresql openssl
-```
-
-#### Other distributions
-
-Feel free to update this README file in a pull request!
-
-### Build from the sources
-
-```bash
- $ git clone -b master https://github.com/Chocobozzz/PeerTube
- $ cd PeerTube
- $ yarn install
- $ npm run build
-```
-
-## Usage
-
-### Production
-
-If you want to run PeerTube in production (which might be a bad idea for now :) ):
-
-```bash
- $ cp config/production.yaml.example config/production.yaml
-```
-
-Then edit the `config/production.yaml` file according to your webserver
-configuration. Keys set in this file will override those of
-`config/default.yml`.
-
-Finally, run the server with the `NODE_ENV` environment variable set to
-`production`:
-
-```bash
- $ NODE_ENV=production npm start
-```
-
-The administrator password is automatically generated and can be found in the
-logs. You can set another password with:
-
-```bash
- $ NODE_ENV=production npm run reset-password -- -u root
-```
-
-**Nginx template** (reverse proxy): https://github.com/Chocobozzz/PeerTube/tree/master/support/nginx
-**Systemd template**: https://github.com/Chocobozzz/PeerTube/tree/master/support/systemd
-
-You can check the application (CORS headers, tracker websocket...) by running:
-
-```bash
- $ NODE_ENV=production npm run check
-```
-
-### Upgrade
-
-The following commands will upgrade the source (according to your current
-branch), upgrade node modules and rebuild client application:
-
-```bash
- # systemctl stop peertube
- $ npm run upgrade-peertube
- # systemctl start peertube
-```
-
-### Test with three fresh nodes
-
-```bash
- $ npm run clean:server:test
- $ npm run play
-```
-
-Then you will get access to the three nodes at `http://localhost:900{1,2,3}`
-with the `root` as username and `test{1,2,3}` for the password.
-
-### Other commands
-
-To print all available commands, run:
-
-```bash
- $ npm run help
-```
+See the [production guide](support/doc/production.md).
## Contributing
diff --git a/package.json b/package.json
index 8f72daa4d..efe03dc04 100644
--- a/package.json
+++ b/package.json
@@ -34,7 +34,6 @@
"dev:server": "scripty",
"dev:client": "scripty",
"start": "node dist/server",
- "check": "ts-node ./scripts/check.ts",
"upgrade-peertube": "scripty",
"upgrade": "echo 'This command was renamed to upgrade-peertube.'",
"update-host": "ts-node ./scripts/update-host.ts",
diff --git a/scripts/check.ts b/scripts/check.ts
deleted file mode 100755
index 24f4806af..000000000
--- a/scripts/check.ts
+++ /dev/null
@@ -1,171 +0,0 @@
-import * as series from 'async/series'
-import * as request from 'request'
-import * as WebSocket from 'ws'
-
-import { CONFIG } from '../server/initializers/constants'
-
-const requestHeaders = {
- 'Range': '',
- 'Keep-Alive': '',
- 'User-Agent': 'Mozilla',
- 'Cache-Control': 'no-cache',
- 'Content-Type': '',
- 'Host': 'example.com',
- 'Access-Control-Request-Method': 'GET',
- 'Access-Control-Request-Headers': 'range'
-}
-
-series([
- pingServer,
- checkCORSTorrent,
- checkCORSWebSeed,
- checkTracker
-], function () {
- process.exit(0)
-})
-
-// ---------------------------------------------------------------------------
-
-function pingServer (callback: () => void) {
- const pingUrl = CONFIG.WEBSERVER.URL + '/api/v1/ping'
- console.log('Checking server is up (%s)...', pingUrl)
-
- request(pingUrl, function (err, res, body) {
- if (!err && res.statusCode === 200 && body === 'pong') {
- console.log('SUCCESS.')
- } else {
- console.log('FAIL.')
- }
-
- callback()
- })
-}
-
-function checkCORSTorrent (callback: () => void) {
- const torrentUrl = CONFIG.WEBSERVER.URL + '/static/torrents/test.torrent'
- console.log('Checking CORS headers for the torrent (%s)...', torrentUrl)
-
- request({
- method: 'OPTIONS',
- uri: torrentUrl,
- headers: requestHeaders
- }, function (err, res) {
- if (err || isThereValidCORSHeaders(res) === false) {
- console.error('FAIL.')
- } else {
- console.log('SUCCESS.')
- }
-
- callback()
- })
-}
-
-function checkCORSWebSeed (callback: () => void) {
- const webseedUrl = CONFIG.WEBSERVER.URL + '/static/webseed/test.mp4'
- console.log('Checking CORS headers for the video (%s)...', webseedUrl)
-
- request({
- method: 'OPTIONS',
- uri: webseedUrl,
- headers: requestHeaders
- }, function (err, res) {
- if (err || isThereValidCORSHeaders(res) === false) {
- console.error('FAIL.')
- } else {
- console.log('SUCCESS.')
- }
-
- callback()
- })
-}
-
-function checkTracker (callback: () => void) {
- const trackerUrl = CONFIG.WEBSERVER.WS + '://' +
- CONFIG.WEBSERVER.HOST +
- '/tracker/socket'
- console.log('Checking tracker websocket (%s)...', trackerUrl)
-
- let ws = null
- ws = new WebSocket(trackerUrl)
-
- const timeout = setTimeout(failed, 1000)
- ws.on('open', onOpen)
-
- function onOpen () {
- clearTimeout(timeout)
- ws.close()
-
- console.log('SUCCESS.')
- callback()
- }
-
- function failed () {
- ws.removeListener('open', onOpen)
- ws.close()
-
- console.log('FAILED.')
- callback()
- }
-}
-
-function isThereValidCORSHeaders (res: request.RequestResponse) {
- let fail = false
-
- // Check Access-Control-Allow-Origin
- const headerAllowOriginKey = 'access-control-allow-origin'
- const headerAllowOrigin = res.headers[headerAllowOriginKey]
-
- if (!headerAllowOrigin) {
- console.error(headerAllowOriginKey + ' is not present.')
- fail = true
- } else if (headerAllowOrigin !== '*') {
- console.error(headerAllowOriginKey + ' does not equal "*".')
- fail = true
- }
-
- // Check Access-Control-Allow-Methods
- const headerAllowMethodsKey = 'access-control-allow-methods'
- const headerAllowMethods = res.headers[headerAllowMethodsKey]
- if (!headerAllowMethods) {
- console.error(headerAllowMethodsKey + ' is not present.')
- fail = true
- } else {
- const allowMethodsMissed = findPatternNotInString(headerAllowMethods as string, [ 'get' ])
- if (allowMethodsMissed !== null) {
- console.error(headerAllowMethodsKey + ' misses the ' + allowMethodsMissed + ' method.')
- fail = true
- }
- }
-
- // Check Access-Control-Allow-Headers
- const headerAllowHeadersKey = 'access-control-allow-headers'
- const headerAllowHeaders = res.headers[headerAllowHeadersKey]
- if (!headerAllowHeaders) {
- console.error(headerAllowHeadersKey + ' is not present.')
- fail = true
- } else {
- const headersThatShouldBePresent = [
- 'Range'
- ]
- const allowHeadersMissed = findPatternNotInString(headerAllowHeaders as string, headersThatShouldBePresent)
- if (allowHeadersMissed !== null) {
- console.error(headerAllowHeadersKey + ' misses the ' + allowHeadersMissed + ' header.')
- fail = true
- }
- }
-
- return !fail
-}
-
-function findPatternNotInString (stringChain: string, patterns: string[]) {
- let res = null
- const stringChainLowerCase = stringChain.toLowerCase()
-
- patterns.forEach(function (pattern) {
- if (stringChainLowerCase.indexOf(pattern.toLowerCase()) === -1) {
- res = pattern
- }
- })
-
- return res
-}
diff --git a/support/doc/dependencies.md b/support/doc/dependencies.md
new file mode 100644
index 000000000..d77724b5a
--- /dev/null
+++ b/support/doc/dependencies.md
@@ -0,0 +1,29 @@
+# Installation
+
+## Dependencies
+
+### Debian / Ubuntu
+
+ 1. Install NodeJS 8.x (current LTS):
+ [https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions](https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions)
+ 2. Install yarn:
+ [https://yarnpkg.com/en/docs/install](https://yarnpkg.com/en/docs/install)
+ 4. Run:
+
+```bash
+$ apt-get update
+$ apt-get install nginx ffmpeg postgresql openssl g++ make
+```
+
+### Arch Linux
+
+ 1. Run:
+
+```bash
+$ pacman -S nodejs yarn ffmpeg postgresql openssl
+```
+
+### Other distributions
+
+Feel free to update this file in a pull request!
+
diff --git a/support/doc/development/client/code.md b/support/doc/development/client/code.md
index ddd277e54..749783c29 100644
--- a/support/doc/development/client/code.md
+++ b/support/doc/development/client/code.md
@@ -53,12 +53,7 @@ Details of the Angular application file structure. It tries to follow [the offic
Uses [TSLint](https://palantir.github.io/tslint/) for TypeScript linting and [Angular styleguide](https://angular.io/docs/ts/latest/guide/style-guide.html).
-## Developing
-
- * Install [the dependencies](https://github.com/Chocobozzz/PeerTube#dependencies)
- * Run `yarn install --pure-lockfile` at the root directory to install all the dependencies
- * Run PostgreSQL and create the database `peertube_dev`.
- * Run `npm run dev:client` to compile the client, run the server, watch client files modifications and reload modules on the fly (you don't need to refresh manually the web browser). The API listen on `localhost:9000` and the client on `localhost:3000`.
+## Concepts
In a Angular application, we create components that we put together. Each component is defined by an HTML structure, a TypeScript file and optionally a SASS file.
If you are not familiar with Angular I recommend you to read the [quickstart guide](https://angular.io/docs/ts/latest/quickstart.html).
diff --git a/support/doc/development/server/code.md b/support/doc/development/server/code.md
index d909b0c3d..ddb93119b 100644
--- a/support/doc/development/server/code.md
+++ b/support/doc/development/server/code.md
@@ -36,21 +36,6 @@ All other server files are in the [server](https://github.com/Chocobozzz/PeerTub
Uses [JavaScript Standard Style](http://standardjs.com/).
-
-## Developing
-
- * Install [the dependencies](https://github.com/Chocobozzz/PeerTube#dependencies)
- * Run `yarn install` at the root directory to install all the dependencies
- * Run PostgreSQL and create the database `peertube_dev`.
- * Run `npm run dev:server` to run the server, watch server files modifications and restart it automatically. The server (API + client) listen on `localhost:9000`.
-
-The `NODE_ENV=test` is set to speed up communications between instances (see [constants.ts](https://github.com/Chocobozzz/PeerTube/blob/master/server/initializers/constants.ts)).
-
-`npm run help` gives you all available commands.
-
-If you want to test the decentralization feature, you can easily run 3 instances by running `npm run play`. The instances password are `test1`, `test2` and `test3`.
-
-
## Architecture
The server is composed by:
diff --git a/support/doc/production.md b/support/doc/production.md
new file mode 100644
index 000000000..4d7c14f2b
--- /dev/null
+++ b/support/doc/production.md
@@ -0,0 +1,227 @@
+# Production guide
+
+## Installation
+
+### Dependencies
+
+Follow the steps of the [dependencies guide](dependencies.md).
+
+### PeerTube user
+
+Create a `peertube` user with `/home/peertube` home:
+
+```bash
+sudo useradd -m -d /home/peertube -s /bin/bash -p peertube peertube
+sudo passwd peertube
+```
+
+### Database
+
+Create production database and peertube user:
+
+```bash
+sudo -u postgres createuser -P peertube
+sudo -u postgres createdb -O peertube peertube_prod
+```
+
+### Sources
+
+Clone, install node dependencies and build application:
+
+```bash
+$ cd /home/peertube
+$ sudo -u peertube git clone -b master https://github.com/Chocobozzz/PeerTube
+$ cd PeerTube
+$ sudo -u peertube yarn install --pure-lockfile
+$ sudo -u peertube npm run build
+```
+
+### PeerTube configuration
+
+Copy example configuration:
+
+```bash
+$ sudo -u peertube cp config/production.yaml.example config/production.yaml
+```
+
+Then edit the `config/production.yaml` file according to your webserver
+configuration. Keys set in this file will override those of
+`config/default.yml`.
+
+### Webserver
+
+Copy the nginx configuration template:
+
+```bash
+$ sudo cp /home/peertube/PeerTube/support/nginx/peertube-https /etc/nginx/sites-available/peertube
+```
+
+Then modify the webserver configuration file. Please pay attention to the `alias` key of `/static/webseed` location.
+It should correspond to the path of your videos directory (set in the configuration file as `storage->videos` key).
+
+```bash
+$ sudo vim /etc/nginx/sites-available/peertube
+```
+
+If you want to set https with Let's Encrypt please follow the steps of [this guide](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04).
+
+An example of the nginx configuration could be:
+
+```
+server {
+ listen 80;
+ listen [::]:80;
+ server_name peertube.example.com;
+
+ access_log /var/log/nginx/peertube.example.com.access.log;
+ error_log /var/log/nginx/peertube.example.com.error.log;
+
+ rewrite ^ https://$server_name$request_uri? permanent;
+}
+
+server {
+ listen 443 ssl http2;
+ listen [::]:443 ssl http2;
+ server_name peertube.example.com;
+
+ # For example with Let's Encrypt
+ ssl_certificate /etc/letsencrypt/live/peertube.example.com/fullchain.pem;
+ ssl_certificate_key /etc/letsencrypt/live/peertube.example.com/privkey.pem;
+ ssl_trusted_certificate /etc/letsencrypt/live/peertube.example.com/chain.pem;
+
+ access_log /var/log/nginx/peertube.example.com.access.log;
+ error_log /var/log/nginx/peertube.example.com.error.log;
+
+ location ^~ '/.well-known/acme-challenge' {
+ default_type "text/plain";
+ root /var/www/certbot;
+ }
+
+ location / {
+ proxy_pass http://localhost:9000;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+
+ # For the video upload
+ client_max_body_size 8G;
+ proxy_connect_timeout 600;
+ proxy_send_timeout 600;
+ proxy_read_timeout 600;
+ send_timeout 600;
+ }
+
+ # Bypass PeerTube webseed route for better performances
+ location /static/webseed {
+ if ($request_method = 'OPTIONS') {
+ add_header 'Access-Control-Allow-Origin' '*';
+ add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
+ add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
+ add_header 'Access-Control-Max-Age' 1728000;
+ add_header 'Content-Type' 'text/plain charset=UTF-8';
+ add_header 'Content-Length' 0;
+ return 204;
+ }
+
+ if ($request_method = 'GET') {
+ add_header 'Access-Control-Allow-Origin' '*';
+ add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
+ add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
+ }
+
+ alias /var/www/PeerTube/videos;
+ }
+
+ # Websocket tracker
+ location /tracker/socket {
+ # Peers send a message to the tracker every 15 minutes
+ # Don't close the websocket before this time
+ proxy_read_timeout 1200s;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+ proxy_http_version 1.1;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header Host $host;
+ proxy_pass http://localhost:9000;
+ }
+}
+```
+
+
+Activate the configuration file:
+
+```bash
+$ sudo ln -s /etc/nginx/sites-available/peertube /etc/nginx/sites-enabled/peertube
+$ sudo systemctl reload nginx
+```
+
+### Systemd
+
+Copy the nginx configuration template:
+
+```bash
+sudo cp /home/peertube/PeerTube/support/systemd/peertube.service /etc/systemd/system/
+```
+
+Update the service file:
+
+```bash
+sudo vim /etc/systemd/system/peertube.service
+```
+
+It should look like this:
+
+```
+[Unit]
+Description=PeerTube daemon
+After=network.target
+
+[Service]
+Type=simple
+Environment=NODE_ENV=production
+User=peertube
+Group=peertube
+ExecStart=/usr/bin/npm start
+WorkingDirectory=/home/peertube/PeerTube
+StandardOutput=syslog
+StandardError=syslog
+SyslogIdentifier=peertube
+Restart=always
+
+[Install]
+WantedBy=multi-user.target
+```
+
+
+Tell systemd to reload its config:
+
+```bash
+sudo systemctl daemon-reload
+```
+
+### Run
+
+```bash
+sudo systemctl start peertube
+sudo journalctl -feu peertube
+```
+
+### Administrator
+
+The administrator password is automatically generated and can be found in the
+logs. You can set another password with:
+
+```bash
+$ NODE_ENV=production npm run reset-password -- -u root
+```
+
+## Upgrade
+
+The following commands will upgrade the source (according to your current
+branch), upgrade node modules and rebuild client application:
+
+```bash
+# systemctl stop peertube
+$ npm run upgrade-peertube
+# systemctl start peertube
+```
diff --git a/support/systemd/peertube.service b/support/systemd/peertube.service
index 1e3378f77..b9d01f235 100644
--- a/support/systemd/peertube.service
+++ b/support/systemd/peertube.service
@@ -1,5 +1,6 @@
[Unit]
Description=PeerTube daemon
+After=network.target
[Service]
Type=simple