It's not easy and takes a long time to perfect, but our entire VoIP infrastructure is Dockerized, and composed of Asterisk, MySQL, Redis, NodeJS and Kamailio+RTPEngine (not rtpproxy, since rtpproxy isn't maintained anymore). No docker-level port forwarding required anywhere, since the entire system is designed to be volatile (see below).
We have over 500 Asterisk docker containers running, supporting many thousands of users across the world at this point, and it works quite well, so it can be done.
The concept behind the Asterisk containers is designing everything to be completely volatile: Outages happen, even in datacenters, so assume a container will reboot at some point on some random node at some random datacenter location. You don't know Asterisk's private IP, you don't even know where it might pop back up in the cluster. If you can ensure service continuity in that scenario, then you've built a solid setup. Our uptime has been 100% for over 4 years now (this is 3rd-party monitored and validated, in addition to our internal monitoring systems) so I assure you it is very possible.
I also HIGHLY recommend not using a cloud provider for any of the core infrastructure. We tried this, with AWS and GCP, and the voip quality was... meh. The cloud outages were frequent, although customers generally don't notice them when you're using lightweight containers to run everything. So we are fully operating on our own hardware across multiple colo locations, and only using cloud for file storage (eFaxes, voicemails, greetings/recordings, MMS content, phone LCD background images for provisioning, etc).
I am unable to help with your project, but I can at least provide the above pointers/experiences in case they get you in the right direction.
An alternative to building your own infrastructure might be reselling (white label) an existing service provider as well, in case the decision to build your own infrastructure is still up in the air.
Luke Escudé
972.600.1150
support(a)primevox.net
Schedule a meeting!<https://outlook.office365.com/owa/calendar/PrimeVOXCommunications@primevox.…>
View the PrimeVOX R&D Roadmap here<https://trello.com/b/pzpoyn8m/primevox-engineering>
View the PrimeVOX Status Page here<https://status.primevox.net/>
________________________________
From: sr-users-request(a)lists.kamailio.org <sr-users-request(a)lists.kamailio.org>
Sent: Thursday, December 22, 2022 9:44 AM
To: sr-users(a)lists.kamailio.org <sr-users(a)lists.kamailio.org>
Subject: sr-users Digest, Vol 211, Issue 47
Send sr-users mailing list submissions to
sr-users(a)lists.kamailio.org
To subscribe or unsubscribe via email, send a message with subject or
body 'help' to
sr-users-request(a)lists.kamailio.org
You can reach the person managing the list at
sr-users-owner(a)lists.kamailio.org
When replying, please edit your Subject line so it is more specific
than "Re: Contents of sr-users digest..."
Today's Topics:
1. Re: Dockerized VoIP Stack (Terrance Devor)
2. Re: Dockerized VoIP Stack (Terrance Devor)
3. Re: Dockerized VoIP Stack (Terrance Devor)
----------------------------------------------------------------------
Message: 1
Date: Thu, 22 Dec 2022 09:31:33 -0500
From: Terrance Devor <ter.devor(a)gmail.com>
Subject: [SR-Users] Re: Dockerized VoIP Stack
To: "Kamailio (SER) - Users Mailing List"
<sr-users(a)lists.kamailio.org>
Message-ID:
<CA+w+2f8CtdwkiDtz+Md-pZz5xA4-59gv768b_vq4bkdjf2V3hw(a)mail.gmail.com>
Content-Type: multipart/alternative;
boundary="000000000000398ece05f06b87af"
I did see the CyCore project and tried to connect with Laurel Lauson and
Sean McCord on LinkedIn
On Wed, Dec 21, 2022 at 9:18 PM Fred Posner <fred(a)palner.com> wrote:
> On Dec 21, 2022, at 8:41 PM, Terrance Devor <ter.devor(a)gmail.com> wrote:
>
>
> Does anyone have experience in deploying Kamailio, Asterisk and RTPProxy
> to a dockerized environment with K8s?
>
>
> Check out some past Kamailio World and Astricon presentations, including
> some from Sean McCord. He even has a GitHub demo:
>
> * https://github.com/CyCoreSystems/asterisk-k8s-demo
>
> -- Fred
> The Palner Group, Inc.
> +1 (212) 937-7844
>
> __________________________________________________________
> Kamailio - Users Mailing List - Non Commercial Discussions
> To unsubscribe send an email to sr-users-leave(a)lists.kamailio.org
> Important: keep the mailing list in the recipients, do not reply only to
> the sender!
> Edit mailing list options or unsubscribe:
>
Hello,
KEMI can be programmed in Java, JavaScript, Lua(sr), Squirrel, Mono, Perl, Python(2,3,3s), Ruby.
Which language binding has the lowest runtime overhead in CPU-terms? How about lowest overhead in terms of RAM?
Kind regards
Дилян
Hi.
Can you please advise if existing ims implementation supports integration
with ims AS (Application Server), in particular for the third party
registration:
- upon UE registration is completed, S-CSCF constructs Register message
(which keeps all details of subscriber register message) and submits it to
AS server as regular SIP-message (TS 24.229 5.4.1.7 Notification of
Application Servers about registration status). S-CSCF obtains AS address
from SAA (Server Assignment Answer) diameter message, received from HSS
upon successful registration.
--
obelousov.tel
Hi List
Some time ago, during my learning curve with kamailio, I learned that a
branch route is where you make modifications to callerId's.
So I extensively re-engineered the config to move as much as possible
of callerid modification into branch routes.
But now I discovered, when a call is dispatched via dispatch group with
multiple destinations and one destination fails, therefore the failure
route is triggered, the branch route is not being called on the second
attempt, thus callerid being in the wrong format.
Example:
dispatcher.lst
As an example, consider having dispatcher group 2001 for national traffic over two
dedicated links and Dispatcher group 2002 for international traffic.
2001 sip:192.168.1.1:5060 0 0 name="Carrier1"
2001 sip:192.168.2.1:5060 0 0 name="Carrier1"
2002 sip:192.168.1.3:5060 0 0 name="Carrier2"
request_route
{
# We determine where we want to send the call
# and choose dispatch group 2001, the 'national' one.
# But there are are other dispatch groups and branch triggers
# set this way and routed to DISPATCHCALL
$avp(dispgroup) = 2001;
t_on_branch("BR_TO_NATIONAL");
route(DISPATCHCALL);
}
route[DISPATCHCALL]
{
t_set_fr(120000,1500); # Fast Failover
t_set_max_lifetime(300000,0);
t_set_retr(200,800);
if (ds_select_dst("$avp(dispgroup)", "6")) {
if (ds_is_from_list(-1,0,"$du")) {
t_on_failure("DISPATCH_FAILURE");
route(RELAY);
}
}
}
branch_route[BR_TO_NATIONAL]
{
# Here I make sure, all CallerId and Header are correct for the
# national Carrier
}
failure_route[DISPATCH_FAILURE]
{
if (t_check_status("(5[0-9][0-9])") or (t_branch_timeout() and !t_branch_replied())) {
# Try next DS.
if (ds_next_dst()) {
xlog("L_INFO", " --> retargeting request\n");
t_on_failure("DISPATCH_FAILURE");
route(RELAY); #### RIGHT HERE!
exit;
}
}
# We fail
xlog("L_ERROR", "Call Failed\n");
}
My issue is not, that if the call is routed after the first path failed
(marked with #### RIGHT HERE!) then the appropriate branch route is not
triggered again and the headers are wrong. But I can not set t_on_branch
within route[DISPATCHCALL] or route[DISPATCH_FAILURE] because this is
called with a different pre-set branch trigger, depending on the target
dispatch group.
Is there a way to make a branch trigger more persistent?
--
Mit freundlichen Grüssen
-Benoît Panizzon- @ HomeOffice und normal erreichbar
--
I m p r o W a r e A G - Leiter Commerce Kunden
______________________________________________________
Zurlindenstrasse 29 Tel +41 61 826 93 00
CH-4133 Pratteln Fax +41 61 826 93 01
Schweiz Web http://www.imp.ch
______________________________________________________
Hello,
I am using the topoh module and it works fine except for the BYE requests
coming from the callee (the person receiving the call). When a BYE is
received from the destination of the call, then Kamailio relays it to the
dummy IP 127.0.0.8. This is exemplified in the topoh:msg-outgoing
and topoh:msg-sending events where the $sndto(ip) is set to 127.0.0.8.
I am using all default modparams with topoh. The only modparam I have is
for setting the event_callback. I am using Kamailio 5.6.2 with Kemi using
python3.
Michel Pelletier
Hi List
I noticed that the database is accumulating entries on dialog_vars.
I don't know when and why this is happening.
Are there any special measures that have to be taken like making sure
to unset variables after using them to prevent this?
Or is this something which is supposed to happen when kamailio is
restarted?
Mit freundlichen Grüssen
-Benoît Panizzon-
--
I m p r o W a r e A G - Leiter Commerce Kunden
______________________________________________________
Zurlindenstrasse 29 Tel +41 61 826 93 00
CH-4133 Pratteln Fax +41 61 826 93 01
Schweiz Web http://www.imp.ch
______________________________________________________
Hi List
Testing failure situations, I discovered unset_dlg_profile can
not be used in request_route:
I count the channels per customer in a dlg_profile to know when they
are busy. Residential POTS customer have 1 channel.
Now this situation (Trying to mimik POTS behavior)
Kamailio <=> CPE of 'John-Doe'
=> INVITE
set_dlg_profile of John-Doe is 0: Not busy
set_dlg_profile of John-Doe +1
<= 100 trying
<= 180 ringing
== LINK to CPE DISRUPTED ==
X<= 200 OK (not reaching kamailio)
CPE is sending 200 a couple of times and fails.
Caller is still hearing ringing tone as it never got 200 OK.
The caller does not want to wait longer and hangs up
=>X CANCEL (NOT reaching CPE)
This is the moment, on which I would like to unset_dlg_profile of
John-Doe to mark his channel available again.
But the CPE is never going to acknowledge this CANCEL with 487.
Unfortunately: unset_dlg_profile(): dialog delete profile cannot be used in request route
Only when kamailio has sent CANCEL a couple of times and the
failure_route for this CANCEL is triggered, I can remove the call
from the dlg_profile of that customer within failure_route.
If I am unlucky, in the meantime other calls get 'busy' instead of
being re-routed to the configured backup number of that customer.
Agreed, after a couple of seconds, the call goes to the failure
route and the dialogue is ending thus calls work as expected.
But wouldn't it be nice to be able to unset the
dlg_profile upon receiving the CANCEL instead on when the CANCEL
transaction is successful?
Mit freundlichen Grüssen
-Benoît Panizzon-
--
I m p r o W a r e A G - Leiter Commerce Kunden
______________________________________________________
Zurlindenstrasse 29 Tel +41 61 826 93 00
CH-4133 Pratteln Fax +41 61 826 93 01
Schweiz Web http://www.imp.ch
______________________________________________________
Hi Folks
We use two 'core' instances and two 'registrar' instances.
The pairs sync their information (Dialogues + Locations) via DMQ.
But I noticed that they record the Via and Record-Routes by IP
addresses. So I guess if one fails, signaling would not automatically
switch to the remaining host as the IP of the failed one is in the
header, right?
So, is there a way to put a DNS resolvable host-name in the Via and
Record-Route header, so that DNS round-robin would make sure requests
reach the available server if one of the pairs fails?
Mit freundlichen Grüssen
-Benoît Panizzon-
--
I m p r o W a r e A G - Leiter Commerce Kunden
______________________________________________________
Zurlindenstrasse 29 Tel +41 61 826 93 00
CH-4133 Pratteln Fax +41 61 826 93 01
Schweiz Web http://www.imp.ch
______________________________________________________
Hello!
I'm examining the WebSocket module and I am wondering how it handles
multiple connections from the same port.
For context, imagine the following scenario:
UA1 ==> Load Balancer:41914 ==> Kamailio (WS)
UA2 ==> Load Balancer:41914 ==> Kamailio (WS)
Now, imagine Kamailio perceives UA1 from port 41914. What happens if that
UA1 suddenly drops and another UA2 comes in from the same port? (before the
connection closed event is fired for UA1)
I understand by looking at the source code that `wsconn_add` is called and
that this new connection is added to the list. But what happens with the
previous UA entry? does it gets overwritten or does it stays there?
The reason for my question is: I am perceiving the above scenario like this:
Let's say UA1 is *sip:d3315cf8@9a431b1f90e5.invalid;transport=ws SIP/2.0*
and UA2 is *sip:asd08a08@555343439666.invalid;transport=ws. *If UA2 comes
in and takes over the port that UA1 was using, and I send an INVITE to UA1
UA2 ends up receiving the invite (obviously because it now has that port
allocated).
So what I am thinking is that both *d3315cf8(a)9a431b1f90e5.invalid *and
*asd08a08(a)555343439666.invalid
*are mapped to the same port for a short period of time.
Thoughts?
Saludos,
[image: Twitter] <https://twitter.com/benjaminvison>[image: Instagram]
<https://instagram.com/bvisonl/>
Benjamín Visón / IT Engineer / Software Developer
bvisonl(a)gmail.com / (829)-664-5163
https://www.linkedin.com/in/bvisonl/
Hi,
Is there any good solution for the scenario of an auth_challenge() with two separate transaction suspensions?
To clarify (simplified):
request_route {
...
t_newtran();
if(!is_present_hf("Authorization") && !is_present_hf("Proxy-Authorization")) {
auth_challenge("$fd", "1");
exit;
}
# TM suspend/continue
t_newtran();
async credentials query("RESUME_AUTH");
}
route[RESUME_AUTH] {
# Credentials received into PVs.
if(!pv_auth_check("...")) {
auth_challenge("$fd", "1");
exit;
}
# Create transaction shell if not exists already from auth query.
if(!t_lookup_request())
t_newtran();
# TM suspend/continue
async route query("RESUME_ROUTING");
}
route[RESUME_ROUTING] {
# Unmarshal etc.
t_relay(); # etc.
}
What happens here is that the first auth_challenge() results in a retransmission of its 407 challenge without absorbing the negative ACK. This is despite the ostensibly stateful behaviour of auth_challenge() without "force_stateless_reply" enabled.
In this case, it eclipses the second, unrelated 407 challenge from the subsequent routing query (407 challenge with +1 CSeq):

-- Alex
--
Alex Balashov | Principal | Evariste Systems LLC
Tel: +1-706-510-6800 / +1-800-250-5920 (toll-free)
Web: http://www.evaristesys.com/, http://www.csrpswitch.com/