1
Fork 0
mirror of https://github.com/jech/galene.git synced 2024-11-22 16:45:58 +01:00
The Galène videoconference server
Find a file
Juliusz Chroboczek 1fe64e15f0 Remove packet pacing.
It's not obvious that it's useful, especially now that the writer
is split into multiple threads.  Do retain the dynamically computed
delay in case of audio congestion.
2020-09-13 09:40:49 +02:00
data Move ice-servers.json under dataDir. 2020-08-07 11:14:34 +02:00
estimator Use jiffies in rate estimator. 2020-06-09 14:14:32 +02:00
jitter Rename mono to rtptime. 2020-06-03 20:12:25 +02:00
packetcache Be more aggressive about growing the packet cache. 2020-06-09 17:17:21 +02:00
rtptime Compute down track RTT. 2020-06-03 23:45:45 +02:00
static Load toastify before its users. 2020-09-12 18:31:04 +02:00
.gitignore Add .gitignore. 2020-04-30 19:13:32 +02:00
client.go Implement graceful server shutdown. 2020-09-12 13:59:55 +02:00
conn.go Remove unused function getTimestamp. 2020-09-12 14:47:09 +02:00
disk.go Make disk recording clients kickable. 2020-09-12 14:00:14 +02:00
go.mod Update pion/webrtc to v3 beta4. 2020-09-05 14:15:39 +02:00
go.sum Update pion/webrtc to v3 beta4. 2020-09-05 14:15:39 +02:00
group.go Make disk recording clients kickable. 2020-09-12 14:00:14 +02:00
README Implement group redirection. 2020-09-10 14:22:34 +02:00
README.FRONTEND Remove up media when closing the socket. 2020-08-23 19:07:52 +02:00
rtpconn.go Release lock early in newUpConn. 2020-09-13 02:27:50 +02:00
rtpwriter.go Remove packet pacing. 2020-09-13 09:40:49 +02:00
sfu.go Implement graceful server shutdown. 2020-09-12 13:59:55 +02:00
webclient.go Remove ErrWriterDead, replace with ErrClientDead. 2020-09-13 02:02:11 +02:00
webserver.go Create webserver structure in main thread. 2020-09-13 02:02:11 +02:00

# Installation

Build the server binary:

    CGO_ENABLED=0 go build -ldflags='-s -w'

Create a server certificate:

    mkdir data
    openssl req -newkey rsa:2048 -nodes -keyout data/key.pem -x509 -days 365 -out data/cert.pem

Set the server administrator's username and password (optional):

    echo 'god:topsecret' > data/passwd

Configure the list of STUN and TURN servers (optional):

    vi data/ice-servers.json

Set up a group

    mkdir groups
    vi groups/public.json

    {
      "public":true,
      "op":[{"username":"jch","password":"1234"}],
      "presenter":[{}],
      "max-users":100
    }

Copy the necessary files to your server:

    rsync -a sfu static data groups server.example.org:/home/sfu/

Run the server binary:

    ssh server.example.org
    cd /home/sfu/
    nohup ./sfu &


# Locations

There is a landing page at the root of the server.  It contains a form
for typing the name of a group, and a clickable list of public groups.

Groups are available under `/group/groupname`.  You may share this URL
with others, there is no need to go through the landing page.

Recordings can be accessed under `/recordings/groupname`.  This is only
available to the administrator of the group.

Some statistics are available under `/stats`.  This is only available to
the server administrator.


# Group definitions

Groups are defined by files in the directory defined by the `-groups`
command-line option, one per group.  The group definition file does not
contain the name of the group -- that makes it possible to set up a new
group just by copying a template file.

The group definition file contains a JSON directory with the following
fields, all of which are optional.

 - `op`, `presenter`, `other`: each of these is an array of user
   definitions (see below) and specifies the users allowed to connect
   respectively with operator privileges, with presenter privileges, and
   as passive listeners;
 - `public`: if true, then the group is visible on the landing page;
 - `max-clients`: the maximum number of clients that may join the group at
   a time;
 - `allow-recording`: if true, then recording is allowed in this group;
 - `allow-anonymous`: if true, then users may connect with an empty
   username; this is not recommended, since anonymous users are not
   allowed to participate in the chat;
 - `redirect`: if set, then attempts to join the group will be redirected
   to the given URL; most other fields are ignored in this case.
   
A user definition is a dictionary with the following fields:

 - `username`: the username of the user; if omitted, any username is
   allowed;
 - `password`: the password of the user; if omitted, then any password
   (including the empty paassword) is allowed.
   
For example

    {"username":"jch", "password":"topsecret"}
    
specifies user *jch* with password *topsecret*, while

    {"password":"topsecret"}
    
specifies that any username will do.  The empty dictionary

    {}
    
specifies that any username will do and that password are not verified.


# Commands

Typing a line starting with a slash `/` in the chat dialogue causes
a command to be sent to the server.  The following commands are available
to all users:

 - `/me text`: sends a chat message starting with the sender's username;
 - `/leave`: equivalent to clicking the *Disconnect* button.
 
The following commands are only available to users with operator
privileges:

 - `/clear`: clears the chat history for all users;
 - `/lock`: prevents any new users from connecting to the group unless
   they have operator privileges;
 - `/unlock`: reverts the effect of `/lock`;
 - `/record`: start recording;
 - `/unrecord`: stop recording;
 - `/op user`: gives operator privileges to a user;
 - `/unop user`: takes away operator privileges;
 - `/present user`: gives presenter privileges to a user;
 - `/unpresent user`: takes away presenter privileges from a user and
   forcibly closes any presentations from that user that may be taking place;
 - `/kick user`: forcibly disconnects a user from the group.

--- Juliusz Chroboczek <https://www.irif.fr/~jch/>