Asterisk in Docker: Difference between revisions

From Wildsong
Jump to navigationJump to search
Brian Wilson (talk | contribs)
mNo edit summary
Brian Wilson (talk | contribs)
 
(7 intermediate revisions by the same user not shown)
Line 1: Line 1:
Read the [[Docker]] page if you don't know what Docker is.
Read the [[Docker]] page if you don't know what Docker is.


Notes on building Asterisk executables from source, the old way: [[Building Asterisk]]. All this is built into my build-asterisk image and automated now.
Notes on building a current executable, the old way: [[Building Asterisk]]


Read the [[Twilio]] and [[Asterisk debugging]] pages too.
== Building a docker container ==


== Building a configured Asterisk Docker container ==
I used with the github respoke/asterisk image as my starting point.
Then I broke respoke's image out into two parts, so that it would build faster.


I started with the github respoke/asterisk image as my starting point. Then I did my own version (brian32768/docker-build-asterisk in github or wildsong/asterisk in hub.docker.com) because I wanted to use the latest Asterisk and respoke does not appear to get updated.
Currently I work logged into Bellman.


On Bellman I keep the sources checked out here: source/docker/docker-build-asterisk
I have a Debian Stretch container that has all the
tools in it, and when the container builds it downloads sources and
configures and compiles them.


Once the 'build-asterisk' container is working, I push changes to github and a new copy
cd source/docker
will build at hub.docker.com automatically.
git clone [email protected]:brian32768/docker-build-asterisk.git build-asterisk
cd source/docker/build-asterisk
docker build -t build-asterisk .


After version updates remember to tag which goes something like this
Once the 'build' container is working, check in changes to github and a new copy
On hub.docker.com create a new build when new Asterisk versions are released.
will autobuild at hub.docker.com.
 
git tag -a rel1.0.x -m 'release 1.0.x of build-asterisk'
git push origin rel1.0.x


== Configuration ==
== Configuration ==


I keep a private git repo for this part because the current version is full of secrets.
Put environment settings into Dockerfile and add j2 config files that I created for [[Vastra]].
It's checked out as source/docker/docker-asterisk-wildsong with this command:


git clone git@git.wildsong.biz:docker-asterisk-wildsong.git
I decided today (3/2/2019) that pjsip is not the greatest thing ever and went back to using chan_sip.


Edit environment settings in the Dockerfile and adjust the j2 config files that were created originally for Vastra.
The configuration is entirely file based because my home phone system is relatively static.
The current configuration is entirely file based because my home phone system is relatively static so messing with MySQL just seems like extra work for no return.
Making it file based means the whole config can be baked into the Docker image.


The docker-asterisk container configures Asterisk based on templates
The docker-asterisk container configures Asterisk based on templates
in etc_asterisk.
in etc_asterisk.


  cd source/docker/docker-asterisk-wildsong
  cd source/docker/docker-asterisk
  ''edit Dockerfile to adjust environment''
  ''edit Dockerfile to adjust environment''
  cd etc_asterisk
  cd etc_asterisk
Line 41: Line 42:
  docker build -t asterisk-wildsong .
  docker build -t asterisk-wildsong .


== Start it up ==
== Launch server ==


Using the --net=host option is not a best practice because it exposes every port running on the docker machine.
Using the --net=host option is not a best practice because it exposes every port running on the docker machine.
It means it looks like Asterisk is just running on Bellman, not inside a container.  
It means it looks like Asterisk is just running on Bellman, not inside a container.  
This is not 'best practices' but makes network problems go away. I am not sure if I need the "expose".


  docker run -d --net=host --expose 10000-10101 --name=asterisk asterisk-wildsong
  docker run -d --net=host --name=asterisk asterisk


You should be able to see the SIP port(s) exposed
I don't think I need any -p port mappings or --expose if I use --net=host, and though it's not "best practices"
it will make Asterisk networking problems go away pretty much.


netstat -an |grep 5060
== Testing ==
udp        0      0 0.0.0.0:5060            0.0.0.0:*
unix  2      [ ACC ]    STREAM    LISTENING    94552697 @/containerd-shim/moby/6de5485d98c7a6d642a10beead4e6111a8319f4ec9b84e8a23cf00ce9165060f/shim.sock@
unix  3      [ ]        STREAM    CONNECTED    94553455 @/containerd-shim/moby/6de5485d98c7a6d642a10beead4e6111a8319f4ec9b84e8a23cf00ce9165060f/shim.sock@


If it seems to work then set it to reboot:
=== Outside calls via Twilio ===


docker update --restart unless-stopped asterisk
Call from PSTN (mobile) to 707-827-0001
 
or use the Twilio service to test call.
== Running some tests ==
* Is it being logged at Twilio? '''YES'''
 
* Two way audio? '''YES'''
=== Debugging mode ===
 
See also [[Asterisk debugging]] and [[Twilio]].
 
docker exec -it asterisk asterisk -r
bellman*CLI> core set debug 10
bellman*CLI> core set verbose 10
 
It's very useful to force a reload so you can see all the modules are loading correctly.
 
bellman*CLI> core reload
 
It's also useful to look at what the dialplan is
 
bellman*CLI> dialplan show
=== Outside call ===


==== From PBX to outside ====
Call out from a GXV3240 to the mobile. '''WORKS!'''
 
* Dial Twilio test numbers +1(650)489-4546 and +1(415)475-8378
** Check [https://www.twilio.com/console/sip-trunking/trunks/TKa9992c496d4a13177bd7792c443fb6ce/termination Twilio termination page] if it does not work.
* Dial out to cellphone
* Dial out to Google Voice
 
==== Outside to PBX ====
 
* Try the [https://www.twilio.com/console/sip-trunking/trunks/TKa9992c496d4a13177bd7792c443fb6ce/origination Twilio origination] Make a Call button.
* Call from mobile to 707-827-0001
* Is it being logged at Twilio? '''YES'''
* Can I see the connection attempt in the Asterisk console? '''No'''
** Can I see the connection attempt being forwarded through the firewall? '''Don't know yet'''
* Two way audio?
* TODO Set up SMS and MMS message gateways???


TODO Set up SMS and MMS message gateways???


=== Inside call, to PBX ===
=== Inside call, to PBX ===
Line 115: Line 81:
* Call to voice mail '''works'''.
* Call to voice mail '''works'''.
* Calling station to station '''works'''.
* Calling station to station '''works'''.
* Video calling '''works'''.


* TODO -- GET SMART PHONE set up. Currently it fails to register
* TODO -- GET SMART PHONE set up. Currently it fails to register
Line 124: Line 91:
Logins fail with this error.
Logins fail with this error.
  [Nov  6 06:54:09] WARNING[294][C-00000008]: app_voicemail.c:11191 vm_authenticate: Couldn't read username
  [Nov  6 06:54:09] WARNING[294][C-00000008]: app_voicemail.c:11191 vm_authenticate: Couldn't read username
I got it set right finally... not sure which change did it. I did have to tell the phone to send number 100.


== Intercom calling ==
== Intercom calling ==


TODO
I tried MulticastRTP paging. Asterisk did not understand what that was.
 
I tried using one registration on the phone and sending "Auto answer = 0" in the sip header
and it almost worked.
 
I ended up having each phone register on two separate lines, one normal and one set to auto-answer and start in video mode.
 
Dial 500


== Console ==
== Console ==
Line 135: Line 111:
  docker exec -it asterisk asterisk -r
  docker exec -it asterisk asterisk -r


Or you can run a sniffer
Or you can connect the usual way via a bash shell
 
docker exec -it asterisk bash


  docker exec -it asterisk tcpdump -n not arp
  tcpdump -n not port 22 and not arp and not host 192.168.123.159


== Connected phones ==
== Connected phones ==
Line 146: Line 124:




[[Category: VOIP]]
[[Category: Telephones]]
[[Category: Docker]]

Latest revision as of 15:48, 31 August 2022

Read the Docker page if you don't know what Docker is.

Notes on building a current executable, the old way: Building Asterisk

Building a docker container

I used with the github respoke/asterisk image as my starting point. Then I broke respoke's image out into two parts, so that it would build faster.

Currently I work logged into Bellman.

I have a Debian Stretch container that has all the tools in it, and when the container builds it downloads sources and configures and compiles them.

cd source/docker
git clone [email protected]:brian32768/docker-build-asterisk.git build-asterisk
cd source/docker/build-asterisk
docker build -t build-asterisk .

Once the 'build' container is working, check in changes to github and a new copy will autobuild at hub.docker.com.

Configuration

Put environment settings into Dockerfile and add j2 config files that I created for Vastra.

I decided today (3/2/2019) that pjsip is not the greatest thing ever and went back to using chan_sip.

The configuration is entirely file based because my home phone system is relatively static. Making it file based means the whole config can be baked into the Docker image.

The docker-asterisk container configures Asterisk based on templates in etc_asterisk.

cd source/docker/docker-asterisk
edit Dockerfile to adjust environment
cd etc_asterisk
edit files
cd ..
docker rm -f asterisk-wildsong
docker build -t asterisk-wildsong .

Launch server

Using the --net=host option is not a best practice because it exposes every port running on the docker machine. It means it looks like Asterisk is just running on Bellman, not inside a container.

docker run -d --net=host --name=asterisk asterisk

I don't think I need any -p port mappings or --expose if I use --net=host, and though it's not "best practices" it will make Asterisk networking problems go away pretty much.

Testing

Outside calls via Twilio

Call from PSTN (mobile) to 707-827-0001 or use the Twilio service to test call.

  • Is it being logged at Twilio? YES
  • Two way audio? YES

Call out from a GXV3240 to the mobile. WORKS!

TODO Set up SMS and MMS message gateways???

Inside call, to PBX

  • Press voicemail button. Does prompt come back? YES
    • TODO -- I want it configured to bypass the user/pass prompt.

Inside call, station to station

I have two stations registering right now, the GXV phones.

  • 100 Ring all phones
  • 101 Studio phone 192.168.123.80 on wire
  • 102 eLab phone 192.168.123.76 on WIFI
  • 850 voice mail
  • Call to voice mail works.
  • Calling station to station works.
  • Video calling works.
  • TODO -- GET SMART PHONE set up. Currently it fails to register
[Nov  6 06:56:21] NOTICE[262]: res_pjsip/pjsip_distributor.c:659 log_failed_request: Request 'REGISTER' from '<sip:[email protected]>' failed for '192.168.123.207:13411' (callid: [email protected]) - Failed to authenticate
[Nov  6 06:56:21] NOTICE[262]: res_pjsip/pjsip_distributor.c:659 log_failed_request: Request 'REGISTER' from '<sip:[email protected]>' failed for '192.168.123.207:13411' (callid: [email protected]) - No matching endpoint found

Voicemail

Logins fail with this error.

[Nov  6 06:54:09] WARNING[294][C-00000008]: app_voicemail.c:11191 vm_authenticate: Couldn't read username

I got it set right finally... not sure which change did it. I did have to tell the phone to send number 100.

Intercom calling

I tried MulticastRTP paging. Asterisk did not understand what that was.

I tried using one registration on the phone and sending "Auto answer = 0" in the sip header and it almost worked.

I ended up having each phone register on two separate lines, one normal and one set to auto-answer and start in video mode.

Dial 500

Console

You can connect to the Asterisk console directly with this command

docker exec -it asterisk asterisk -r

Or you can connect the usual way via a bash shell

docker exec -it asterisk bash
tcpdump -n not port 22 and not arp and not host 192.168.123.159

Connected phones

I don't know how to see what phones are registered with pjsip!??

I started a separate page for it, PJSIP.