Code Monkey home page Code Monkey logo

ansible-jitsi-meet's Introduction

Jitsi Meet Ansible Playbook

This playbook will install the Jitsi Meet stack in one or more servers. It is developed and tested on Debian 10 Buster. It may work on other Debian releases or Ubuntu, but it has not been tested there.

Before using it you may want to read a bit about Jitsi Meet's arquitecture here or here or aquí (in Spanish)

How do I use it?

Simple clone it and rename the host configuration directories in hosts_vars/ to match your hosts. Also edit group_vars/meet and the hosts file to suit your needs. Further instructions in USAGE.md. If you're using a git repository to hold your configuration, don't forget to use ansible-vault to encrypt sensitive information. That's why the passwords are stored on 0secret.yml files.

You may run everything on one host. Or have separate hosts for videobridges and jibris. If you want to run a videobridge and/or a jibri instance on the central server, just include it in the "[videobridges]" and/or "[jibris]" group.

The meet_domain variable in group_vars/meet should have a DNS entry and point to your "central" server since a Let's Encrypt certificate will be generated during the installation.

Once you've gone through the hosts/variables you may run the playbook with:

ansible-playbook -i hosts site.yml

If your hosts are behind NAT or a firewall, remember to check the ports required to run Jitsi Meet (80,443 TCP and 1000 UDP at least).

User authentication support

This playbook supports three kinds of user authentication, all managed in group_vars/meet/main.yml:

  • None, everyone can join or start a room
  • Token based, so your application can issue tokens that control user access and permissions (moderators). For example using Moodle's token module
  • LDAP based. Well... that.

Both token and LDAP authentication can also allow non-authenticated users in (depending on the allow_guests value).

You may switch from one authentication scheme to another by editing the file previously mentioned and running:

ansible-playbook -i hosts site.yml --tags authconf

What are the system requirements for running Jitsi Meet a jibri instance?

Jibri depends on the ALSA loopback module. If your server is running on a cloud platform, or with a kernel other than Debian's default, make sure you have support for the "snd-aloop" module before running the playbook on it.

For example, on Google Cloud instances, you need to run:

apt install linux-image-amd64
apt purge linux-image-*cloud*
reboot

After that, you may run the playbook.

Final notes

The playbook has some hacks, like using Debian's certbot package instead of downloading it from Jitsi's packages postint or installing openjdk-8 from Stretch, to better deal with some packaging behaviour/configuration in ansible. The Jitsi project is very active nowadays and this playbook will be (hopefully) frequently revisited to adapt to its changes. Please report any issues or send your PRs.

ansible-jitsi-meet's People

Contributors

amg-web avatar inittab avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ansible-jitsi-meet's Issues

src file does not exist

TASK [systemli.jitsi_meet : Link additional prosody config] **************************************************************************************************************** fatal: [193.107.XXXX]: FAILED! => {"changed": false, "msg": "src file does not exist, use \"force=yes\" if you really want to create the link: /etc/prosody/conf.avail/jitsi-test.tk.cfg.lua", "path": "/etc/prosody/conf.d/jitsi-test.tk.cfg.lua", "src": "/etc/prosody/conf.avail/jitsi-test.tk.cfg.lua"}

[Multiple Node Deployment] JBV server not connecting

Hi, I'm currently doing Multiple node deployments, the central server where Jicofo and the meet frontend seem to work perfectly, but adding a new jvb server refuses to connect.

  • users are created with the correct password.
  • jvb on the central server connects appropriately.
  • ports 80, 443, and UDP 1000 are open on all servers.

Screenshot of jvb.log on another server running Jvb
Screenshot 2022-06-16 at 10 49 58 AM

My JVB main.yml

## Videobridge XMPP credetials
videobridge_user: 54.246.188.93
videobridge_pass: "{{ vault_videobridge_pass }}"
# Set this to something different that "videobridge_user" if you want to share
# videobridge_user and videobridge_pass across different videobridges
videobridge_muc_nick: 54.246.188.93

Please kindly assist, what could possibly be the issue? thanks as you do so

setup errors and suggestions

I continue to play with the issue I wrote in prvious ticket.
installed Jitsi with xmpp_auth: none and jibri on single server, U18.04
Again can not connect. from prosody error log:
Apr 24 12:14:40 modulemanager<->error<->Unable to load module 'storage_memory': /usr/lib/prosody/modules/mod_storage_memory.lua: No such file or directory
Apr 24 12:14:40 storagemanager<>error<->Failed to load storage driver plugin memory on lobby.zone.org: /usr/lib/prosody/modules/mod_storage_memory.lua: No such file or directory

Problems during playbook run:

  1. gnupg or gnupg2 packet is required.
  2. linux-image-extra-virtual in my case
  3. chrome repositary is duplicated.
  4. we can add latest stable prosody from official repositary (0.11.8 at the moment ) https://prosody.im/download/package_repository
  5. for token authorisation lua5.2 and liblua5.2-dev is required. All the rest deb package will do itself

for chrome installation I use:

- name: Install Chrome browser

apt:

deb: https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

it will add repositary automatically and install chrome.

I use debconf to preconfigure jitsi-meet-tokens and domain for jitsi
I do not want to make PR .

Videobridge Users error

While installing, I get this error

TASK [jitsi-meet : Videobridge users] **********************************************************************************************************************************
fatal: [eclassroom.skouras-languages.gr]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'ansible.vars.hostvars.HostVarsVars object' has no attribute 'videobridge_user'\n\nThe error appears to be in '/ansible-jitsi-meet/roles/jitsi-meet/tasks/xmpp_users.yml': line 4, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n## or use prosodyctl to check if users exist (will complicate looping...)\n- name: Videobridge users\n ^ here\n"}

Error in file

File ansible-jitsi-meet/roles/jibri/templates/config.json contains an error in line 39:
"nickname": "{{ jibri_nick }}" should be "nickname": "{{ jibri_muc_nick }}"

Thanks

No package matching 'jitsi-meet' is available

Hello, when i trying install jitsi on ubuntu 20 i have that error.

`The full traceback is:
File "/tmp/ansible_apt_payload_zlp00dcb/ansible_apt_payload.zip/ansible/modules/packaging/os/apt.py", line 431, in package_status
File "/usr/lib/python3/dist-packages/apt/cache.py", line 301, in getitem
raise KeyError('The cache has no package named %r' % key)
fatal: [193.107.XXXX]: FAILED! => {
"changed": false,
"invocation": {
"module_args": {
"allow_unauthenticated": false,
"autoclean": false,
"autoremove": false,
"cache_valid_time": 0,
"deb": null,
"default_release": null,
"dpkg_options": "force-confdef,force-confold",
"force": false,
"force_apt_get": false,
"install_recommends": false,
"only_upgrade": false,
"package": [
"jitsi-meet",
"jitsi-meet-prosody",
"jitsi-meet-web",
"jitsi-meet-web-config",
"jitsi-videobridge2"
],
"pkg": [
"jitsi-meet",
"jitsi-meet-prosody",
"jitsi-meet-web",
"jitsi-meet-web-config",
"jitsi-videobridge2"
],
"policy_rc_d": null,
"purge": false,
"state": "present",
"update_cache": null,
"upgrade": null
}
},
"msg": "No package matching 'jitsi-meet' is available"
}

PLAY RECAP *********************************************************************************************************************************
193.107.XXXX : ok=31 changed=9 unreachable=0 failed=1 skipped=23 rescued=0 ignored=0`

Setup behind a reverse proxy

I used this repository to setup jitsi on a central virtual machine behind a reverse proxy.
To notice the difference: The reverse proxy is another virtual machine which handles all requests on port 80 and 443 and
redirects the requests to the appropriate machine. Additionally, the reverse proxy handles the LE certificates.

I have a running setup with some modifications to this repository.
I would give my problems and recommendations back to you:

First, the hostname of a videobridge doesn't mean the name of the final videobridge.
I added another field to the videobridge group in the hosts file videobridge_name='meet'
and in the nginx.conf replaced the original colibri location with {{ videobridge_name | default(videobridge) }}.

Second, the virtual machine running jitsi is not facing the outside directly but through a reverse proxy.
So, I need the NAT_HARVESTER_ addresses and introduced to variables:

org.ice4j.ice.harvest.NAT_HARVESTER_LOCAL_ADDRESS={{ videobridge_local_address | default('127.0.0.1') }}
org.ice4j.ice.harvest.NAT_HARVESTER_PUBLIC_ADDRESS={{ videobridge_public_address }}

This was needed to get video bridging working properly.

The last one was, that I disabled certbot since the certificates are handled by another server and are magically deployed to the directory /etc/letsencrypt/live/{{ meet_domain }}. This fails when the coturn component is active. It deploys a script to the
location /etc/letsencrypt/renewal-hooks/deploy/coturn-certbot-deploy.sh which is non-existent. I added to following lines as solution:

- name: Create hook script dir
  ansible.builtin.file:
    path: /etc/letsencrypt/renewal-hooks/deploy/
    state: directory
  when: not debian_certbot

Hope this helps someone stumbling across the same issues.
Thanks for your hard work.

AnsibleUndefinedVariable: 'ansible.vars.hostvars.HostVarsVars object' has no attribute 'ansible_default_ipv4'

Tried to install all on one host following the USAGE.md
on a typical cloud VM with Debian 9
having DNS A and AAAA record configured.

The playbook got stuck here:

TASK [jitsi-meet : Nginx virtualhost config] *****************************************************************************************************
fatal: [meet.domainblabla.org]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'ansible.vars.hostvars.HostVarsVars object' has no attribute 'ansible_default_ipv4'"}

I guess it's about this line:

proxy_pass http://{{ hostvars[videobridge]['ansible_default_ipv4']['address'] }}:9090/colibri-ws/{{ videobridge }}/$1$is_args$args;

My IP Config on the VM:

root@jitsimeet:~# ip route
default via 172.31.1.1 dev eth0 
172.31.1.1 dev eth0 scope link

I tried to add gather_facts = yes on different places. But it didn't help.
I got around the error by just hardcoding the IP address.

Link main SSL certificate to /etc/prosody/certs/

TASK [systemli.jitsi_meet : Link main SSL certificate to /etc/prosody/certs/] **********************************************************************************************
task path: /home/ansible/jitsi2/playbook-jitsi/dude/roles/systemli.jitsi_meet/tasks/prosody.yml:50
failed: [jitsi-test.tk] (item=crt) => {"ansible_loop_var": "item", "changed": false, "item": "crt", "msg": "src file does not exist, use \"force=yes\" if you really want to create the link: /var/lib/prosody/jitsi-test.tk.crt", "path": "/etc/prosody/certs/jitsi-test.tk.crt", "src": "/var/lib/prosody/jitsi-test.tk.crt"}
failed: [jitsi-test.tk] (item=key) => {"ansible_loop_var": "item", "changed": false, "item": "key", "msg": "src file does not exist, use \"force=yes\" if you really want to create the link: /var/lib/prosody/jitsi-test.tk.key", "path": "/etc/prosody/certs/jitsi-test.tk.key", "src": "/var/lib/prosody/jitsi-test.tk.key"}

jitsi_meet_turn_secret' is undefined x2

fatal: [193.107.XXXX]: FAILED! => {"msg": "'jitsi_meet_turn_secret' is undefined"}

My vars in default.yml:


jitsi_meet_turn_secret: 52ewgf5uhh32432432

It still doesn't work.

error for token setup

Ubuntu 18.04. Any ideas?

TASK [jitsi-meet : Build lua luajwtjitsi] *****************
fatal: [visio.wipnco.com]: FAILED! => {"changed": true, "cmd": ["luarocks", "install", "luajwtjitsi"], "delta": "0:00:04.515750", "end": "2021-04-21 15:22:11.176935", "msg": "non-zero return code", "rc": 1, "start": "2021-04-21 15:22:06.661185", "stderr": "Hunk 1 found at offset 2...\nsuccessfully patched src/openssl.c\nsrc/openssl.c:83:10: fatal error: lua.h: No such file or directory\n #include <lua.h>\n ^~~~~~~\ncompilation terminated.\n\nError: Failed installing dependency: https://luarocks.org/luaossl-20200709-0.src.rock - Build error: Failed compiling object src/openssl.o", "stderr_lines": ["Hunk 1 found at offset 2...", "successfully patched src/openssl.c", "src/openssl.c:83:10: fatal error: lua.h: No such file or directory", " #include <lua.h>", " ^~~~~~~", "compilation terminated.", "", "Error: Failed installing dependency: https://luarocks.org/luaossl-20200709-0.src.rock - Build error: Failed compiling object src/openssl.o"], "stdout": "Installing https://luarocks.org/luajwtjitsi-2.0-0.src.rock\nMissing dependencies for luajwtjitsi 2.0-0:\n luaossl >= 20190731-0 (not installed)\n lua-cjson == 2.1.0-1 (2.1devel-1 installed)\n lbase64 >= 20120807-3 (not installed)\n\nluajwtjitsi 2.0-0 depends on luaossl >= 20190731-0 (not installed)\nInstalling https://luarocks.org/luaossl-20200709-0.src.rock\nApplying patch config.h.diff...\ngcc -O2 -fPIC -I/usr/include/lua5.1 -c src/openssl.c -o src/openssl.o -D_REENTRANT -D_THREAD_SAFE -DCOMPAT53_PREFIX=luaossl -D_GNU_SOURCE -I/usr/include -I/usr/include", "stdout_lines": ["Installing https://luarocks.org/luajwtjitsi-2.0-0.src.rock", "Missing dependencies for luajwtjitsi 2.0-0:", " luaossl >= 20190731-0 (not installed)", " lua-cjson == 2.1.0-1 (2.1devel-1 installed)", " lbase64 >= 20120807-3 (not installed)", "", "luajwtjitsi 2.0-0 depends on luaossl >= 20190731-0 (not installed)", "Installing https://luarocks.org/luaossl-20200709-0.src.rock", "Applying patch config.h.diff...", "gcc -O2 -fPIC -I/usr/include/lua5.1 -c src/openssl.c -o src/openssl.o -D_REENTRANT -D_THREAD_SAFE -DCOMPAT53_PREFIX=luaossl -D_GNU_SOURCE -I/usr/include -I/usr/include"]}

Keeps reloading whenever I join the meeting

Did a single install on an Ubuntu instance on AWS, whenever I go to the frontend https://meet2.myclinify.com and join a meeting it keeps reloading with error:
react_devtools_backend.js:4026 2022-06-11T15:59:47.507Z [conference.js] <oce._onConferenceFailed>: CONFERENCE FAILED: conference.focusDisconnected

checking Jicofo logs I see
org.jivesoftware.smack.sasl.SASLErrorException: SASLError using SCRAM-SHA-1: not-authorized at org.jivesoftware.smack.SASLAuthentication.authenticationFailed(SASLAuthentication.java:286) at org.jivesoftware.smack.AbstractXMPPConnection.lambda$new$2(AbstractXMPPConnection.java:407) at org.jivesoftware.smack.NonzaCallback$ClassAndConsumer.accept(NonzaCallback.java:177) at org.jivesoftware.smack.NonzaCallback$ClassAndConsumer.access$200(NonzaCallback.java:166) at org.jivesoftware.smack.NonzaCallback.onNonzaReceived(NonzaCallback.java:46) at org.jivesoftware.smack.AbstractXMPPConnection.parseAndProcessNonza(AbstractXMPPConnection.java:1447) at org.jivesoftware.smack.tcp.XMPPTCPConnection.access$1700(XMPPTCPConnection.java:130) at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:1007) at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$700(XMPPTCPConnection.java:913) at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:936) at java.base/java.lang.Thread.run(Thread.java:829) Jicofo 2022-06-12 03:09:44.090 INFO: [31] [xmpp_connection=client] XmppProviderImpl.doConnect#209: Connected, JID=null Jicofo 2022-06-12 03:09:44.091 SEVERE: [31] [xmpp_connection=client] XmppProviderImpl.doConnect#228: Failed to connect/login: SASLError using SCRAM-SH

this is my configuration
[host_vars/meet2.myclinify.com/main.yml]

## Note
# Do not use chars other than [a-zA-Z0-9._-] for usernames
# prosody likes to encode chars other than alphanumerics in files/dirs names

# Meet
# Limit the number of videostreams to clients (-1 -> no limit)
channelLastN: -1
defaultLanguage: en

# Jicofo
jicofo_user: focus # DO NOT change this, ignored by jicofo postinst, hardcoded god knows where else
jicofo_pass: "{{ vault_jicofo_pass }}"
# Jicofo Component secret (debconf: jicofo/jicofosecret
jicofo_secret: "{{ vault_jicofo_secret }}"

[host_vars/mee2.myclinify.com/Osecret.ym] -> looks something like this

## Required vars for central host
# XMPP Password for jicofo
vault_jicofo_pass: 6a47be54b869b664bad92894b414e748
# XMPP Password for jicofo component
vault_jicofo_secret: m4Cr30
# If using prometheus exporter
vault_exporter_xmpp_pass: 12dc103458cc91552c9741be89a00a53

## Optional vars (if central host also runs videobridge or jibri)
# XMPP Password for videbridge
vault_videobridge_pass: b4f8a72484dc27255cbbb849073f4010
# XMPP Password for jibri
vault_jibri_pass: 81cc0bbd94a3W8453aa90efac4359267

What do you think I might be doing wrong, please kindly assist.

Failed while running initial playbook

I have followed the simple setup of jitsi meet in a single server and got the following error:

TASK [jitsi-meet : Videobridge users] ********************************************************************************************************************
fatal: [***]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'ansible.vars.hostvars.HostVarsVars object' has no attribute 'videobridge_user'\n\nThe error appears to be in '/home/pmatos/dev/ansible-jitsi-meet/roles/jitsi-meet/tasks/xmpp_users.yml': line 4, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n## or use prosodyctl to check if users exist (will complicate looping...)\n- name: Videobridge users\n  ^ here\n"}

[Question] Customize js file

Is it possible to customize the js file to change some options from the repo so that ansible applies those settings? How would I do that?

The task includes an option with an undefined variable

hello im having this issue trying to do the ansible procedure for the jitsi-meet to use with the moodle plugin

image

im not familiar with ansible but i can't find a way to solve this online

`TASK [jitsi-meet : Videobridge users] *******************************************************************************************************************************************************************************************************************************************************************************************************************************************************
fatal: [room.sipworxx.com]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'ansible.vars.hostvars.HostVarsVars object' has no attribute 'videobridge_user'\n\nThe error appears to have been in '/usr/src/ansible-jitsi-meet/roles/jitsi-meet/tasks/xmpp_users.yml': line 2, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n---\n- name: Videobridge users\n ^ here\n"}
to retry, use: --limit @/usr/src/ansible-jitsi-meet/site.retry

PLAY RECAP **********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
room.sipworxx.com : ok=28 changed=0 unreachable=0 failed=1

`

any help on this ?

videobridge is not able to connect to Prosody, jibri does not work at all and breaks functionality to join rooms

I've an easy setup with Jitsi Meet, Jibri Server and videobridge but a bunch of errors.

When all playbooks were executed successfully, on JVB I see:

/var/log/jitsi/jvb.log

2020-12-20 17:21:36.143 INFO: [17] [hostname=XXX.XXX.XXX.XXX id=shard] MucClient.lambda$getConnectAndLoginCallable$7#680: Logging in.
2020-12-20 17:21:36.144 SEVERE: [17] RetryStrategy$TaskRunner.run#198: org.jivesoftware.smack.sasl.SASLErrorException: SASLError using SCRAM-SHA-1: not-authorized
org.jivesoftware.smack.sasl.SASLErrorException: SASLError using SCRAM-SHA-1: not-authorized
	at org.jivesoftware.smack.SASLAuthentication.authenticationFailed(SASLAuthentication.java:292)
	at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:1100)
	at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPConnection.java:1000)
	at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:1016)
	at java.lang.Thread.run(Thread.java:748)

/var/log/jitisi/jicofo.log

Jicofo 2020-12-20 17:32:15.868 INFO: [53] org.jitsi.jicofo.xmpp.FocusComponent.log() Focus request for room: [email protected]
Jicofo 2020-12-20 17:32:16.075 INFO: [91] org.jitsi.jicofo.ChatRoomRoleAndPresence.log() Chat room event ChatRoomMemberPresenceChangeEvent[type=MemberJoined sourceRoom=org.jitsi.impl.protocol.xmpp.ChatRoomImpl@6749fb98 member=ChatMember[[email protected]/dd25644b, jid: null]@803911713]
Jicofo 2020-12-20 17:32:16.075 INFO: [91] org.jitsi.jicofo.JitsiMeetConferenceImpl.log() Member [email protected]/dd25644b joined.
Jicofo 2020-12-20 17:32:16.076 SEVERE: [91] org.jitsi.jicofo.JitsiMeetConfig.log() Error parsing: startAudioMuted, v: false
Jicofo 2020-12-20 17:32:16.076 WARNING: [91] org.jitsi.jicofo.bridge.BridgeSelectionStrategy.log() Failed to select initial bridge for participantRegion=null
Jicofo 2020-12-20 17:32:16.076 SEVERE: [91] org.jitsi.jicofo.JitsiMeetConferenceImpl.log() Can not invite participant -- no bridge available.

/var/log/prosody/prosody.{log,err}

Dec 20 17:34:00 conference.XXX.XXX.XXX:muc_domain_mapper	warn	Session filters applied
Dec 20 17:34:00 mod_bosh	info	New BOSH session, assigned it sid 'c9128612-6532-40d7-9265-faacd6e01c28'
Dec 20 17:34:01 boshc9128612-6532-40d7-9265-faacd6e01c28	info	Authenticated as [email protected]

I also came across jitsi/jitsi-meet#3639 and disabled bosh to listen on HTTPS.
If I enable "recording" there is an additional problem with Jibri and the included presence_identity module. See: jitsi/jitsi-meet#8284

how to customize look and feel

How do you customize the look and feel of jitsi with this kind of deployment?
Changing colors, adjust translations etc., changing toolbar elements?

Playbook not working any more for Debian 10?

Hello,
one year ago I installed Jitsi with this playbook and it worked like a charm on Debian 10. But now with the newer Jitsi versions Jitsi is not working any more. The playbook installs everything without errors.. But when i call jitsi in the browser, it tries to start but shows the error "something went wrong ..."
I think, that the jitsi-token-modul causes the problems. I installed a normal Jitsi on my own, which worked fine, but after installing token-module also crashed.

I can use an older playbook and manually edit it to use

  • jitsi-meet-web=1.0.4628-1
  • jitsi-meet=2.0.5390-3
  • jitsi-videobridge2=2.1-416-g2f43d1b4-1
  • jitsi-meet-web-config=1.0.4628-1
  • jitsi-meet-tokens=1.0.4628-1
  • jitsi-meet-prosody=1.0.4628-1
  • jigasi=1.1-166-g929a439-1
  • jicofo=1.0-692-hf-1

But this is no solution because Chrome doesn't support this old versions correct anymore.

I use a clean Debian 10 VM on Hetzner cloud.

Thanks for helping.
Oe

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.