Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Jitsi Meet Server and Videobridge Installation on Raspberry Pi 4 with Ubuntu Server 20.04

Jitsi Meet install on a Raspberry Pi 4 with Ubuntu Server 20.04

This guide helps you host your own Jitsi server on a Raspberry Pi 4B. It is adapted from Jitsi's quick install guide and the Jitsi on ARM guide written by crouchingtigerhiddenadam. The biggest difference is this is designed to work with a Pi running Ubuntu Server 20.04 instead of Raspbian.

I did this because I'd rather set up Jitsi Meet on a Raspberry Pi I already own than add a dedicated VPS (and pay AWS's bandwidth costs) just for that. I used Ubuntu 20.04 because I'm more familiar with Ubuntu than with Raspbian, and using an arm64 OS makes the setup easier than on armhf. I also tried to use distribution packages instead of manually downloading individual deb files throughout.

Prerequisites

This guide assumes you already have a DNS name set up with an A record pointing to the public IP address of your Raspberry Pi.

Get Ubuntu Server 20.04 for Raspberry Pi

You can get this from https://ubuntu.com/download/raspberry-pi - I used the 64-bit image for Raspberry Pi 4. The default username and password on that are both "ubuntu"; it will prompt you to set a new password on first login.

You'll want to set that up the same way you would any other distribution for a Pi, and set yourself up for SSH access if you don't have a conveniently-placed keyboard connected to your Pi. If you're not familiar with how to get started writing that disk image to a microSD card there's a tutorial you can follow at https://ubuntu.com/tutorials/how-to-install-ubuntu-on-your-raspberry-pi#1-overview for this step.

Install the Jitsi packages

Generally speaking this means you'll need to follow the instructions at https://github.com/jitsi/jitsi-meet/blob/master/doc/quick-install.md, but stop before the Let's Encrypt certificate step.

In slightly more detail:

Set up your Fully-Qualified Domain Name

I assume you already have an FQDN set up in DNS that you want to use for this Jitsi install - suppose that's jitsi.example.com. First, change the hostname on the machine to match that:

sudo hostnamectl set-hostname jitsi.example.com

Then use vim or your favorite editor to put the same FQDN in the /etc/hosts file, associating it with the loopback address. This means you'll edit the first line of that file so it looks like:

127.0.0.1 localhost jitsi.example.com

After modifying the hostname and hosts files you'll want to restart your Pi so that the changes take effect: sudo shutdown -r now.

Add the Jitsi package repository

echo 'deb https://download.jitsi.org stable/' | sudo tee /etc/apt/sources.list.d/jitsi-stable.list
wget -qO -  https://download.jitsi.org/jitsi-key.gpg.key | sudo apt-key add -

Open ports in your firewall

Open 80/TCP, 443/TCP and 10000/UDP on your firewall, making sure those ports are forwarded to your Pi if it's behind a NAT.

Install the Jitsi Meet packages

# Ensure support is available for apt repositories served via HTTPS
sudo apt install apt-transport-https

# Retrieve the latest package versions across all repositories
sudo apt update

# Perform jitsi-meet installation
sudo apt install jitsi-meet

The installer will ask you for the hostname of your Jitsi Meet instance; set that to the same FQDN you entered earlier. Then it'll ask about an SSL certificate; pick "Generate a new self-signed certificate". We'll set up a real SSL cert with Let's Encrypt in the next step.

Generate an SSL certificate with Let's Encrypt

Here our instructions diverge from the Jitsi quick-install guide. The script metioned there uses certbot-auto, which is not supported on Ubuntu 20.04, so we're going to modify the script a little to make it work. We still want to use that script instead of calling certbot ourselves because the script also sets up a post-renewal hook for the turnserver.

First, install certbot from the Ubuntu repositories:

sudo apt install certbot

Then update Jitsi's letencrypt cert install script to make it use our locally installed certbot:

# Backup the cert install script
sudo cp /usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh ~/install-letsencypt-cert.sh.bak

# Edit the install script
sudo vim /usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh

# Edit the file by hand in vim:
# 1. remove the call to install certbot-auto, and all references to $CRON_FILE (lines 28-38, 78, 99 and 103-104 in my version)
# 2. replace all the remaining calls to './certbot-auto' to 'certbot' - there should be three of them.

Don't worry if you mess this up; that's why we created a backup! Once you're done, you can check that your diff looks like mine: https://gist.github.com/krithin/ff346a5f4d8a442235fbf96900ed4d36

Once done with the edits, run the script and have it generate certs:

sudo /usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh

At this point you should see the landing page load correctly at https://jitsi.example.com! Yay! Unfortunately we're not done yet, because as you'll see it doesn't actually work if you try to connect multiple clients to a jitsi meeting; we'll fix that in the next step.

Install SCTP from source

This section is cribbed off jitsi-meet issue 6449.

Install openjdk-8 and build requirements

sudo apt install openjdk-8-jdk build-essential libtool maven

Stop services

sudo systemctl stop prosody jitsi-videobridge2 jicofo

Recompile jniwrapper-native-1.0-SNAPSHOT

git clone https://github.com/sctplab/usrsctp.git
git clone https://github.com/jitsi/jitsi-sctp
mv ./usrsctp ./jitsi-sctp/usrsctp/
cd ./jitsi-sctp
mvn package -DbuildSctp -DbuildNativeWrapper -DdeployNewJnilib -DskipTests

Copy libjnisctp.so

cp ./jniwrapper/native/target/libjnisctp-linux-aarch64.so \
 ./jniwrapper/native/src/main/resources/lib/linux/libjnisctp.so

Re-package and Copy jniwrapper-native-1.0-SNAPSHOT.jar into Jitsi VideoBridge2

When running mvn package ensure all unit tests are successful. You will see some warnings about "Using platform encoding", but that's fine because we're building on the platform that we intend to run this on anyway.

mvn package
sudo cp ./jniwrapper/native/target/jniwrapper-native-1.0-SNAPSHOT.jar \
 /usr/share/jitsi-videobridge/lib/jniwrapper-native-1.0-SNAPSHOT.jar

Restart the services

sudo systemctl start prosody jitsi-videobridge2 jicofo

Check if it worked!

systemctl status jitsi-videobridge2

Fire up your web browser, start a jitsi meeting, join it from another tab or another device, and check the jitsi logs at sudo less /var/log/jitsi/jvb.log if something is amiss.

@crouchingtigerhiddenadam

This comment has been minimized.

Copy link

@crouchingtigerhiddenadam crouchingtigerhiddenadam commented May 8, 2020

Well this is easier to follow! I didn't add the repositories because apt update and apt -y upgrade might break the install. I'd hope it would be possible to incorporate arm and arm64 into the general build process so Jitsi Meet can be kept up to date automatically. With that one exception, I'm following the same instructions when installing on Debian (aarch64) and Ubuntu. What you've written is very user friendly.

@holger49

This comment has been minimized.

Copy link

@holger49 holger49 commented Jun 14, 2020

Hi crouchingtigerhiddenadam
I have installed successful with your instruction jitsi on a raspberry. It's in this time only with a 4 GB raspi. But the ram-consumtion is less, if we have only few participants.
jitsiOnRaspi1
In the view is to see, the jitsi-session on my pc (ubuntu) and the remote graphical user interface of the raspi. The system monitor is running on the raspi.
For the remote user interface I have installed on the raspi:
sudo apt-get install xrdp
and on the pc:
sudo apt-get install grdesktop
For the jitsi-server is the graphical desktop on the raspi not necessary. I use it only for displaying the system-monitor.
grafik

Great thanks for your instruction.
I don't have publish the address of my server, because it is worldwide accessible from the internet. It is a small device and cannot serve many participants.

@shockwaves

This comment has been minimized.

Copy link

@shockwaves shockwaves commented Jul 5, 2020

Hi @krithin
What can I do if I not have DNS, can local jitsi server be accessible via IP address?
Thank You

@holger49

This comment has been minimized.

Copy link

@holger49 holger49 commented Jul 6, 2020

be accessible via IP address

I think, it isn't possible. It is a lot of config-settings take the domain-name of the server. The certificat of the https-connection is also nessesary coupled with the domain.
But, it is very easy to use a domain. We have a lot of free of charge dyndns-services. I use www.twodns.de for ipv4-adresses. You can free choose between borders a domain-name.
And people have a readable name for contact.

@shockwaves

This comment has been minimized.

Copy link

@shockwaves shockwaves commented Jul 11, 2020

I follow all steps, but result is nginx page only:
image

@holger49

This comment has been minimized.

Copy link

@holger49 holger49 commented Jul 11, 2020

I think, you must use https://homeservice..... Have you a letsencrypt-certificat?
What is the result of
sudo service jitsi-videobridge2 status
sudo service jicofo status

@shockwaves

This comment has been minimized.

Copy link

@shockwaves shockwaves commented Jul 12, 2020

It seems that the selected DNS provider does not support free certificates and because of this https does not work.
Is this possible at all?

I intend to repeat all the steps again.

@shockwaves

This comment has been minimized.

Copy link

@shockwaves shockwaves commented Jul 12, 2020

image

image

image

@shockwaves

This comment has been minimized.

Copy link

@shockwaves shockwaves commented Jul 12, 2020

My domain is only available from www. prefix, so do I need to change the provider?

@shockwaves

This comment has been minimized.

Copy link

@shockwaves shockwaves commented Jul 12, 2020

Ok, it is working now
My bad is missed port forwarding for 443 and 10000 port on my router
Success!!!

image

@shockwaves

This comment has been minimized.

Copy link

@shockwaves shockwaves commented Jul 12, 2020

I have another challenge.
Is it possible to create headless jitsi client with usb camera on raspberry and connect to own server room?
I`m going to use raspberry as a web camera host with two way audio stream (video intercom)
maybe jitsi is too redundant solution for this purpose?

@johannes-schmatz

This comment has been minimized.

Copy link

@johannes-schmatz johannes-schmatz commented Sep 8, 2020

I stuck at mvn package -DbuildSctp -DbuildNativeWrapper -DdeployNewJnilib -DskipTests:
It outputs following (this is the second run):

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 (file:/usr/share/maven/lib/guice.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
[�[1;34mINFO�[m] Scanning for projects...
[�[1;34mINFO�[m] �[1m------------------------------------------------------------------------�[m
[�[1;34mINFO�[m] �[1mReactor Build Order:�[m
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] jitsi-sctp                                                         [pom]
[�[1;34mINFO�[m] usrsctp native library                                             [jar]
[�[1;34mINFO�[m] jniwrapper                                                         [pom]
[�[1;34mINFO�[m] usrsctp JNI wrapper (Java code)                                    [jar]
[�[1;34mINFO�[m] usrsctp JNI wrapper (native code)                                  [jar]
[�[1;34mINFO�[m] jnilib                                                             [jar]
[�[1;34mINFO�[m] Java SCTP library                                                  [jar]
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m------------------------< �[0;36morg.jitsi:jitsi-sctp�[0;1m >------------------------�[m
[�[1;34mINFO�[m] �[1mBuilding jitsi-sctp 1.0-SNAPSHOT                                   [1/7]�[m
[�[1;34mINFO�[m] �[1m--------------------------------[ pom ]---------------------------------�[m
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m-------------------------< �[0;36morg.jitsi:usrsctp�[0;1m >--------------------------�[m
[�[1;34mINFO�[m] �[1mBuilding usrsctp native library 1.0-SNAPSHOT                       [2/7]�[m
[�[1;34mINFO�[m] �[1m--------------------------------[ jar ]---------------------------------�[m
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mmaven-resources-plugin:2.6:resources�[m �[1m(default-resources)�[m @ �[36musrsctp�[0;1m ---�[m
[�[1;33mWARNING�[m] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[�[1;34mINFO�[m] skip non existing resourceDirectory /home/ubuntu/jitsi-sctp/usrsctp/src/main/resources
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mmaven-compiler-plugin:3.1:compile�[m �[1m(default-compile)�[m @ �[36musrsctp�[0;1m ---�[m
[�[1;34mINFO�[m] No sources to compile
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mexec-maven-plugin:1.6.0:exec�[m �[1m(bootstrap)�[m @ �[36musrsctp�[0;1m ---�[m
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mexec-maven-plugin:1.6.0:exec�[m �[1m(configure)�[m @ �[36musrsctp�[0;1m ---�[m
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking whether gcc understands -c and -o together... yes
checking whether make supports the include directive... yes (GNU style)
checking dependency style of gcc... gcc3
checking build system type... aarch64-unknown-linux-gnu
checking host system type... aarch64-unknown-linux-gnu
checking how to print strings... printf
checking for a sed that does not truncate output... /usr/bin/sed
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for fgrep... /usr/bin/grep -F
checking for ld used by gcc... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B
checking the name lister (/usr/bin/nm -B) interface... BSD nm
checking whether ln -s works... yes
checking the maximum length of command line arguments... 1572864
checking how to convert aarch64-unknown-linux-gnu file names to aarch64-unknown-linux-gnu format... func_convert_file_noop
checking how to convert aarch64-unknown-linux-gnu file names to toolchain format... func_convert_file_noop
checking for /usr/bin/ld option to reload object files... -r
checking for objdump... objdump
checking how to recognize dependent libraries... pass_all
checking for dlltool... no
checking how to associate runtime and link libraries... printf %s\n
checking for ar... ar
checking for archiver @FILE support... @
checking for strip... strip
checking for ranlib... ranlib
checking command to parse /usr/bin/nm -B output from gcc object... ok
checking for sysroot... no
checking for a working dd... /usr/bin/dd
checking how to truncate binary pipes... /usr/bin/dd bs=4096 count=1
checking for mt... mt
checking if mt is a manifest tool... no
checking how to run the C preprocessor... gcc -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for dlfcn.h... yes
checking for objdir... .libs
checking if gcc supports -fno-rtti -fno-exceptions... no
checking for gcc option to produce PIC... -fPIC -DPIC
checking if gcc PIC flag -fPIC -DPIC works... yes
checking if gcc static flag -static works... yes
checking if gcc supports -c -o file.o... yes
checking if gcc supports -c -o file.o... (cached) yes
checking whether the gcc linker (/usr/bin/ld) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... yes
checking whether we should treat compiler warnings as errors... yes
checking for size_t... yes
checking for ssize_t... yes
checking for socket... yes
checking for inet_addr... yes
checking stdatomic.h usability... yes
checking stdatomic.h presence... yes
checking for stdatomic.h... yes
checking sys/queue.h usability... yes
checking sys/queue.h presence... yes
checking for sys/queue.h... yes
checking for linux/if_addr.h... yes
checking for linux/rtnetlink.h... yes
checking for netinet/ip_icmp.h... yes
checking for struct sockaddr.sa_len... no
checking for struct sockaddr_in.sin_len... no
checking for struct sockaddr_in6.sin6_len... no
checking for struct sockaddr_conn.sconn_len... no
checking for socklen_t... yes
checking whether byte ordering is bigendian... no
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating usrsctplib/Makefile
config.status: creating programs/Makefile
config.status: creating Makefile
config.status: executing depfiles commands
config.status: executing libtool commands
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mexec-maven-plugin:1.6.0:exec�[m �[1m(buildlib)�[m @ �[36musrsctp�[0;1m ---�[m
Making all in usrsctplib
make[1]: Entering directory '/home/ubuntu/jitsi-sctp/usrsctp/usrsctp/usrsctplib'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/home/ubuntu/jitsi-sctp/usrsctp/usrsctp/usrsctplib'
Making all in programs
make[1]: Entering directory '/home/ubuntu/jitsi-sctp/usrsctp/usrsctp/programs'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/home/ubuntu/jitsi-sctp/usrsctp/usrsctp/programs'
make[1]: Entering directory '/home/ubuntu/jitsi-sctp/usrsctp/usrsctp'
make[1]: Nothing to be done for 'all-am'.
make[1]: Leaving directory '/home/ubuntu/jitsi-sctp/usrsctp/usrsctp'
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mmaven-resources-plugin:2.6:testResources�[m �[1m(default-testResources)�[m @ �[36musrsctp�[0;1m ---�[m
[�[1;33mWARNING�[m] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[�[1;34mINFO�[m] skip non existing resourceDirectory /home/ubuntu/jitsi-sctp/usrsctp/src/test/resources
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mmaven-compiler-plugin:3.1:testCompile�[m �[1m(default-testCompile)�[m @ �[36musrsctp�[0;1m ---�[m
[�[1;34mINFO�[m] No sources to compile
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mmaven-surefire-plugin:2.12.4:test�[m �[1m(default-test)�[m @ �[36musrsctp�[0;1m ---�[m
[�[1;34mINFO�[m] Tests are skipped.
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mmaven-jar-plugin:2.4:jar�[m �[1m(default-jar)�[m @ �[36musrsctp�[0;1m ---�[m
[�[1;33mWARNING�[m] JAR will be empty - no content was marked for inclusion!
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mmaven-assembly-plugin:3.1.0:single�[m �[1m(make-assembly)�[m @ �[36musrsctp�[0;1m ---�[m
[�[1;34mINFO�[m] Reading assembly descriptor: javalibs.xml
[�[1;34mINFO�[m] Building zip: /home/ubuntu/jitsi-sctp/usrsctp/target/usrsctp-1.0-SNAPSHOT-libs.zip
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m------------------------< �[0;36morg.jitsi:jniwrapper�[0;1m >------------------------�[m
[�[1;34mINFO�[m] �[1mBuilding jniwrapper 1.0-SNAPSHOT                                   [3/7]�[m
[�[1;34mINFO�[m] �[1m--------------------------------[ pom ]---------------------------------�[m
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m---------------------< �[0;36morg.jitsi:jniwrapper-java�[0;1m >----------------------�[m
[�[1;34mINFO�[m] �[1mBuilding usrsctp JNI wrapper (Java code) 1.0-SNAPSHOT              [4/7]�[m
[�[1;34mINFO�[m] �[1m--------------------------------[ jar ]---------------------------------�[m
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mmaven-resources-plugin:2.6:resources�[m �[1m(default-resources)�[m @ �[36mjniwrapper-java�[0;1m ---�[m
[�[1;33mWARNING�[m] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[�[1;34mINFO�[m] skip non existing resourceDirectory /home/ubuntu/jitsi-sctp/jniwrapper/java/src/main/resources
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mmaven-compiler-plugin:3.8.0:compile�[m �[1m(default-compile)�[m @ �[36mjniwrapper-java�[0;1m ---�[m
[�[1;34mINFO�[m] Nothing to compile - all classes are up to date
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mmaven-resources-plugin:2.6:testResources�[m �[1m(default-testResources)�[m @ �[36mjniwrapper-java�[0;1m ---�[m
[�[1;33mWARNING�[m] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[�[1;34mINFO�[m] skip non existing resourceDirectory /home/ubuntu/jitsi-sctp/jniwrapper/java/src/test/resources
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mmaven-compiler-plugin:3.8.0:testCompile�[m �[1m(default-testCompile)�[m @ �[36mjniwrapper-java�[0;1m ---�[m
[�[1;34mINFO�[m] No sources to compile
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mmaven-surefire-plugin:2.12.4:test�[m �[1m(default-test)�[m @ �[36mjniwrapper-java�[0;1m ---�[m
[�[1;34mINFO�[m] Tests are skipped.
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mmaven-jar-plugin:2.4:jar�[m �[1m(default-jar)�[m @ �[36mjniwrapper-java�[0;1m ---�[m
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--------------------< �[0;36morg.jitsi:jniwrapper-native�[0;1m >---------------------�[m
[�[1;34mINFO�[m] �[1mBuilding usrsctp JNI wrapper (native code) 1.0-SNAPSHOT            [5/7]�[m
[�[1;34mINFO�[m] �[1m--------------------------------[ jar ]---------------------------------�[m
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mmaven-dependency-plugin:2.8:unpack-dependencies�[m �[1m(unpack)�[m @ �[36mjniwrapper-native�[0;1m ---�[m
[�[1;34mINFO�[m] Unpacking /home/ubuntu/jitsi-sctp/usrsctp/target/usrsctp-1.0-SNAPSHOT-libs.zip to /home/ubuntu/jitsi-sctp/jniwrapper/native/target with includes "" and excludes ""
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mmaven-resources-plugin:2.6:resources�[m �[1m(default-resources)�[m @ �[36mjniwrapper-native�[0;1m ---�[m
[�[1;33mWARNING�[m] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[�[1;34mINFO�[m] Copying 3 resources
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mmaven-compiler-plugin:3.1:compile�[m �[1m(default-compile)�[m @ �[36mjniwrapper-native�[0;1m ---�[m
[�[1;34mINFO�[m] No sources to compile
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mnative-maven-plugin:1.0-alpha-9:javah�[m �[1m(java-compile)�[m @ �[36mjniwrapper-native�[0;1m ---�[m
[�[1;34mINFO�[m] /bin/sh -c cd '/home/ubuntu/jitsi-sctp/jniwrapper/native' && 'javah' '-d' '/home/ubuntu/jitsi-sctp/jniwrapper/native/target/native/javah' '-classpath' '/home/ubuntu/jitsi-sctp/jniwrapper/native/target/classes:/home/ubuntu/jitsi-sctp/jniwrapper/java/target/jniwrapper-java-1.0-SNAPSHOT.jar' 'org.jitsi_modified.sctp4j.SctpJni'
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] �[1m--- �[0;32mnative-maven-plugin:1.0-alpha-9:compile�[m �[1m(java-compile)�[m @ �[36mjniwrapper-native�[0;1m ---�[m
[�[1;34mINFO�[m] /bin/sh -c cd '/home/ubuntu/jitsi-sctp/jniwrapper/native' && 'gcc' '-g' '-fPIC' '-std=c99' '-O2' '-Wall' '-Itarget/native/javah' '-I/home/ubuntu/jitsi-sctp/jniwrapper/native/src' '-I/home/ubuntu/jitsi-sctp/jniwrapper/native/target/usrsctp-1.0-SNAPSHOT/include' '-I/home/ubuntu/jitsi-sctp/jniwrapper/native/target/native/javah' '-I/usr/lib/jvm/java-14-openjdk-arm64/../include' '-I/usr/lib/jvm/java-14-openjdk-arm64/../include/linux' '-o' '/home/ubuntu/jitsi-sctp/jniwrapper/native/target/objs/org_jitsi_modified_sctp4j_SctpJni.o' '-c' '/home/ubuntu/jitsi-sctp/jniwrapper/native/src/org_jitsi_modified_sctp4j_SctpJni.c'
In file included from /home/ubuntu/jitsi-sctp/jniwrapper/native/src/org_jitsi_modified_sctp4j_SctpJni.c:17:
target/native/javah/org_jitsi_modified_sctp4j_SctpJni.h:2:10: fatal error: jni.h: No such file or directory
    2 | #include <jni.h>
      |          ^~~~~~~
compilation terminated.
[�[1;34mINFO�[m] �[1m------------------------------------------------------------------------�[m
[�[1;34mINFO�[m] �[1mReactor Summary for jitsi-sctp 1.0-SNAPSHOT:�[m
[�[1;34mINFO�[m] 
[�[1;34mINFO�[m] jitsi-sctp ......................................... �[1;32mSUCCESS�[m [  0.012 s]
[�[1;34mINFO�[m] usrsctp native library ............................. �[1;32mSUCCESS�[m [ 24.686 s]
[�[1;34mINFO�[m] jniwrapper ......................................... �[1;32mSUCCESS�[m [  0.006 s]
[�[1;34mINFO�[m] usrsctp JNI wrapper (Java code) .................... �[1;32mSUCCESS�[m [  0.612 s]
[�[1;34mINFO�[m] usrsctp JNI wrapper (native code) .................. �[1;31mFAILURE�[m [  7.427 s]
[�[1;34mINFO�[m] jnilib ............................................. �[1;33mSKIPPED�[m
[�[1;34mINFO�[m] Java SCTP library .................................. �[1;33mSKIPPED�[m
[�[1;34mINFO�[m] �[1m------------------------------------------------------------------------�[m
[�[1;34mINFO�[m] �[1;31mBUILD FAILURE�[m
[�[1;34mINFO�[m] �[1m------------------------------------------------------------------------�[m
[�[1;34mINFO�[m] Total time:  35.003 s
[�[1;34mINFO�[m] Finished at: 2020-09-08T19:23:15Z
[�[1;34mINFO�[m] �[1m------------------------------------------------------------------------�[m
[�[1;31mERROR�[m] Failed to execute goal �[32morg.codehaus.mojo:native-maven-plugin:1.0-alpha-9:compile�[m �[1m(java-compile)�[m on project �[36mjniwrapper-native�[m: �[1;31mError executing command line. Exit code:1�[m -> �[1m[Help 1]�[m
[�[1;31mERROR�[m] 
[�[1;31mERROR�[m] To see the full stack trace of the errors, re-run Maven with the �[1m-e�[m switch.
[�[1;31mERROR�[m] Re-run Maven using the �[1m-X�[m switch to enable full debug logging.
[�[1;31mERROR�[m] 
[�[1;31mERROR�[m] For more information about the errors and possible solutions, please read the following articles:
[�[1;31mERROR�[m] �[1m[Help 1]�[m http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[�[1;31mERROR�[m] 
[�[1;31mERROR�[m] After correcting the problems, you can resume the build with the command
[�[1;31mERROR�[m]   �[1mmvn <args> -rf :jniwrapper-native�[m

HW: Raspberry Pi 4 2GB with Ubuntu 20.04

What should I do?

@applecargo

This comment has been minimized.

Copy link

@applecargo applecargo commented Sep 9, 2020

target/native/javah/org_jitsi_modified_sctp4j_SctpJni.h:2:10: fatal error: jni.h: No such file or directory
2 | #include <jni.h>
| ^~~~~~~
compilation terminated.

if you have already installed 'openjdk-8-jdk' or some 'jdk', try out following 2 extra steps:

sudo update-alternatives --config java
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-arm64/

anyway maven is not finding 'jni.h'.. that is the problem. you have jdk somewhere in the system. which might differ than mine (/usr/lib/jvm/java-8-openjdk-arm64/), good luck!

@phqzgunsfjror

This comment has been minimized.

Copy link

@phqzgunsfjror phqzgunsfjror commented Oct 11, 2020

I was able to set up jitsi on my raspi 4 with this manual.

For some reason participants can normally join but cannot share the screen (own person can see own shared screen but not the others).
Unfortunately there is no useful error message in log file.

How can I get screen sharing working?

@superfino

This comment has been minimized.

Copy link

@superfino superfino commented Nov 1, 2020

Three month ago the install-letsencrypt-cert.sh script has changed and they have replaced certbot-auto with certbot. So I think there is no modification needed any longer. Changed has obviously also the directory structure from openjdk-8-jdk. I suffered the same problem like johannes-schmatz since the compiler can't find several files not only 'jni.h which is placed now in a 'include' directory. Unfortunately i was not able to figure out where to change this, so any help is appreciated.

@superfino

This comment has been minimized.

Copy link

@superfino superfino commented Nov 1, 2020

No sorry, as you were - I don't know how but I've overseen 'applecargos' update that solved the problem but, one of the next steps 'mvn package' runs in errors. If this log isn't helpful i can run Maven with enhanced output. So still any help is appreciatet.

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for jitsi-sctp 1.0-SNAPSHOT:
[INFO]
[INFO] jitsi-sctp ......................................... SUCCESS [ 0.031 s]
[INFO] usrsctp native library ............................. SUCCESS [ 3.655 s]
[INFO] jniwrapper ......................................... SUCCESS [ 0.007 s]
[INFO] usrsctp JNI wrapper (Java code) .................... SUCCESS [ 1.199 s]
[INFO] usrsctp JNI wrapper (native code) .................. SUCCESS [ 2.152 s]
[INFO] jnilib ............................................. SUCCESS [ 4.425 s]
[INFO] Java SCTP library .................................. FAILURE [ 1.697 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 13.835 s
[INFO] Finished at: 2020-11-01T17:03:33Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M5:test (default-test) on project sctp: There are test failures.
[ERROR]
[ERROR] Please refer to /home/ubuntu/jitsi-sctp/sctp/target/surefire-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[ERROR] Error creating properties files for forking
[ERROR] org.apache.maven.surefire.booter.SurefireBooterForkException: Error creating properties files for forking
[ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:604)
[ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:305)
[ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:265)
[ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1314)
[ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1159)
[ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:932)
[ERROR] at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
[ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
[ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
[ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
[ERROR] at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
[ERROR] at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
[ERROR] at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
[ERROR] at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
[ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
[ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
[ERROR] at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
[ERROR] at org.apache.maven.cli.MavenCli.execute(MavenCli.java:957)
[ERROR] at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:289)
[ERROR] at org.apache.maven.cli.MavenCli.main(MavenCli.java:193)
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[ERROR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR] at java.lang.reflect.Method.invoke(Method.java:498)
[ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
[ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
[ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
[ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)
[ERROR] Caused by: java.net.BindException: Cannot assign requested address
[ERROR] at sun.nio.ch.Net.bind0(Native Method)
[ERROR] at sun.nio.ch.Net.bind(Net.java:461)
[ERROR] at sun.nio.ch.Net.bind(Net.java:453)
[ERROR] at sun.nio.ch.AsynchronousServerSocketChannelImpl.bind(AsynchronousServerSocketChannelImpl.java:163)
[ERROR] at org.apache.maven.plugin.surefire.extensions.SurefireForkChannel.(SurefireForkChannel.java:88)
[ERROR] at org.apache.maven.plugin.surefire.extensions.SurefireForkNodeFactory.createForkChannel(SurefireForkNodeFactory.java:39)
[ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:576)
[ERROR] ... 27 more
[ERROR]
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn -rf :sctp

@AnirudhChandupatla

This comment has been minimized.

Copy link

@AnirudhChandupatla AnirudhChandupatla commented Dec 9, 2020

Hi crouchingtigerhiddenadam
I have installed successful with your instruction jitsi on a raspberry. It's in this time only with a 4 GB raspi. But the ram-consumtion is less, if we have only few participants.
jitsiOnRaspi1
Great thanks for your instruction.

So the RAM consumption i.e 1.8GB out of 3.7GB is including full desktop environment and chrome/chromium browser. but what is actual RAM consumption of just the Jitsi server?

@holger49

This comment has been minimized.

Copy link

@holger49 holger49 commented Dec 9, 2020

The Jitsi Server is running an the Raspi. The View is the Session on my PC and the remote desktop of the graphical user interface of the Raspi. The system monitor is running on the raspi.

@AnirudhChandupatla

This comment has been minimized.

Copy link

@AnirudhChandupatla AnirudhChandupatla commented Dec 9, 2020

The Jitsi Server is running an the Raspi. The View is the Session on my PC and the remote desktop of the graphical user interface of the Raspi. The system monitor is running on the raspi.

Ok so a desktop environment is installed on Raspi?

@holger49

This comment has been minimized.

Copy link

@holger49 holger49 commented Dec 9, 2020

On the raspi:
sudo apt-get install xrdp
Reading package lists... Done
Building dependency tree
Reading state information... Done
xrdp is already the newest version (0.9.12-1).

On the pc (ubuntu):
grdesktop

@holger49

This comment has been minimized.

Copy link

@holger49 holger49 commented Dec 10, 2020

Hi @AnirudhChandupatla
I have change the description of the view. Thank you for the question.

@AnirudhChandupatla

This comment has been minimized.

Copy link

@AnirudhChandupatla AnirudhChandupatla commented Dec 13, 2020

Hi @AnirudhChandupatla
I have change the description of the view. Thank you for the question.

Thank you for the reply @holger49

@matburnham

This comment has been minimized.

Copy link

@matburnham matburnham commented Dec 15, 2020

The Jitsi Server is running an the Raspi. The View is the Session on my PC and the remote desktop of the graphical user interface of the Raspi. The system monitor is running on the raspi.

Oh, so the Raspberry Pi is being used purely as the server? Does this Gist address/intend to address running the client UI/video/camera on the Raspberry Pi itself, or is it purely focused on the getting the server end up and running so that it can be accessed from another device?

I was hoping to be able to use a Raspberry Pi 4 as a simple video endpoint. I don't need the power of the server features (they could run in the cloud or a VPS somewhere). What are the other two video endpoints in your screenshot?

@holger49

This comment has been minimized.

Copy link

@holger49 holger49 commented Dec 16, 2020

When you only need a simple video endpoint, then ist jitsi to take a sledghammer to cack a nut. I recommend for your pc:
sudo apt-get install xawtv
With this you can display a usb-camera connected with usb on your pc.
with xawtv -device /dev/video1
It is also possible with raspi with grahpical desktop and with connected usb-camera.
When you want more comfort, then I recommend zoneminder. You can connect usb- and ip-camera and have also a database for store photo or video. You can select zones for alarm, when you have motion in the camera.
image

@matburnham

This comment has been minimized.

Copy link

@matburnham matburnham commented Dec 16, 2020

By simple video endpoint I mean a simple video endpoint to a VTC (two or three participants). Rather than connecting from a laptop, I'd like to be able to do so from a Raspberry Pi connected to a TV.

@holger49

This comment has been minimized.

Copy link

@holger49 holger49 commented Dec 17, 2020

I think, it is only necessary on the raspi to launch a browser with the outside address of the jitsi on the raspi. You need ubuntu with desktop. Chromium is recommended.

@tgeimer

This comment has been minimized.

Copy link

@tgeimer tgeimer commented Dec 21, 2020

[INFO] usrsctp JNI wrapper (native code) .................. FAILURE [ 7.427 s]
[INFO] jnilib ............................................. SKIPPED
[INFO] Java SCTP library .................................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[...]

if you have already installed 'openjdk-8-jdk' or some 'jdk', try out following 2 extra steps:

sudo update-alternatives --config java
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-arm64/

anyway maven is not finding 'jni.h'.. that is the problem. you have jdk somewhere in the system. which might differ than mine (/usr/lib/jvm/java-8-openjdk-arm64/), good luck!

@applecargo: This did the trick for me - thank you for this! I also had the same problem that the maven package failed today on a fresh install of Ubuntu 20.04.1 on a Raspberry Pi 4 (4GB). Now it works.

@krithin: Thanks for this great tutorial! If more people run into this compiling error you might consider updating the instructions or adding a section...
Cheers and happy holidays to all of you!

@kultex

This comment has been minimized.

Copy link

@kultex kultex commented Dec 27, 2020

I need a version without access to the internet. The setup is quite the same holger49 described. I use it for a dance performance. We perform all our performances in places, with poor or without internet and sometimes with no connection outside the country - like as an example Belarussia. I have 2 old Macbook air on stage. The video conference is projected to a screen - everything works well with eg. https://meet.adminforge.de/
I have a rock64 laying around - the rock64 should do it for 2 participants and there is a armbian ubuntu 20.04 iso available -

Do you think, I will get the rock64 as a jitsi meet server, without a connection to the internet?

@kultex

This comment has been minimized.

Copy link

@kultex kultex commented Dec 27, 2020

I forgot to say, that the rooter is a fritzbox - if I write like talk.fritz.box in the browser it points to the ip address of the rock64 - 10.0.0.26 - some kind of internal DNS resolver

@holger49

This comment has been minimized.

Copy link

@holger49 holger49 commented Dec 28, 2020

I don't understand the problem. You can also use jitsi, if the participants are all in the local network. But you must regardless use the public address of the jitsi-server.

@kultex

This comment has been minimized.

Copy link

@kultex kultex commented Dec 28, 2020

@holger49
can you do me a favor? can you cut the internet connection of your router and see if you can connect between your clients?

@holger49

This comment has been minimized.

Copy link

@holger49 holger49 commented Dec 29, 2020

You need a dns-server in the local network. Par example the pi hole. If the pi hole have receive the tables from the outside-dns-server, you can cut the connection and work inside the local network.
But, what is the reason for closing the connection?
The connection between the participants are encrypted with https. Also the us-american NSA cannot crack the connection. Only on the server are the data open. If you have the server under own control, it is save. It is probability only possible to crack the devices of the participants.

@kultex

This comment has been minimized.

Copy link

@kultex kultex commented Dec 29, 2020

I just give you countries, where we played - Senegal, Marokko, Tunesia, Afganistan, Pakistan, India, Belarus. In some theaters, I dont eaven have a connection with my phone - like in Senegal I had to walk 500m to get a connection with my phone. The theaters dont have internet. I am not afraid of NSA - I am just afraid of no possibility to connect to the internet.

@kultex

This comment has been minimized.

Copy link

@kultex kultex commented Jan 2, 2021

I just can tell success with the rock64 and without internet connection - you just have to stay on the "self-signed certificate", which is no problem, when you run it just with chromium and do not use the apps.
To compare with the pi, here the screenshot with 3 participiants and nmon (because I have no idea about grdesktop with xrdp

jitsi1

@ustspecht

This comment has been minimized.

Copy link

@ustspecht ustspecht commented Feb 15, 2021

I followed the instructions on December 18th, 2020 and a running Jitsi server that works. It runs on a Pi 4 with 4 Gb, I have hosted conferences with 6 participants - everything is going very well. Thank you!! I wanted to update Ubuntu now and also included Jitsi. After that Jitsi runs in my network with camera and micro on the clients, but from the outside the camera and micro are off on the clients. The ICE test for the turn server works, port 10000 is open. If I follow the instructions on a new system, the result is the same. My Jitsi still has the blue background, the new Jitsi (which only works internally) has mountains. Does anyone know what has changed? My ports are all open, if I just update Ubuntu, my previous Jitsi will continue to work.
I would be happy to hear from you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment