Jitsi-Meet Jigasi FreePBX Asterisk Integration

Have you searched the forum? Not once an asterisk examples had been posted. Also explaining about the numbers, it is a simple json file with number that need to be set up in config.js

@nightstryke

I faced the same issue as you. In my case, damencho’s suggestion of checking whether the incoming sip traffic contained the correct headers showed that it did not!

In case you have created a pjsip and not legacy sip extension in FreePBX, the command SIPAddHeader(Jitsi-Conference-Room: ${JITSI}) does not work as it is deprecated for pjsip. You can use the following instead:

Set(HASH(__SIPHEADERS,Jitsi-Conference-Room)=${JITSI})
2 Likes

@Planeshifter
I’m using Chan_Sip not PJSIP but that fixed my issue!

1 Like

I’m in the same boat at the moment. FreePBX answers, ask for pin, hit pound, than nothing happens.
It’s like it just hangs after running jitsi_curling.sh Any advice? Thank you.

[2020-04-02 11:46:21] VERBOSE[24686][C-0000000c] pbx.c: Executing [2000@from-did-direct:2] Read(“SIP/VoipDutilCom-0000000c”, “Pin,“custom/enter_pin””) in new stack
[2020-04-02 11:46:21] VERBOSE[24686][C-0000000c] file.c: <SIP/VoipDutilCom-0000000c> Playing ‘custom/enter_pin.slin’ (language ‘en’)
[2020-04-02 11:46:33] VERBOSE[24686][C-0000000c] app_read.c: User entered ‘2686911238’
[2020-04-02 11:46:33] VERBOSE[24686][C-0000000c] pbx.c: Executing [2000@from-did-direct:3] Verbose(“SIP/VoipDutilCom-0000000c”, “result is: 2686911238”) in new stack
[2020-04-02 11:46:33] VERBOSE[24686][C-0000000c] app_verbose.c: result is: 2686911238
[2020-04-02 11:46:33] VERBOSE[24686][C-0000000c] pbx.c: Executing [2000@from-did-direct:4] AGI(“SIP/VoipDutilCom-0000000c”, “jitsi_curling.sh,2686911238”) in new stack
[2020-04-02 11:46:33] VERBOSE[24686][C-0000000c] res_agi.c: Launched AGI Script /var/lib/asterisk/agi-bin/jitsi_curling.sh

/var/lib/asterisk/agi-bin/jitsi_curling.sh

#!/bin/bash

jit_rm=$(curl --silent https://jitsi-api.jitsi.net/conferenceMapper?id=1 | cut -d \, -f 3 | cut -d \: -f 2 | cut -d \" -f 2 | cut -d \@ -f 1) echo "SET VARIABLE JITSI \"{jit_rm}" "

/etc/asterisk/extensions_override_freepbx.conf

[ext-local]
exten => 2000,1,Set(__RINGTIMER={IF(["{DB(AMPUSER/2000/ringtimer)}" > "0"]?{DB(AMPUSER/2000/ringtimer)}:{RINGTIMER_DEFAULT})}) exten => 2000,2,Read(Pin,"custom/enter_pin") exten => 2000,3,Verbose(result is: {Pin})
exten => 2000,4,AGI(jitsi_curling.sh,{Pin}) exten => 2000,5,Verbose(result is: {JITSI})
exten => 2000,6,Set(HASH(__SIPHEADERS,Jitsi-Conference-Room)={JITSI}) exten => 2000,7,Macro(exten-vm,novm,2000,0,0,0) exten => 2000,8(dest),Set(__PICKUPMARK=) exten => 2000,9,Goto({IVR_CONTEXT},return,1)
exten => 2000,hint,SIP/2000&Custom:DND2000,CustomPresence:2000

@nightstryke - can you post details on how you configured your FreePBX extension? I am currently stuck at a similar point.

Incoming calls are working to the point that the room is joined (even with correct caller ID), but then the call gets dropped. I suspect a codec issue, but am not sure.

What version of jigasi/asterisk are you using?

This is beginning to drive me nuts… :frowning:

Regards,
Thomas

I’ll see if I can write something up on this as there’s not good guidelines or documentation and without @Planeshifter’s Help I would not have gotten my Jitsi-Meet/Jigasi Deployment to work with my FreePBX Deployment.

The Short Uncompiled Version:
I followed @EvilCreamsicle’s Guide Here:
http://evilcreamsicle.com/index.php/2018/03/28/jitsi-meet-w-call-in-and-active-directory/

One if you’re using the latest version of FreePBX make sure you’re using Legacy Chan_Sip, set the extension’s IP to your Jitsi-Meet/Jigasi Server’s IP.
Then you should make sure that the extension uses port 5160 in the latest FreePBX version legacy chan_sip uses port 5160.
Whitelist the Jitsi-Meet/Jigasi Server’s IP in FreePBX System Admin Intrusion Detection.
Also make sure to whitelist the IP in the Firewall of FreePBX under Networks, you should have responsive firewall on too and enabled for legacy sip.

As far as @EvilCreamsicle’s Guide when you get to:
Edit the file /etc/asterisk/extensions_override_freepbx.conf

Change it from this:
[ext-local]
exten => 9999,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/9999/ringtimer)}" > "0"]?${DB(AMPUSER/9999/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 9999,2,Read(Pin,"custom/my_system_recording")
exten => 9999,3,Verbose(result is: ${Pin})
exten => 9999,4,AGI(jitsi_curling.sh,${Pin})
exten => 9999,5,Verbose(result is: ${JITSI})
exten => 9999,6,SIPAddHeader(Jitsi-Conference-Room: ${JITSI})
exten => 9999,7,Macro(exten-vm,novm,9999,0,0,0)
exten => 9999,8(dest),Set(__PICKUPMARK=)
exten => 9999,9,Goto(${IVR_CONTEXT},return,1)
exten => 9999,hint,SIP/9999&Custom:DND9999,CustomPresence:9999

Then Change to this:
[ext-local]
exten => 9999,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/9999/ringtimer)}" > "0"]?${DB(AMPUSER/9999/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 9999,2,Read(Pin,"custom/my_system_recording")
exten => 9999,3,Verbose(result is: ${Pin})
exten => 9999,4,AGI(jitsi_curling.sh,${Pin})
exten => 9999,5,Verbose(result is: ${JITSI})
exten => 9999,6,Set(HASH(__SIPHEADERS,Jitsi-Conference-Room)=${JITSI})
exten => 9999,7,Macro(exten-vm,novm,9999,0,0,0)
exten => 9999,8(dest),Set(__PICKUPMARK=)
exten => 9999,9,Goto(${IVR_CONTEXT},return,1)
exten => 9999,hint,SIP/9999&Custom:DND9999,CustomPresence:9999

Now this is super important.
Edit your Jitsi-Meet Jigasi sip-communicator.properties at /etc/jitsi/jigasi/sip-communicator.properties
Add these lines to the file near the SIP settings.
net.java.sip.communicator.impl.protocol.sip.acc1403273890647.PROXY_PORT=5160 net.java.sip.communicator.impl.protocol.sip.acc1403273890647.PREFERRED_TRANSPORT=UDP

The reason being chan_sip by default uses UDP by default for extension whether they’re remote or local.
Also as I said earlier to make sure your extension is set to port 5160 because of FreePBX’s default settings you also have to tell Jigasi that it’s using port 5160 and not the old standard 5060 which is now used by Chan_PJSIP.

1 Like

Adding an update to my post.
Feel kind of dumb not realizing this before I posted but I have a dual nic FreePBX. One network is dedicated to our phone systems and has no public route. When the bash script was trying to query jitsi’s API (https://jitsi-api.jitsi.net/conferenceMapper?id=), it was routing out the wrong interface. So it couldn’t actually run. That problem has now been fixed. I am now working to the point of it trying to connect to jigasi, which is doing all kinds of crazy now. I have had the conference room show my phone number connect than disconnect. I have had it just ring and ring until it errors out. I’ll post an update when I know more. Thank you everyone for all the info you share.

@Michael_Brown I just formatted and edited my earlier post, read it and check your FreePBX settings.

1 Like

@nightstryke: did you do anything special with the codecs in FreePBX or jigasi?
I suspect I’m running into an issue here, that’s why I want to check if we are running the same versions of asterisk/jigasi here.

Joining the room worked for me before, but the call gets dropped immediately after that.
For joining to work, I had to change the asterisk code from

exten => 9999,6,Set(HASH(__SIPHEADERS,Jitsi-Conference-Room)=${JITSI})

to

exten => 9999,6,Set(HASH(__SIPHEADERS,Jitsi-Conference-Room)=${JITSI}@muc.meet.jitsi)

I am using a docker setup, whatever jigasi version from log:

Jigasi 2020-04-02 14:24:12.467 INFO: [10] org.jitsi.version.AbstractVersionActivator.log() VersionService registered: Jigasi 1.1.38-g8f3c241

Asterisk is a PBX in a flash setup on a raspberry Pi

Asterisk 13.21.1 built by root @ raspbx on a armv7l running Linux on 2018-09-09 20:20:03 UTC

I have checked the SIP Settings with jitsi desktop, from there I could call in both directions. So I have no idea what the actual issue is. Actually, it could be on the asterisk side, though I don’t believe it. Right after connecting, I see an error in asterisk:

**app_dial.c** : **1000** **do_forward** : Not accepting call completion offers from call-forward recipient Local/1022@from-internal-00000089;1

I could’nt really find out what that means, as I actually didn’t forward a call. Google gets few results and all seem having to do with a call forward.

More interesting is jigasis logfile, right after connecting and joining the conference there is a severe Error and then the call gets disconnected (look at timestamp 19:33:03.051):

Jigasi 2020-04-02 19:32:57.798 INFO: [1225] org.jitsi.jigasi.SipGateway.incomingCallReceived().188 Incoming call received...
Jigasi 2020-04-02 19:32:57.894 INFO: [1227] impl.protocol.sip.SipLogger.logInfo().196 Info from the JAIN-SIP stack: Setting SIPMessage peerPacketSource to: /10.36.35.2:5160
Jigasi 2020-04-02 19:32:58.800 INFO: [1226] org.jitsi.jigasi.SipGatewaySession.run().1281 [ctx=15858487777981075833164] Wait thread cancelled
Jigasi 2020-04-02 19:32:58.803 INFO: [1225] org.jitsi.jigasi.JvbConference.setXmppProvider().539 [ctx=15858487777981075833164] Using ProtocolProviderServiceJabberImpl(Jabber:47f6172b@meet.jitsi/47f6172b)
Jigasi 2020-04-02 19:32:58.896 INFO: [1228] impl.protocol.jabber.OperationSetBasicTelephonyJabberImpl.registrationStateChanged().125 Jingle : ON 
Jigasi 2020-04-02 19:32:58.897 INFO: [1228] org.jitsi.jigasi.JvbConference.registrationStateChanged().577 [ctx=15858487777981075833164] Registering XMPP.
Jigasi 2020-04-02 19:32:58.923 INFO: [1228] impl.protocol.jabber.ProtocolProviderServiceJabberImpl.authenticated().2535 Authenticated: false
Jigasi 2020-04-02 19:32:58.926 INFO: [1228] org.jitsi.jigasi.JvbConference.joinConferenceRoom().648 [ctx=15858487777981075833164] Joining JVB conference room: test@muc.meet.jitsi
Jigasi 2020-04-02 19:32:59.023 INFO: [1234] impl.protocol.jabber.ChatRoomJabberImpl.joined().1256 test@muc.meet.jitsi/focus has joined the test@muc.meet.jitsi chat room.
Jigasi 2020-04-02 19:32:59.033 INFO: [1234] impl.protocol.jabber.ChatRoomJabberImpl.joined().1256 test@muc.meet.jitsi/d9f3cf50 has joined the test@muc.meet.jitsi chat room.
Jigasi 2020-04-02 19:33:00.003 INFO: [1249] impl.protocol.jabber.IceUdpTransportManager.createIceAgent().346 End gathering harvester within 636 ms
Jigasi 2020-04-02 19:33:01.977 INFO: [1249] impl.protocol.jabber.CallPeerMediaHandlerJabberImpl.harvestCandidates().1198 End candidate harvest within 1244 ms
Jigasi 2020-04-02 19:33:02.000 INFO: [1249] org.jitsi.jigasi.JvbConference.incomingCallReceived().1024 [ctx=15858487777981075833164] Got invite from focus
Jigasi 2020-04-02 19:33:02.027 WARNING: [1249] impl.protocol.sip.CallPeerMediaHandlerSipImpl.createMediaDescriptions().225 No active device for video was found!
Jigasi 2020-04-02 19:33:02.079 WARNING: [1260] service.protocol.media.DynamicPayloadTypeRegistry.addMapping().270 Remote party is trying to remap payload type 97 and reassign it from rtpmap:-1 speex/16000 to rtpmap:-1 iLBC/8000. We'll go along but there might be issues because of this. We'll also expect to receive rtpmap:-1 iLBC/8000 with PT=98
Jigasi 2020-04-02 19:33:02.080 INFO: [1262] impl.protocol.sip.SipLogger.logInfo().196 Info from the JAIN-SIP stack: Setting SIPMessage peerPacketSource to: /10.36.35.2:5160
Jigasi 2020-04-02 19:33:02.086 INFO: [1262] org.jitsi.jigasi.SipGatewaySession.peerStateChanged().1204 [ctx=15858487777981075833164] SIP peer state: Connecting
Jigasi 2020-04-02 19:33:02.087 INFO: [1263] impl.protocol.sip.SipLogger.logInfo().196 Info from the JAIN-SIP stack: Setting SIPMessage peerPacketSource to: /10.36.35.2:5160
Jigasi 2020-04-02 19:33:02.113 INFO: [1263] org.jitsi.jigasi.SipGatewaySession.handleCallState().1138 [ctx=15858487777981075833164] SIP call ended: CallPeerChangeEvent: type=CallPeerStatusChange oldV=net.java.sip.communicator.service.protocol.CallPeerState:Connecting newV=net.java.sip.communicator.service.protocol.CallPeerState:Disconnected for peer=Thomas <1022@10.36.35.2>;status=Disconnected
Jigasi 2020-04-02 19:33:02.113 INFO: [1265] impl.protocol.sip.SipLogger.logInfo().196 Info from the JAIN-SIP stack: Setting SIPMessage peerPacketSource to: /10.36.35.2:5160
Jigasi 2020-04-02 19:33:02.127 INFO: [1263] org.jitsi.jigasi.SipGatewaySession.peerStateChanged().1204 [ctx=15858487777981075833164] SIP peer state: Disconnected
Jigasi 2020-04-02 19:33:02.437 INFO: [1261] service.protocol.media.MediaHandler.registerDynamicPTsWithStream().1003 Dynamic PT map: 126=rtpmap:-1 telephone-event/8000; 111=rtpmap:-1 opus/48000/2 fmtp:useinbandfec=1;minptime=10; 103=rtpmap:-1 unknown/90000; 
Jigasi 2020-04-02 19:33:02.437 INFO: [1261] service.protocol.media.MediaHandler.registerDynamicPTsWithStream().1020 PT overrides [103->104 ]
Jigasi 2020-04-02 19:33:02.616 INFO: [1261] service.protocol.media.CallPeerMediaHandler.start().1961 Starting
Jigasi 2020-04-02 19:33:03.009 INFO: [1260] service.protocol.media.MediaHandler.registerDynamicPTsWithStream().1003 Dynamic PT map: 101=rtpmap:-1 telephone-event/8000; 96=rtpmap:-1 speex/32000; 97=rtpmap:-1 speex/16000; 99=rtpmap:-1 speex/8000; 98=rtpmap:-1 iLBC/8000; 
Jigasi 2020-04-02 19:33:03.009 INFO: [1260] service.protocol.media.MediaHandler.registerDynamicPTsWithStream().1020 PT overrides [96->119 97->117 98->97 99->110 ]
Jigasi 2020-04-02 19:33:03.051 SEVERE: [1260] impl.protocol.sip.CallPeerSipImpl.answer().1334 Failed to create an SDP description for an OK response to an INVITE request!
java.lang.NullPointerException
	at net.java.sip.communicator.service.protocol.media.MediaHandler.configureStream(MediaHandler.java:703)
	at net.java.sip.communicator.service.protocol.media.MediaHandler.initStream(MediaHandler.java:953)
	at net.java.sip.communicator.service.protocol.media.CallPeerMediaHandler.initStream(CallPeerMediaHandler.java:1189)
	at net.java.sip.communicator.impl.protocol.sip.CallPeerMediaHandlerSipImpl.createMediaDescriptionsForAnswer(CallPeerMediaHandlerSipImpl.java:832)
	at net.java.sip.communicator.impl.protocol.sip.CallPeerMediaHandlerSipImpl.processUpdateOffer(CallPeerMediaHandlerSipImpl.java:519)
	at net.java.sip.communicator.impl.protocol.sip.CallPeerMediaHandlerSipImpl.processOffer(CallPeerMediaHandlerSipImpl.java:447)
	at net.java.sip.communicator.impl.protocol.sip.CallPeerSipImpl.answer(CallPeerSipImpl.java:1320)
	at net.java.sip.communicator.impl.protocol.sip.OperationSetBasicTelephonySipImpl.answerCallPeer(OperationSetBasicTelephonySipImpl.java:1955)
	at org.jitsi.jigasi.CallManager$AnswerCallThread.run(CallManager.java:298)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Jigasi 2020-04-02 19:33:03.085 INFO: [1282] impl.protocol.sip.SipLogger.logInfo().196 Info from the JAIN-SIP stack: Setting SIPMessage peerPacketSource to: /10.36.35.2:5160
Jigasi 2020-04-02 19:33:03.691 INFO: [1261] org.jitsi.jigasi.JvbConference.callStateChanged().1122 [ctx=15858487777981075833164] JVB conference call IN_PROGRESS.
Jigasi 2020-04-02 19:33:03.917 SEVERE: [1320] net.sf.fmj.media.Log.error()   Unable to handle format: LINEAR, 48000.0 Hz, 16-bit, Mono, LittleEndian, Signed
Jigasi 2020-04-02 19:33:03.919 SEVERE: [1320] net.sf.fmj.media.Log.error() Failed to prefetch: net.sf.fmj.media.ProcessEngine@29881665
Jigasi 2020-04-02 19:33:03.926 SEVERE: [1319] net.sf.fmj.media.Log.error() Error: Unable to prefetch net.sf.fmj.media.ProcessEngine@29881665

Jigasi 2020-04-02 19:33:07.115 INFO: [1266] org.jitsi.jigasi.SipGatewaySession.sipCallEnded().629 [ctx=15858487777981075833164] Sip call ended: Call: id=1585848777795266673403 peers=0
Jigasi 2020-04-02 19:33:07.118 INFO: [1266] org.jitsi.jigasi.JvbConference.stop().500 [ctx=15858487777981075833164] Removing account Jabber:47f6172b@meet.jitsi/47f6172b
Jigasi 2020-04-02 19:33:07.136 INFO: [1266] impl.protocol.jabber.OperationSetBasicTelephonyJabberImpl.registrationStateChanged().132 Jingle : OFF 
Jigasi 2020-04-02 19:33:07.141 INFO: [1266] org.jitsi.jigasi.AbstractGateway.notifyCallEnded().128 [ctx=15858487777981075833164] Removed session for call. Sessions:0
Jigasi 2020-04-02 19:33:07.161 SEVERE: [1269] org.jitsi.impl.neomedia.RTPConnectorOutputStream.log() Failed to send a packet to target /172.22.0.6:10000:java.io.IOException: No active socket.
Jigasi 2020-04-02 19:33:07.173 SEVERE: [1269] org.jitsi.impl.neomedia.RTPConnectorOutputStream.log() Failed to send a packet to target /172.22.0.6:10000:java.io.IOException: No active socket.
Jigasi 2020-04-02 19:33:07.174 SEVERE: [1328] org.jitsi.jigasi.JvbConference.callStateChanged().1114 [ctx=15858487777981075833164] Call change event for different call ? Call: id=15858487793131054358458 peers=0 : null
Jigasi 2020-04-02 19:33:07.196 SEVERE: [1268] org.jitsi.impl.neomedia.RTPConnectorOutputStream.log() Failed to send a packet to target /172.22.0.6:10000:java.io.IOException: No active socket.
Jigasi 2020-04-02 19:33:07.202 SEVERE: [1328] org.jitsi.impl.neomedia.RTPConnectorOutputStream.log() Failed to send a packet to target /172.22.0.6:10000:java.io.IOException: No active socket.

For jitsi desktop, I needed to disable opus to work with my asterisk; I copied those settings over, but, well… see above.

For me, this still smells like a codec issue, but I can’t nail it down. I played a lot with codec settings, but no success so far.

Regards
Thomas

1 Like

@tbrettinger I’m not using docker so I can’t help you. I’m using straight Ubuntu 16.04 and the debian/ubuntu builds provided by jitsi.org

I hate to say it but your problem might stem from using docker, it may not have the necessary dependencies installed that a standalone Ubuntu 16.04 build of Jitsi-Meet may provide.

I’m also using a virtual machine deployment of freepbx (Version FreePBX 15.0.16.44 with Asterisk 16.9.0)

Hey Nightstryke, what do you mean by “set the extension’s IP to your jitsi-meet/jigasi server’s IP?”
Is that a setting in freepbx. I’m not sure.

I almost have this working. You and I are doing about the same setup. Virutal, Debian 10 Jitsi Server, FreePBX 15 Server. I can call and put in pin, hit pound, the conference room shows the dial in connecting but than shows it disconnected.The phone keeps ringing for a bit than dies with a busy tone.

I can share the sip.pcap is that helps?

Thank you much!

My fix, for the disconnects, was the same as listed on this post.

So far so good! Thank you everyone!

1 Like

What i mean is goto your FreePBX Server, edit the chan_sip extension hit the “Advanced” tab. Scroll down to Port and set it to 5160, then scroll further down to Permit and add Jitsi’s IP and click submit>apply config.

This way the PBX server knows without a shadow of a doubt that the Jitsi Server IP is allowed and able to use that extension.

1 Like

Hi nightstryke
Would you mind sharing the IVR setup of the Freepbx - I struggle to set it up correctly to get the PIN to forward to jigasi…
The rest of the setup I think I’ve got in place, but it still remains to be proven…

@Michael_Brown: Thanks a lot, that fixed it for me as well!

Works like a charm now.

1 Like

@janlov An IVR isn’t necessary to setup in FreePBX for this, look further up where I said you need to edit the /etc/asterisk/extensions_override_freepbx.conf that’s essentially the IVR Hard Coded. You can setup your own system recording for this, but I just used the built in conference call recording already in FreePBX.

@nightstryke - you’re so right.
When using @EvilCreamsicle’s Very Nice Guide mentioned above everything works smoooth … on the Asterisk end.
However I strugle to get at PIN displayed in my meeting info - in fact the phonenumbers don’t show either ;( [I can get the numbers from command prompt with the same url as I loaded into Jigasi] :nauseated_face:
Any clues?

@janlov You didn’t read a word I said. Start over and follow what I said it works.

Oh, I read your every word :wink:
I got the Asterisk part working, in the sense that I can call the number and type the pin, and have it calling the sip line.

It’s the Jitsi-meet part I’m strugling with - for some reason, which I haven’t figured out yet, I cannot make it display the phonenumbers to dial not the pincode to use getting in to the right conference.

The only thing that happened after my “start over and follow” was that now Jigasi is no longer registering at the Asterisk anymore - it worked before…
The log now says “2020-04-07 07:40:09.447 SEVERE: [36] org.jitsi.meet.ComponentMain.log() host-unknown, host:localhost, port:5347
org.xmpp.component.ComponentException: host-unknown”
but the host is defined with (correct and reachable) IP number…

So in fact I’m a wee bit worse off than before starting over…
Anoying …

The display numbers you should follow Evilcreamsicle’s tutorial for that.

Host Phone Number .PHP and JSON

On a webserver that is NOT running on the Jitsi Meet server we are setting up, you will need to host two files.

First, the JSON file that will display your dial-in phone numbers:

{"message":"Phone numbers available.","numbers":{"US":["+1.555.555.1212"],"Germany":["+49.5551212"]},"numbersEnabled":true}

And Second, the PHP file that will serve the JSON and Content-Type Headers to Jitsi Meet:

<?php
    header('Content-Type: application/json');
    readfile("./jitsi_numbers.json");
    ?>

You must configure your web server to serve this PHP file over SSL
Since this is not hosted on your Jitsi Meet server, you must also enable Cross Origin Scripting (CORS) support.
You can use any web server, but here is an example of a VirtualHost entry if your web server is Apache:

<VirtualHost *:443>
        ServerAdmin you@domain.com
        ServerName assetbin.domain.com
        DocumentRoot /var/www/assetbin
 
        SSLEngine on
        SSLProtocol all -SSLv2 -SSLv3
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
 
        SSLCertificateFile /etc/httpd/certs/domain.crt
        SSLCertificateKeyFile /etc/httpd/certs/domain.key
        SSLCertificateChainFile /etc/httpd/certs/domain.chain
 
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/assetbin>
                Options Indexes FollowSymLinks MultiViews
                DirectoryIndex index.html
                AllowOverride All
                Order allow,deny
                allow from all
 
                Header set Access-Control-Allow-Origin "*"
        </Directory>
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>
        ErrorLog logs/assetbin_error.log
        LogLevel warn
        CustomLog logs/assetbin_access.log combined
</VirtualHost>

You should navigate to both of these in a web browser to make sure they are functional and accessible.

Enable Call-In Number Display in Jitsi Meet

The options to display the Phone Numbers list you just created, and the Meeting ID number, are available in Jitsi-Meet but undocumented.
NOTE: The Meeting ID display uses Jitsi Meet’s hosted ConferenceMapper API

Add the following lines to your Jitsi Meet configuration file at /etc/jitsi/meet/meet.domain.com-config.js where ‘meet.domain.com’ is the FQDN of your Jitsi Meet server:

// To enable sending statistics to callstats.io you must provide the
// Application ID and Secret.
// callStatsID: '',
// callStatsSecret: '',
 
// Call In Numbers and Codes   
dialInNumbersUrl: 'https://assetbin.domain.com/jitsiNumberList.php',
dialInConfCodeUrl: 'https://jitsi-api.jitsi.net/conferenceMapper',   
// ADD THE BELOW THREE LINES! 
// Don't change dialInConfCodeURL, it is the one that points at Jitsi's conferenceMapper API
 
// enables callstatsUsername to be reported as statsId and used
// by callstats as repoted remote id
// enableStatsID: false