diff options
-rw-r--r-- | .github/CONTRIBUTING.md | 77 | ||||
-rw-r--r-- | .github/ISSUE_TEMPLATE.md | 25 | ||||
-rw-r--r-- | ARCHITECTURE.md | 2 | ||||
-rw-r--r-- | FAQ.md | 4 | ||||
-rw-r--r-- | README.md | 150 | ||||
-rw-r--r-- | package.json | 1 | ||||
-rwxr-xr-x | scripts/check.ts | 171 | ||||
-rw-r--r-- | support/doc/dependencies.md | 29 | ||||
-rw-r--r-- | support/doc/development/client/code.md | 7 | ||||
-rw-r--r-- | support/doc/development/server/code.md | 15 | ||||
-rw-r--r-- | support/doc/production.md | 227 | ||||
-rw-r--r-- | support/systemd/peertube.service | 1 |
12 files changed, 335 insertions, 374 deletions
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 @@ | |||
1 | # Welcome to the contributing guide for PeerTube | 1 | # Welcome to the contributing guide for PeerTube |
2 | 2 | ||
3 | Interesting in contributing? Awesome :) | 3 | Interesting in contributing? Awesome! |
4 | 4 | ||
5 | **Quick Links:** | 5 | **Quick Links:** |
6 | 6 | ||
7 | * [Give your feedback](#give-your-feedback) | 7 | * [Give your feedback](#give-your-feedback) |
8 | * [Develop on the Server side](#develop-on-the-server-side) | ||
9 | * [Develop on the Client side](#develop-on-the-client-side) | ||
10 | * [Get started with development](#get-started-with-development) | ||
11 | * [Write documentation](#write-documentation) | 8 | * [Write documentation](#write-documentation) |
9 | * [Develop](#develop) | ||
12 | 10 | ||
13 | 11 | ||
14 | ## Give your feedback | 12 | ## Give your feedback |
@@ -16,40 +14,32 @@ Interesting in contributing? Awesome :) | |||
16 | You don't need to know how to code to start contributing to PeerTube! Other | 14 | You don't need to know how to code to start contributing to PeerTube! Other |
17 | contributions are very valuable too, among which: you can test the software and | 15 | contributions are very valuable too, among which: you can test the software and |
18 | report bugs, you can give feedback on potential bugs, features that you are | 16 | report bugs, you can give feedback on potential bugs, features that you are |
19 | interested in, user interace, design, decentralized architecture... | 17 | interested in, user interface, design, decentralized architecture... |
20 | 18 | ||
21 | 19 | ||
22 | ## Development | 20 | ## Write documentation |
23 | |||
24 | ## Develop on the Server side | ||
25 | 21 | ||
26 | The server is a web server developed with | 22 | You can help to write the documentation of the REST API, code, architecture, |
27 | [NodeJS](https://nodejs.org)/[Express](http://expressjs.com). | 23 | demonstrations... |
28 | 24 | ||
29 | Newcomer? You can find a documentation of the server code/architecture | 25 | ## Develop |
30 | [here](https://github.com/Chocobozzz/PeerTube/blob/master/support/doc/server/code.md). | ||
31 | 26 | ||
32 | Don't hesitate to talk about features you want to develop by creating an issue | 27 | Don't hesitate to talk about features you want to develop by creating an issue |
33 | before you start working on them :). | 28 | before you start working on them :). |
34 | 29 | ||
30 | ### Prerequisites | ||
35 | 31 | ||
36 | ## Develop on the Client side | 32 | First, make sure that you have followed |
37 | 33 | [the steps](/support/doc/dependencies.md) | |
38 | The client is a web application developed with | 34 | to install the dependencies. |
39 | [TypeScript](https://www.typescriptlang.org/)/[Angular2](https://angular.io/). | ||
40 | |||
41 | Newcomer? You can find a documentation of the server code/architecture | ||
42 | [here](https://github.com/Chocobozzz/PeerTube/blob/master/support/doc/client/code.md). | ||
43 | |||
44 | |||
45 | ## Get started with development | ||
46 | |||
47 | In this mode, the server will run requests between instances more quickly, the | ||
48 | video durations are limited to a few seconds. | ||
49 | 35 | ||
50 | ### Prerequisites | 36 | Then clone the sources and install node modules: |
51 | 37 | ||
52 | First, make sure that you have followed the steps to install the dependencies. | 38 | ```bash |
39 | $ git clone -b master https://github.com/Chocobozzz/PeerTube | ||
40 | $ cd PeerTube | ||
41 | $ yarn install --pure-lockfile | ||
42 | ``` | ||
53 | 43 | ||
54 | Then, create a postgres database and user with the values set in the | 44 | Then, create a postgres database and user with the values set in the |
55 | `config/default.yaml` file. For instance, if you do not change the values | 45 | `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` | |||
57 | and a postgres user called `peertube` with password `peertube`: | 47 | and a postgres user called `peertube` with password `peertube`: |
58 | 48 | ||
59 | ```bash | 49 | ```bash |
60 | # sudo -u postgres createuser -P peertube | 50 | # sudo -u postgres createuser -P peertube |
61 | Enter password for new role: peertube | 51 | Enter password for new role: peertube |
62 | # sudo -u postgres createdb -O peertube peertube_dev | 52 | # sudo -u postgres createdb -O peertube peertube_dev |
63 | ``` | 53 | ``` |
64 | 54 | ||
55 | In dev mode, administrator username is **root** and password is **test**. | ||
56 | |||
65 | ### Server side | 57 | ### Server side |
66 | 58 | ||
59 | You can find a documentation of the server code/architecture [here](/support/doc/development/server/code.md). | ||
60 | |||
67 | To develop on the server-side: | 61 | To develop on the server-side: |
68 | 62 | ||
69 | ```bash | 63 | ```bash |
70 | $ npm run dev:server | 64 | $ npm run dev:server |
71 | ``` | 65 | ``` |
72 | 66 | ||
73 | Then, the server will listen on `localhost:9000`. When server source files | 67 | Then, the server will listen on `localhost:9000`. When server source files |
74 | change, these are automatically recompiled and the server will automatically | 68 | change, these are automatically recompiled and the server will automatically |
75 | restart. | 69 | restart. Server is in `TEST` mode so it will run requests between instances more quickly. |
76 | 70 | ||
77 | ### Client side | 71 | ### Client side |
78 | 72 | ||
73 | You can find a documentation of the server code/architecture | ||
74 | [here](/support/doc/development/client/code.md). | ||
75 | |||
76 | |||
79 | To develop on the client side: | 77 | To develop on the client side: |
80 | 78 | ||
81 | ```bash | 79 | ```bash |
82 | $ npm run dev:client | 80 | $ npm run dev:client |
83 | ``` | 81 | ``` |
84 | 82 | ||
85 | The API will listen on `localhost:9000` and the frontend on `localhost:3000`. | 83 | The API will listen on `localhost:9000` and the frontend on `localhost:3000`. |
86 | Client files are automatically compiled on change, and the web browser will | 84 | Client files are automatically compiled on change, and the web browser will |
87 | reload them automatically thanks to hot module replacement. | 85 | reload them automatically thanks to hot module replacement. |
88 | 86 | ||
89 | **Username**: *root* <br/> | 87 | ### Test federation |
90 | **Password**: *test* | ||
91 | 88 | ||
89 | This will run 3 nodes: | ||
92 | 90 | ||
93 | ## Write documentation | 91 | ```bash |
92 | $ npm run clean:server:test | ||
93 | $ npm run play | ||
94 | ``` | ||
94 | 95 | ||
95 | You can help to write the documentation of the REST API, code, architecture, | 96 | Then you will get access to the three nodes at `http://localhost:900{1,2,3}` |
96 | demonstrations... | 97 | 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 @@ | |||
1 | <!-- | 1 | <!-- If you report a bug please fill the form --> |
2 | Problem with the demonstration server? | 2 | |
3 | -> Please retry in a few hours or send me directly an email: https://github.com/Chocobozzz | 3 | * **PeerTube version or commit:** |
4 | Bug? | 4 | * **Browser name/version:** |
5 | -> Please check first you're running on the latest version of Firefox/Chromium | 5 | * **NodeJS version:** |
6 | -> Please check the console log to add informations to the bug report | 6 | * **PostgreSQL version:** |
7 | --> | 7 | |
8 | 8 | ||
9 | * Browser name/version: | 9 | * **What is the expected behaviour?** |
10 | * Console log if useful (Gist/Pastebin...): | 10 | * **What do you see instead?** |
11 | |||
12 | |||
13 | * **Browser console log if useful (Gist/Pastebin...):** | ||
14 | * **Server log if useful (Gist/Pastebin...):** | ||
15 | |||
diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index cf0dcfacd..160d6fc4f 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md | |||
@@ -18,7 +18,7 @@ | |||
18 | * We use the [ActivityPub](https://www.w3.org/TR/activitypub/) protocol (only | 18 | * We use the [ActivityPub](https://www.w3.org/TR/activitypub/) protocol (only |
19 | server-server for now). Object models could be found in | 19 | server-server for now). Object models could be found in |
20 | [shared/models/activitypub | 20 | [shared/models/activitypub |
21 | directory](https://github.com/Chocobozzz/PeerTube/tree/develop/shared/models/activitypub). | 21 | directory](/shared/models/activitypub). |
22 | * All the requests are retried several times if they fail. | 22 | * All the requests are retried several times if they fail. |
23 | 23 | ||
24 | ### Instance | 24 | ### Instance |
@@ -31,9 +31,9 @@ We think it is acceptable for a video platform. | |||
31 | WEBM, MP4 or OGV videos. | 31 | WEBM, MP4 or OGV videos. |
32 | 32 | ||
33 | 33 | ||
34 | ## I want to change my host or move to HTTPS, how can I do that? | 34 | ## I want to change my host, how can I do that? |
35 | 35 | ||
36 | If you already have followers, you can't. | 36 | If you already have followers, you can't. |
37 | 37 | ||
38 | If you don't have any followers, update your configuration and run | 38 | If you don't have any followers, update your configuration and run |
39 | `NODE_ENV=production npm run update-host` to update the torrent files. | 39 | `NODE_ENV=production npm run update-host` to update the torrent files (they contain your domain name). |
@@ -64,13 +64,12 @@ donating them](https://soutenir.framasoft.org/en/).** | |||
64 | 64 | ||
65 | Want to see it in action? | 65 | Want to see it in action? |
66 | 66 | ||
67 | * [Demo server](http://peertube.cpy.re) | 67 | * Demonstration servers: |
68 | * [peertube.cpy.re](http://peertube.cpy.re) | ||
69 | * [peertube2.cpy.re](http://peertube2.cpy.re) | ||
70 | * [peertube3.cpy.re](http://peertube3.cpy.re) | ||
68 | * [Video](https://peertube.cpy.re/videos/watch/f78a97f8-a142-4ce1-a5bd-154bf9386504) | 71 | * [Video](https://peertube.cpy.re/videos/watch/f78a97f8-a142-4ce1-a5bd-154bf9386504) |
69 | to see how the "decentralization feature" looks like | 72 | to see how the "decentralization feature" looks like |
70 | * Experimental demo servers that share videos (they are in the same | ||
71 | network): [peertube2](http://peertube2.cpy.re), | ||
72 | [peertube3](http://peertube3.cpy.re). Since I do experiments with them, | ||
73 | sometimes they might not work correctly. | ||
74 | 73 | ||
75 | ## Why | 74 | ## Why |
76 | 75 | ||
@@ -83,12 +82,11 @@ So we need to have a decentralized network of servers seeding videos (as | |||
83 | enough because one video could become famous and overload the server. It's the | 82 | enough because one video could become famous and overload the server. It's the |
84 | reason why we need to use a P2P protocol to limit the server load. Thanks to | 83 | reason why we need to use a P2P protocol to limit the server load. Thanks to |
85 | [WebTorrent](https://github.com/feross/webtorrent), we can make P2P (thus | 84 | [WebTorrent](https://github.com/feross/webtorrent), we can make P2P (thus |
86 | bittorrent) inside the web browser, as of today. | 85 | BitTorrent) inside the web browser, as of today. |
87 | 86 | ||
88 | ## Features | 87 | ## Features |
89 | 88 | ||
90 | - [X] Frontend | 89 | - [X] Angular frontend |
91 | - [X] Angular frontend | ||
92 | - [X] Join the fediverse | 90 | - [X] Join the fediverse |
93 | - [X] Follow other instances | 91 | - [X] Follow other instances |
94 | - [X] Unfollow an instance | 92 | - [X] Unfollow an instance |
@@ -103,8 +101,8 @@ bittorrent) inside the web browser, as of today. | |||
103 | - [X] OpenGraph tags | 101 | - [X] OpenGraph tags |
104 | - [X] OEmbed | 102 | - [X] OEmbed |
105 | - [X] Update video | 103 | - [X] Update video |
106 | - [X] Videos view counter | 104 | - [X] Federated videos view counter |
107 | - [X] Videos likes/dislikes | 105 | - [X] Federated videos likes/dislikes |
108 | - [X] Transcoding to different definitions | 106 | - [X] Transcoding to different definitions |
109 | - [X] Download file/torrent | 107 | - [X] Download file/torrent |
110 | - [X] User video bytes quota | 108 | - [X] User video bytes quota |
@@ -115,140 +113,32 @@ bittorrent) inside the web browser, as of today. | |||
115 | - [X] User registration | 113 | - [X] User registration |
116 | - [X] Video privacy settings (public, unlisted or private) | 114 | - [X] Video privacy settings (public, unlisted or private) |
117 | - [X] Signaling a video to the admin origin PeerTube instance | 115 | - [X] Signaling a video to the admin origin PeerTube instance |
118 | - [ ] Videos comments | 116 | - [X] Federated videos comments |
117 | - [ ] Video imports (URL, Torrent, YouTube...) | ||
118 | - [ ] Advanced search | ||
119 | - [ ] Subtitles | ||
119 | - [ ] User playlist | 120 | - [ ] User playlist |
120 | - [ ] User subscriptions (by tags, author...) | 121 | - [ ] User subscriptions (by tags, author...) |
121 | - [ ] Add "DDOS" security | 122 | - [ ] Add "DDOS" security |
122 | 123 | ||
123 | 124 | ||
124 | ## Installation | 125 | ## Front compatibility |
125 | 126 | ||
126 | See [wiki](https://github.com/Chocobozzz/PeerTube/wiki) for complete | 127 | * Firefox |
127 | installation commands. | 128 | * Chrome/Chromium |
128 | 129 | ||
129 | ### Front compatibility | 130 | ## Dependencies |
130 | |||
131 | * Chromium | ||
132 | * Firefox (>= 42 for MediaSource support) | ||
133 | |||
134 | ### Dependencies | ||
135 | 131 | ||
132 | * nginx | ||
133 | * PostgreSQL | ||
136 | * **NodeJS >= 8.x** | 134 | * **NodeJS >= 8.x** |
137 | * yarn | 135 | * yarn |
138 | * OpenSSL (cli) | 136 | * OpenSSL (cli) |
139 | * PostgreSQL | ||
140 | * FFmpeg | 137 | * FFmpeg |
141 | 138 | ||
142 | #### Debian | 139 | ## Production |
143 | |||
144 | 1. Install NodeJS 8.x (current LTS): | ||
145 | [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) | ||
146 | 2. Install yarn: | ||
147 | [https://yarnpkg.com/en/docs/install](https://yarnpkg.com/en/docs/install) | ||
148 | 4. Run: | ||
149 | |||
150 | ```bash | ||
151 | $ apt-get update | ||
152 | $ apt-get install ffmpeg postgresql openssl | ||
153 | ``` | ||
154 | |||
155 | #### Ubuntu 16.04 | ||
156 | |||
157 | 1. Install NodeJS 8.x (current LTS): (same as Debian) | ||
158 | 2. Install yarn: (same as Debian) | ||
159 | 3. Run: | ||
160 | |||
161 | ```bash | ||
162 | $ apt-get update | ||
163 | $ apt-get install ffmpeg postgresql openssl | ||
164 | ``` | ||
165 | |||
166 | #### Arch Linux | ||
167 | |||
168 | 1. Run: | ||
169 | |||
170 | ```bash | ||
171 | $ pacman -S nodejs yarn ffmpeg postgresql openssl | ||
172 | ``` | ||
173 | |||
174 | #### Other distributions | ||
175 | |||
176 | Feel free to update this README file in a pull request! | ||
177 | |||
178 | ### Build from the sources | ||
179 | |||
180 | ```bash | ||
181 | $ git clone -b master https://github.com/Chocobozzz/PeerTube | ||
182 | $ cd PeerTube | ||
183 | $ yarn install | ||
184 | $ npm run build | ||
185 | ``` | ||
186 | |||
187 | ## Usage | ||
188 | |||
189 | ### Production | ||
190 | |||
191 | If you want to run PeerTube in production (which might be a bad idea for now :) ): | ||
192 | |||
193 | ```bash | ||
194 | $ cp config/production.yaml.example config/production.yaml | ||
195 | ``` | ||
196 | |||
197 | Then edit the `config/production.yaml` file according to your webserver | ||
198 | configuration. Keys set in this file will override those of | ||
199 | `config/default.yml`. | ||
200 | |||
201 | Finally, run the server with the `NODE_ENV` environment variable set to | ||
202 | `production`: | ||
203 | |||
204 | ```bash | ||
205 | $ NODE_ENV=production npm start | ||
206 | ``` | ||
207 | |||
208 | The administrator password is automatically generated and can be found in the | ||
209 | logs. You can set another password with: | ||
210 | |||
211 | ```bash | ||
212 | $ NODE_ENV=production npm run reset-password -- -u root | ||
213 | ``` | ||
214 | |||
215 | **Nginx template** (reverse proxy): https://github.com/Chocobozzz/PeerTube/tree/master/support/nginx <br /> | ||
216 | **Systemd template**: https://github.com/Chocobozzz/PeerTube/tree/master/support/systemd | ||
217 | |||
218 | You can check the application (CORS headers, tracker websocket...) by running: | ||
219 | |||
220 | ```bash | ||
221 | $ NODE_ENV=production npm run check | ||
222 | ``` | ||
223 | |||
224 | ### Upgrade | ||
225 | |||
226 | The following commands will upgrade the source (according to your current | ||
227 | branch), upgrade node modules and rebuild client application: | ||
228 | |||
229 | ```bash | ||
230 | # systemctl stop peertube | ||
231 | $ npm run upgrade-peertube | ||
232 | # systemctl start peertube | ||
233 | ``` | ||
234 | |||
235 | ### Test with three fresh nodes | ||
236 | |||
237 | ```bash | ||
238 | $ npm run clean:server:test | ||
239 | $ npm run play | ||
240 | ``` | ||
241 | |||
242 | Then you will get access to the three nodes at `http://localhost:900{1,2,3}` | ||
243 | with the `root` as username and `test{1,2,3}` for the password. | ||
244 | |||
245 | ### Other commands | ||
246 | |||
247 | To print all available commands, run: | ||
248 | 140 | ||
249 | ```bash | 141 | See the [production guide](support/doc/production.md). |
250 | $ npm run help | ||
251 | ``` | ||
252 | 142 | ||
253 | ## Contributing | 143 | ## Contributing |
254 | 144 | ||
diff --git a/package.json b/package.json index 8f72daa4d..efe03dc04 100644 --- a/package.json +++ b/package.json | |||
@@ -34,7 +34,6 @@ | |||
34 | "dev:server": "scripty", | 34 | "dev:server": "scripty", |
35 | "dev:client": "scripty", | 35 | "dev:client": "scripty", |
36 | "start": "node dist/server", | 36 | "start": "node dist/server", |
37 | "check": "ts-node ./scripts/check.ts", | ||
38 | "upgrade-peertube": "scripty", | 37 | "upgrade-peertube": "scripty", |
39 | "upgrade": "echo 'This command was renamed to upgrade-peertube.'", | 38 | "upgrade": "echo 'This command was renamed to upgrade-peertube.'", |
40 | "update-host": "ts-node ./scripts/update-host.ts", | 39 | "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 @@ | |||
1 | import * as series from 'async/series' | ||
2 | import * as request from 'request' | ||
3 | import * as WebSocket from 'ws' | ||
4 | |||
5 | import { CONFIG } from '../server/initializers/constants' | ||
6 | |||
7 | const requestHeaders = { | ||
8 | 'Range': '', | ||
9 | 'Keep-Alive': '', | ||
10 | 'User-Agent': 'Mozilla', | ||
11 | 'Cache-Control': 'no-cache', | ||
12 | 'Content-Type': '', | ||
13 | 'Host': 'example.com', | ||
14 | 'Access-Control-Request-Method': 'GET', | ||
15 | 'Access-Control-Request-Headers': 'range' | ||
16 | } | ||
17 | |||
18 | series([ | ||
19 | pingServer, | ||
20 | checkCORSTorrent, | ||
21 | checkCORSWebSeed, | ||
22 | checkTracker | ||
23 | ], function () { | ||
24 | process.exit(0) | ||
25 | }) | ||
26 | |||
27 | // --------------------------------------------------------------------------- | ||
28 | |||
29 | function pingServer (callback: () => void) { | ||
30 | const pingUrl = CONFIG.WEBSERVER.URL + '/api/v1/ping' | ||
31 | console.log('Checking server is up (%s)...', pingUrl) | ||
32 | |||
33 | request(pingUrl, function (err, res, body) { | ||
34 | if (!err && res.statusCode === 200 && body === 'pong') { | ||
35 | console.log('SUCCESS.') | ||
36 | } else { | ||
37 | console.log('FAIL.') | ||
38 | } | ||
39 | |||
40 | callback() | ||
41 | }) | ||
42 | } | ||
43 | |||
44 | function checkCORSTorrent (callback: () => void) { | ||
45 | const torrentUrl = CONFIG.WEBSERVER.URL + '/static/torrents/test.torrent' | ||
46 | console.log('Checking CORS headers for the torrent (%s)...', torrentUrl) | ||
47 | |||
48 | request({ | ||
49 | method: 'OPTIONS', | ||
50 | uri: torrentUrl, | ||
51 | headers: requestHeaders | ||
52 | }, function (err, res) { | ||
53 | if (err || isThereValidCORSHeaders(res) === false) { | ||
54 | console.error('FAIL.') | ||
55 | } else { | ||
56 | console.log('SUCCESS.') | ||
57 | } | ||
58 | |||
59 | callback() | ||
60 | }) | ||
61 | } | ||
62 | |||
63 | function checkCORSWebSeed (callback: () => void) { | ||
64 | const webseedUrl = CONFIG.WEBSERVER.URL + '/static/webseed/test.mp4' | ||
65 | console.log('Checking CORS headers for the video (%s)...', webseedUrl) | ||
66 | |||
67 | request({ | ||
68 | method: 'OPTIONS', | ||
69 | uri: webseedUrl, | ||
70 | headers: requestHeaders | ||
71 | }, function (err, res) { | ||
72 | if (err || isThereValidCORSHeaders(res) === false) { | ||
73 | console.error('FAIL.') | ||
74 | } else { | ||
75 | console.log('SUCCESS.') | ||
76 | } | ||
77 | |||
78 | callback() | ||
79 | }) | ||
80 | } | ||
81 | |||
82 | function checkTracker (callback: () => void) { | ||
83 | const trackerUrl = CONFIG.WEBSERVER.WS + '://' + | ||
84 | CONFIG.WEBSERVER.HOST + | ||
85 | '/tracker/socket' | ||
86 | console.log('Checking tracker websocket (%s)...', trackerUrl) | ||
87 | |||
88 | let ws = null | ||
89 | ws = new WebSocket(trackerUrl) | ||
90 | |||
91 | const timeout = setTimeout(failed, 1000) | ||
92 | ws.on('open', onOpen) | ||
93 | |||
94 | function onOpen () { | ||
95 | clearTimeout(timeout) | ||
96 | ws.close() | ||
97 | |||
98 | console.log('SUCCESS.') | ||
99 | callback() | ||
100 | } | ||
101 | |||
102 | function failed () { | ||
103 | ws.removeListener('open', onOpen) | ||
104 | ws.close() | ||
105 | |||
106 | console.log('FAILED.') | ||
107 | callback() | ||
108 | } | ||
109 | } | ||
110 | |||
111 | function isThereValidCORSHeaders (res: request.RequestResponse) { | ||
112 | let fail = false | ||
113 | |||
114 | // Check Access-Control-Allow-Origin | ||
115 | const headerAllowOriginKey = 'access-control-allow-origin' | ||
116 | const headerAllowOrigin = res.headers[headerAllowOriginKey] | ||
117 | |||
118 | if (!headerAllowOrigin) { | ||
119 | console.error(headerAllowOriginKey + ' is not present.') | ||
120 | fail = true | ||
121 | } else if (headerAllowOrigin !== '*') { | ||
122 | console.error(headerAllowOriginKey + ' does not equal "*".') | ||
123 | fail = true | ||
124 | } | ||
125 | |||
126 | // Check Access-Control-Allow-Methods | ||
127 | const headerAllowMethodsKey = 'access-control-allow-methods' | ||
128 | const headerAllowMethods = res.headers[headerAllowMethodsKey] | ||
129 | if (!headerAllowMethods) { | ||
130 | console.error(headerAllowMethodsKey + ' is not present.') | ||
131 | fail = true | ||
132 | } else { | ||
133 | const allowMethodsMissed = findPatternNotInString(headerAllowMethods as string, [ 'get' ]) | ||
134 | if (allowMethodsMissed !== null) { | ||
135 | console.error(headerAllowMethodsKey + ' misses the ' + allowMethodsMissed + ' method.') | ||
136 | fail = true | ||
137 | } | ||
138 | } | ||
139 | |||
140 | // Check Access-Control-Allow-Headers | ||
141 | const headerAllowHeadersKey = 'access-control-allow-headers' | ||
142 | const headerAllowHeaders = res.headers[headerAllowHeadersKey] | ||
143 | if (!headerAllowHeaders) { | ||
144 | console.error(headerAllowHeadersKey + ' is not present.') | ||
145 | fail = true | ||
146 | } else { | ||
147 | const headersThatShouldBePresent = [ | ||
148 | 'Range' | ||
149 | ] | ||
150 | const allowHeadersMissed = findPatternNotInString(headerAllowHeaders as string, headersThatShouldBePresent) | ||
151 | if (allowHeadersMissed !== null) { | ||
152 | console.error(headerAllowHeadersKey + ' misses the ' + allowHeadersMissed + ' header.') | ||
153 | fail = true | ||
154 | } | ||
155 | } | ||
156 | |||
157 | return !fail | ||
158 | } | ||
159 | |||
160 | function findPatternNotInString (stringChain: string, patterns: string[]) { | ||
161 | let res = null | ||
162 | const stringChainLowerCase = stringChain.toLowerCase() | ||
163 | |||
164 | patterns.forEach(function (pattern) { | ||
165 | if (stringChainLowerCase.indexOf(pattern.toLowerCase()) === -1) { | ||
166 | res = pattern | ||
167 | } | ||
168 | }) | ||
169 | |||
170 | return res | ||
171 | } | ||
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 @@ | |||
1 | # Installation | ||
2 | |||
3 | ## Dependencies | ||
4 | |||
5 | ### Debian / Ubuntu | ||
6 | |||
7 | 1. Install NodeJS 8.x (current LTS): | ||
8 | [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) | ||
9 | 2. Install yarn: | ||
10 | [https://yarnpkg.com/en/docs/install](https://yarnpkg.com/en/docs/install) | ||
11 | 4. Run: | ||
12 | |||
13 | ```bash | ||
14 | $ apt-get update | ||
15 | $ apt-get install nginx ffmpeg postgresql openssl g++ make | ||
16 | ``` | ||
17 | |||
18 | ### Arch Linux | ||
19 | |||
20 | 1. Run: | ||
21 | |||
22 | ```bash | ||
23 | $ pacman -S nodejs yarn ffmpeg postgresql openssl | ||
24 | ``` | ||
25 | |||
26 | ### Other distributions | ||
27 | |||
28 | Feel free to update this file in a pull request! | ||
29 | |||
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 | |||
53 | 53 | ||
54 | Uses [TSLint](https://palantir.github.io/tslint/) for TypeScript linting and [Angular styleguide](https://angular.io/docs/ts/latest/guide/style-guide.html). | 54 | Uses [TSLint](https://palantir.github.io/tslint/) for TypeScript linting and [Angular styleguide](https://angular.io/docs/ts/latest/guide/style-guide.html). |
55 | 55 | ||
56 | ## Developing | 56 | ## Concepts |
57 | |||
58 | * Install [the dependencies](https://github.com/Chocobozzz/PeerTube#dependencies) | ||
59 | * Run `yarn install --pure-lockfile` at the root directory to install all the dependencies | ||
60 | * Run PostgreSQL and create the database `peertube_dev`. | ||
61 | * 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`. | ||
62 | 57 | ||
63 | 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. | 58 | 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. |
64 | If you are not familiar with Angular I recommend you to read the [quickstart guide](https://angular.io/docs/ts/latest/quickstart.html). | 59 | 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 | |||
36 | 36 | ||
37 | Uses [JavaScript Standard Style](http://standardjs.com/). | 37 | Uses [JavaScript Standard Style](http://standardjs.com/). |
38 | 38 | ||
39 | |||
40 | ## Developing | ||
41 | |||
42 | * Install [the dependencies](https://github.com/Chocobozzz/PeerTube#dependencies) | ||
43 | * Run `yarn install` at the root directory to install all the dependencies | ||
44 | * Run PostgreSQL and create the database `peertube_dev`. | ||
45 | * 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`. | ||
46 | |||
47 | 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)). | ||
48 | |||
49 | `npm run help` gives you all available commands. | ||
50 | |||
51 | 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`. | ||
52 | |||
53 | |||
54 | ## Architecture | 39 | ## Architecture |
55 | 40 | ||
56 | The server is composed by: | 41 | 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 @@ | |||
1 | # Production guide | ||
2 | |||
3 | ## Installation | ||
4 | |||
5 | ### Dependencies | ||
6 | |||
7 | Follow the steps of the [dependencies guide](dependencies.md). | ||
8 | |||
9 | ### PeerTube user | ||
10 | |||
11 | Create a `peertube` user with `/home/peertube` home: | ||
12 | |||
13 | ```bash | ||
14 | sudo useradd -m -d /home/peertube -s /bin/bash -p peertube peertube | ||
15 | sudo passwd peertube | ||
16 | ``` | ||
17 | |||
18 | ### Database | ||
19 | |||
20 | Create production database and peertube user: | ||
21 | |||
22 | ```bash | ||
23 | sudo -u postgres createuser -P peertube | ||
24 | sudo -u postgres createdb -O peertube peertube_prod | ||
25 | ``` | ||
26 | |||
27 | ### Sources | ||
28 | |||
29 | Clone, install node dependencies and build application: | ||
30 | |||
31 | ```bash | ||
32 | $ cd /home/peertube | ||
33 | $ sudo -u peertube git clone -b master https://github.com/Chocobozzz/PeerTube | ||
34 | $ cd PeerTube | ||
35 | $ sudo -u peertube yarn install --pure-lockfile | ||
36 | $ sudo -u peertube npm run build | ||
37 | ``` | ||
38 | |||
39 | ### PeerTube configuration | ||
40 | |||
41 | Copy example configuration: | ||
42 | |||
43 | ```bash | ||
44 | $ sudo -u peertube cp config/production.yaml.example config/production.yaml | ||
45 | ``` | ||
46 | |||
47 | Then edit the `config/production.yaml` file according to your webserver | ||
48 | configuration. Keys set in this file will override those of | ||
49 | `config/default.yml`. | ||
50 | |||
51 | ### Webserver | ||
52 | |||
53 | Copy the nginx configuration template: | ||
54 | |||
55 | ```bash | ||
56 | $ sudo cp /home/peertube/PeerTube/support/nginx/peertube-https /etc/nginx/sites-available/peertube | ||
57 | ``` | ||
58 | |||
59 | Then modify the webserver configuration file. Please pay attention to the `alias` key of `/static/webseed` location. | ||
60 | It should correspond to the path of your videos directory (set in the configuration file as `storage->videos` key). | ||
61 | |||
62 | ```bash | ||
63 | $ sudo vim /etc/nginx/sites-available/peertube | ||
64 | ``` | ||
65 | |||
66 | 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). | ||
67 | |||
68 | An example of the nginx configuration could be: | ||
69 | |||
70 | ``` | ||
71 | server { | ||
72 | listen 80; | ||
73 | listen [::]:80; | ||
74 | server_name peertube.example.com; | ||
75 | |||
76 | access_log /var/log/nginx/peertube.example.com.access.log; | ||
77 | error_log /var/log/nginx/peertube.example.com.error.log; | ||
78 | |||
79 | rewrite ^ https://$server_name$request_uri? permanent; | ||
80 | } | ||
81 | |||
82 | server { | ||
83 | listen 443 ssl http2; | ||
84 | listen [::]:443 ssl http2; | ||
85 | server_name peertube.example.com; | ||
86 | |||
87 | # For example with Let's Encrypt | ||
88 | ssl_certificate /etc/letsencrypt/live/peertube.example.com/fullchain.pem; | ||
89 | ssl_certificate_key /etc/letsencrypt/live/peertube.example.com/privkey.pem; | ||
90 | ssl_trusted_certificate /etc/letsencrypt/live/peertube.example.com/chain.pem; | ||
91 | |||
92 | access_log /var/log/nginx/peertube.example.com.access.log; | ||
93 | error_log /var/log/nginx/peertube.example.com.error.log; | ||
94 | |||
95 | location ^~ '/.well-known/acme-challenge' { | ||
96 | default_type "text/plain"; | ||
97 | root /var/www/certbot; | ||
98 | } | ||
99 | |||
100 | location / { | ||
101 | proxy_pass http://localhost:9000; | ||
102 | proxy_set_header X-Real-IP $remote_addr; | ||
103 | proxy_set_header Host $host; | ||
104 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||
105 | |||
106 | # For the video upload | ||
107 | client_max_body_size 8G; | ||
108 | proxy_connect_timeout 600; | ||
109 | proxy_send_timeout 600; | ||
110 | proxy_read_timeout 600; | ||
111 | send_timeout 600; | ||
112 | } | ||
113 | |||
114 | # Bypass PeerTube webseed route for better performances | ||
115 | location /static/webseed { | ||
116 | if ($request_method = 'OPTIONS') { | ||
117 | add_header 'Access-Control-Allow-Origin' '*'; | ||
118 | add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS'; | ||
119 | add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; | ||
120 | add_header 'Access-Control-Max-Age' 1728000; | ||
121 | add_header 'Content-Type' 'text/plain charset=UTF-8'; | ||
122 | add_header 'Content-Length' 0; | ||
123 | return 204; | ||
124 | } | ||
125 | |||
126 | if ($request_method = 'GET') { | ||
127 | add_header 'Access-Control-Allow-Origin' '*'; | ||
128 | add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS'; | ||
129 | add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; | ||
130 | } | ||
131 | |||
132 | alias /var/www/PeerTube/videos; | ||
133 | } | ||
134 | |||
135 | # Websocket tracker | ||
136 | location /tracker/socket { | ||
137 | # Peers send a message to the tracker every 15 minutes | ||
138 | # Don't close the websocket before this time | ||
139 | proxy_read_timeout 1200s; | ||
140 | proxy_set_header Upgrade $http_upgrade; | ||
141 | proxy_set_header Connection "upgrade"; | ||
142 | proxy_http_version 1.1; | ||
143 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||
144 | proxy_set_header Host $host; | ||
145 | proxy_pass http://localhost:9000; | ||
146 | } | ||
147 | } | ||
148 | ``` | ||
149 | |||
150 | |||
151 | Activate the configuration file: | ||
152 | |||
153 | ```bash | ||
154 | $ sudo ln -s /etc/nginx/sites-available/peertube /etc/nginx/sites-enabled/peertube | ||
155 | $ sudo systemctl reload nginx | ||
156 | ``` | ||
157 | |||
158 | ### Systemd | ||
159 | |||
160 | Copy the nginx configuration template: | ||
161 | |||
162 | ```bash | ||
163 | sudo cp /home/peertube/PeerTube/support/systemd/peertube.service /etc/systemd/system/ | ||
164 | ``` | ||
165 | |||
166 | Update the service file: | ||
167 | |||
168 | ```bash | ||
169 | sudo vim /etc/systemd/system/peertube.service | ||
170 | ``` | ||
171 | |||
172 | It should look like this: | ||
173 | |||
174 | ``` | ||
175 | [Unit] | ||
176 | Description=PeerTube daemon | ||
177 | After=network.target | ||
178 | |||
179 | [Service] | ||
180 | Type=simple | ||
181 | Environment=NODE_ENV=production | ||
182 | User=peertube | ||
183 | Group=peertube | ||
184 | ExecStart=/usr/bin/npm start | ||
185 | WorkingDirectory=/home/peertube/PeerTube | ||
186 | StandardOutput=syslog | ||
187 | StandardError=syslog | ||
188 | SyslogIdentifier=peertube | ||
189 | Restart=always | ||
190 | |||
191 | [Install] | ||
192 | WantedBy=multi-user.target | ||
193 | ``` | ||
194 | |||
195 | |||
196 | Tell systemd to reload its config: | ||
197 | |||
198 | ```bash | ||
199 | sudo systemctl daemon-reload | ||
200 | ``` | ||
201 | |||
202 | ### Run | ||
203 | |||
204 | ```bash | ||
205 | sudo systemctl start peertube | ||
206 | sudo journalctl -feu peertube | ||
207 | ``` | ||
208 | |||
209 | ### Administrator | ||
210 | |||
211 | The administrator password is automatically generated and can be found in the | ||
212 | logs. You can set another password with: | ||
213 | |||
214 | ```bash | ||
215 | $ NODE_ENV=production npm run reset-password -- -u root | ||
216 | ``` | ||
217 | |||
218 | ## Upgrade | ||
219 | |||
220 | The following commands will upgrade the source (according to your current | ||
221 | branch), upgrade node modules and rebuild client application: | ||
222 | |||
223 | ```bash | ||
224 | # systemctl stop peertube | ||
225 | $ npm run upgrade-peertube | ||
226 | # systemctl start peertube | ||
227 | ``` | ||
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 @@ | |||
1 | [Unit] | 1 | [Unit] |
2 | Description=PeerTube daemon | 2 | Description=PeerTube daemon |
3 | After=network.target | ||
3 | 4 | ||
4 | [Service] | 5 | [Service] |
5 | Type=simple | 6 | Type=simple |