# 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 credentials This step is optional. echo 'god:topsecret' > data/passwd ## Set up a TURN server This step depends on your network setup and your user population. If your server is accessible from the Internet (no firewall or NAT) and none of your users are behind restrictive firewalls, then no ICE servers are necessary. If your server is behind a NAT, a STUN server is required. If any of your users are behind restrictive firewalls (which is usually the case of Academic and Enterprise networks), then you will need a TURN server running on an innocent-looking TCP port. This is the recommended setup. You should probably be running your own TURN server — I use *coturn*. The address of the TURN server is configured in the file `data/ice-servers.json`. It should look like this: [ { "urls":["turn:turn.example.com:443"], "username":"username", "credential":"password" }, { "urls":["turn:turn.example.com:443?transport=tcp"], "username":"username", "credential":"password" } ] The port number, username and password should be the same as the ones in your TURN server's configuration. ## Set up a group A group is set up by creating a file `groups/name.json`. The available options are described below. mkdir groups vi groups/public.json { "public": true, "op": [{"username":"jch","password":"1234"}], "presenter": [{}], "max-users": 100 } ## Copy the necessary files to your server: Assuming you have set up a user *galene*: rsync -a galene static data groups [email protected]: ## Run the server binary: ssh [email protected] nohup ./galene & If you are using *runit*, use a script like the following: #!/bin/sh exec 2>&1 cd ~galene ulimit -n 65536 exec setuidgid galene ./galene If you are using *systemd*, something like this should do: [Unit] Description=Galene After=network.target [Service] Type=simple WorkingDirectory=/home/galene User=galene Group=galene ExecStart=/home/galene/galene LimitNOFILE=65536 [Install] WantedBy=multi-user.target # 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; - `description`: a human-readable description of the group; this is displayed on the landing page for public groups; - `max-clients`: the maximum number of clients that may join the group at a time; - `max-history-age`: the time, in seconds, during which chat history is kept (default 14400, i.e. 4 hours); - `allow-recording`: if true, then recording is allowed in this group; - `allow-anonymous`: if true, then users may connect with an empty username. - `allow-subgroups`: if true, then subgroups of the form `group/subgroup` are automatically created when accessed. - `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`: if omitted, then no password is required. Otherwise, this can either be a string, specifying a plain text password, or a dictionary generated by the `galene-password-generator` utility. For example, {"username": "jch", "password": "topsecret"} specifies user *jch* with password *topsecret*, while {"password": "topsecret"} specifies that any username will do. An entry with a hashed password looks like this: { "username": "jch", "password": { "type": "pbkdf2", "hash": "sha-256", "key": "f591c35604e6aef572851d9c3543c812566b032b6dc083c81edd15cc24449913", "salt": "92bff2ace56fe38f", "iterations": 4096 } } # Commands Typing a line starting with a slash `/` in the chat dialogue causes a command to be sent to the server. Type `/help` to get the list of available commands; the output depends on whether you are an operator or not. --- Juliusz Chroboczek <https://www.irif.fr/~jch/>
The Galène videoconferencing server
# Installation ## Build the server binary CGO_ENABLED=0 go build -ldflags='-s -w' ## Create a server certificate mkdir data openssl reCategory: Golang / Server Applications |
Watchers: 5 |
Star: 145 |
Fork: 11 |
Last update: Mar 30, 2021 |
Pull Request on Issue #11
What we add :
- An administrative interface which is not part of the Galène server, so it needs to be executed independently. It needs to have an read and write access to change the json files.
- An administrator can change the groups manually or with the interface, the json files are human readable.
- You have a admin.json which have the admin's usernames and passwords to connect to the interface .
- You can create new groups and modify the old ones
Question is about HAPROXY.
Galene is installed sucessfuly but can't see each other on a room.
I only see my own face. (users also see only their own face).
Configuration Running Galene in a container with only a private IP ( 192.168.10.111) Public IP is behind another container dedicated to haproxy (192.168.10.252 + PUblic IP ) which send the 443 traffic to Galene container on 8443 port. Also some iptables redirect for 1194/UDP and 10000-65535 udp port from Haproxy container to Galene container.
when starting Galene:
# ./galene -turn PUBLIC_IP:1194
2021/01/22 11:51:01 Starting built-in TURN server
2021/01/22 11:51:21 Relay test failed: timeout
2021/01/22 11:51:21 Perhaps you didn't configure a TURN server?
2021/01/22 11:53:31 client: read tcp 192.168.10.111:8443->192.168.10.252:35850: read: connection reset by peer
As we can see, it shows Haproxy IP (192.168.10.252) instead of user IP. (X Forward For ?).
Does Galene support haproxy ?
thanks
Hi all and a big thx first: Galene works great for our team – awesome work.
There is one bug that bothers a little: Sometimes participants can't join the conversation. They appear in the sidebar, are able to click the ready button and even see their own video – but not the others' video/audio. From their perspective, all the others (despite being visible in the sidebar) didn't join the conversation yet. Meanwhile the others can see each other and even hear and see the person with the bug
The weird thing is the irregularity of this:
- most of the users with this bug use Firefox or Safari (we, therefore, agreed on using Chromium browsers internally. But it can be difficult to explain that to external guests that only join once).
- But unfortunately, it even happened to people using latest Google Chrome browsers.
- Today it even happened to me using a Mac, latest Google Chrome with Internet from a Smartphone LTE Hotspot
- Often it helps to restart the browser and or open the link in a private window, but sometimes not...
What makes the bug a problem is, that you cannot see that it is actually you having the bug. It just seems that the rest of the team did not join yet. Chat works btw.
We host Galene as part of aYunohost installation on a VPS. Everything is up to date.
Tell me if I can provide any logs or more information. I am not so deep into programming etc. but I just thought it is good to report the issue.
A private http server for debugging purpose, performance analysis, or monitoring.
It listens on localhost, and should not be routed on Internet.
It exposes :
- stats/groups as JSON
- pprof
- Prometheus endpoint for standard monitoring
On Chrome, Safari all is working perfectely On Firefox, user can connect but is not showing the video of other people. (other can see him).
Is it a general issue on FF ?
thanks
It would be useful if Galene could sanity-check the config on startup. In particular:
- Read all config files and verify their syntax and semantics, log any errors
- Try out the ICE config and log success/failure to connect to each candidate
This would make it easier to be sure that the config works after a change/restart. Maybe even (optionally?) fail to startup if there's an error, so the failure can be picked up by 'systemctl restart'?
Hello! Thank you sooo much for galene, it's an amazing piece of software. The UI/SFU itself is amazing already and with the built-in TURN server it makes deployment so much easier. I can already see a future where companies/nerds can self-host a video server with a budget-friendly Raspberry Pi! That is doing so much to have a self-hosted future where everyone owns their data.
I have recently tried it out with friends and... apologies with the rather boring paragraphs, I have a few questions. I want to start by apologizing that I don't have much logs to share, I know it makes this a VERY bad issue report, but the trouble is it's hard to remotely debug iOS Safari while I only have a Linux desktop. Making sure iOS Safari is a goal for me.
- H264 doesn't work as well on iOS Safari. I have my codec set to ["h264", "opus"] and they won't talk to each other. My bad memory tells me that iOS -> Edge is working, but Edge -> iOS Safari is not. The error is "failed to set local answer sdp failed to set local video description recv parameters m-section with mid=1".
Device A: Windows MS Edge Chromium, have H/W acceleration for H264 & VP8 as per chrome://gpu Device B: iOS 15.3.1 Safari
- iOS Safari is flaky I now have my codec set to ["h264", "vp8" "opus"]. It doesn't work when I have Device A & C FIRST, then Device B joins. By doesn't work, I mean Device A & C can see stream from Device B, but Device B can only see itself. (This is about video, forgot audio's behaviour). If only Device A & B is there, it works.
From Device A's chrome://webrtc-internals, Device A is sending VP8, while Device C is sending H264.
Device A: Windows MS Edge Chromium, have H/W acceleration for H264 & VP8 as per chrome://gpu Device B: iOS 15.3.1 Safari Device C: OS X 12 Safari
- iOS Safari - lost navigation?
I am not sure if it is a navigation problem or something else, but my friend (Device D, iOS Safari, version unknown) she's lost. She was presented with this screen:
There were already 2 devices in the group. However she couldn't hear/see the other 2 devices. At the same time, the other 2 devices didn't see her, not even in the chat sidebar.
Is she in a good state? Is all she need to do is close the sidebar on the left?
Thanks,
A2HS allows users would be able to install the app onto their Desktop and Mobile.
Its great because it bypasses the App Stores, but gives a App Store like experience. For example it adds a Icon to your Desktop or Mobile home screen. And because it uses service worker it self updates.
I have used this with golang apps.
Here is an example in golang: https://github.com/maxence-charriere/lofimusic And the demo: https://lofimusic.app/
IOS Safari video demo for install:
https://user-images.githubusercontent.com/53147028/135843014-b7a63d97-4d60-4bed-b098-fd8a9152f9e3.mov
I also tried it in IOS Chrome and Safari, but for some reason there is no ability to instal it. I know it can be done because i have done it with flutter web... I suspect that loki may not everything setup correctly.
If i get more info on this, i will update it here.
Noticed a lot of small bugs from people being reported.
Mit might be a good idea to have a page or something that shows:
Version of build ( githash ) User agent
you could even add a button that creates an issue and passes that data perhaps but that maybe not needed.
This fix the animation issue mentioned by @MisterDA in #109
The present and unpresent button width is fixed to 5.8em. This is problematic as the content might need more space. By removing the width attribute, the element takes the width it requires.
Screenshot before the modification: "Disable" is overflowing to the right the button.
This is just for the index.html page but the bases are here for i18n The same logic has to be done with galene.html and 404.html