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