aboutsummaryrefslogtreecommitdiffhomepage
path: root/ARCHITECTURE.md
diff options
context:
space:
mode:
authorChocobozzz <florian.bigard@gmail.com>2017-11-27 16:06:13 +0100
committerChocobozzz <florian.bigard@gmail.com>2017-11-27 19:43:01 +0100
commitfcaf1e0aa84213a1b1f1b1a44a3276eae35ebe70 (patch)
tree23157ef819c5dba040a576b8dae0dee4eba6e85f /ARCHITECTURE.md
parent4e50b6a1c9a3eb261e04ede73241648e6edf21d6 (diff)
downloadPeerTube-fcaf1e0aa84213a1b1f1b1a44a3276eae35ebe70.tar.gz
PeerTube-fcaf1e0aa84213a1b1f1b1a44a3276eae35ebe70.tar.zst
PeerTube-fcaf1e0aa84213a1b1f1b1a44a3276eae35ebe70.zip
Update readme, architecture
Diffstat (limited to 'ARCHITECTURE.md')
-rw-r--r--ARCHITECTURE.md89
1 files changed, 16 insertions, 73 deletions
diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md
index ebcffd6cb..ac62fa4b7 100644
--- a/ARCHITECTURE.md
+++ b/ARCHITECTURE.md
@@ -1,83 +1,26 @@
1# Protocol (WIP, help welcome) 1# Architecture
2 2
3## Vocabulary 3## Vocabulary
4 4
5 - **Network:** several servers communicating each others with this software compose a network 5 - **Fediverse:** several servers following each others
6 - **Pod:** a server of the network (inspired from Diaspora, no really signification) 6 - **Instance:** a server which runs PeerTube in the fediverse
7 - **Friend:** a pod that communicates with yours 7 - **Origin instance:** the instance on which the video was uploaded and which is seeding (WebSeed protocol) the video
8 - **Origin pod:** the pod on which the video was uploaded and which is seeding (throught WebSeed protocol) the video 8 - **Following:** the action of a PeerTube instance which will follow another instance (subscribe to its videos)
9 - **Make friend:** the action of a server which will join a network (and so become friend with all pods that compose this network)
10 9
11## Base 10## Base
12 11
13### The first run: join a network and make friends
14 * The server generates a RSA key
15 * If the server administrator wants to join a network, he just has to make an http request to the API
16 * The server joins a network by checking entrypoints (server urls of the targeted network) in the configuration file
17 * If the config file doesn't specify other pods, the network will be composed by this only pod
18 * If the config file specifies one or more pods, the server will ask them the list of the pods in the network.
19 The server will add in its friends list all pods that are in > 50% of all other pods friends list + the pods that are asked for the list. For example if there are the following pods in a network with their following friends list:
20
21 http://pod1.com
22 - http://pod2.com
23 - http://pod3.com
24 - http://pod4.com
25 - http://pod5.com
26
27 http://pod2.com
28 - http://pod3.com
29 - http://pod5.com
30
31 http://pod3.com
32 - http://pod5.com
33
34 It will add: `http://pod1.com`, `http://pod2.com` and `http://pod3.com` because it asks to them the list of their friends. Then, it will add all pods that are in >= 50% of pods friends list so: `http://pod5.com`.
35 * When the friends list is added, the server will present itself to all these friends ("make friend" operation) with the following informations: its **public RSA key** and its **URL**
36 * Then, the pods will slowly share their videos database
37 * All the friends have the initial score of x points which represents the reliability of this friend
38 * If the score reaches 0 the friend is revoked (blacklisted for the future?) and its videos are deleted
39
40### Communications 12### Communications
41 * All the communications between pods are signed, encrypted with a RSA key and a symetric encryption in a POST request (body) 13 * All the communications between the instances are signed with [Linked Data Signatures](https://w3c-dvcg.github.io/ld-signatures/) with the private key of the account that made the action
42 * All the requests are retried if they failed 14 * 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).
43 * The requests are made at regular intervals to all pods of the network with a limit of parallel requests: if there are 1000 pods in the networks, the server won't make more than 10 requests in parallel 15 * All the requests are retried several times if they fail
44 * If there are no informations to send (no video addition/removal), no requests are made
45 * The requests are grouped: for example if the interval is 1 hour and a user$ upload 2 videos there will be only 1 request that contains the 2 videos informations
46 * The requests in the group are ordered: if a user add a video and remove it, we need to transmit these informations to the other pods in the same order
47 * The requests are grouped with a limit: if a user uploads 100 videos at a time, the information could be propagated in a few hours to do not make too big requests
48 * If a grouped request fails the score is decreased by x points
49 * If a grouped request is a success the score is increased by x points
50 * The maximum of points would be defined 16 * The maximum of points would be defined
51 * A pod which receives a request checks if the signature corresponds to the pod it has in its database. Then, it decrypts the body (or ignores it if the signature is not valid) and process the requests in the same order
52
53### Actions on a pod
54 * A pod is a websocket tracker which is responsible for all the video uploaded in it
55 * A pod has an administrator that can add/remove users, make friends and quit friends
56 * A pod has different user accounts that can upload videos
57 * All pods have an index of all videos of the network (name, origin pod url, small description, uploader username, magnet Uri, thumbnail name, created date and the thumbnail file). For example, a test with 1000000 videos (3 tags each) with alphanum characters and the following lengths: name = 50, author = 50, podHost = 25, description = 250, videoExtension = 4, remoteId = 50, infoHash = 50 and tag = 10 has a PostgreSQL size of ~ 2GB with all the useful indexes. To this, we add 1 000 000 thumbnails of 5-15 KB so 15GB maximum
58 17
59 table_name | row_estimate | index | toast | table 18### Instance
60 pod | 983416 | 140 MB | 83 MB | 57 MB 19 * An instance has a websocket tracker which is responsible for all the video uploaded in it
61 author | 1e+06 | 229 MB | 140 MB | 89 MB 20 * An instance has an administrator that can follow other instances
62 tag | 2.96758e+06 | 309 MB | 182 MB | 127 MB 21 * An instance can be configured to follow back automatically
63 video | 1e+06 | 723 MB | 263 MB | 460 MB 22 * An instance can blacklist other instances (only used in "follow back" mode)
64 video_tag | 3e+06 | 316 MB | 212 MB | 104 MB 23 * An instance cannot choose which other instance follow it, but it can decide to **reject all** followers
65 24 * After having uploaded a video, the instance seeds it (WebSeed protocol)
66 25 * If a user wants to watch a video, he asks its instance the magnet URI and the frontend adds the torrent (with WebTorrent), creates the HTML5 video player and streams the file into it
67 * After having uploaded a video, the server seeds it (WebSeed protocol), adds the meta data in its database and makes a secure request to all of its friends
68 * If a user wants to watch a video, he asks its pod the magnetUri and the frontend adds the torrent (with WebTorrent), creates the HTML5 video tag and streams the file into it
69 * A user watching a video seeds it too (BitTorrent) so another user who is watching the same video can get the data from the origin server and the user 1 (etc) 26 * A user watching a video seeds it too (BitTorrent) so another user who is watching the same video can get the data from the origin server and the user 1 (etc)
70
71## Ideas
72
73 * A video could have more information (detailed description etc) that are not sent on other pods. The user who wants to see these informations has to ask its pod:
74 user asks its pod -> user pod asks origin video pod -> origin video pod responds with the informations -> user pod responds to the user (and puts in cache the informations ?). We could extend this scheme with other informations
75 * Redondance: if the origin pod is down, the video is not accessible anymore (no tracker/seeds). We could imagine a redondance between pods that keep seeding the video
76 * Server could transcode the video to lower qualities (cost in CPU and disk space)
77 * Add subtitles to videos
78 * Avoid stocking friends URL schemes (http/https)
79
80## Debate
81
82 * Is an ex-friend should be blacklisted for the future?
83 * Handle API breaks in a network. If a major update breaks the API: we need the entire network update to the same major version. We could specify a limit date (2, 3 weeks after the release?) after which all the updated pod would switch to the new version of the API. The non updated pod will then be ejected of the network because would not implement the new API