Home » How to install and setup a Mumble server on CentOS 7

How to install and setup a Mumble server on CentOS 7

In this tutorial I’m going to walk through how to install and setup a Mumble server on CentOS 7. I was initially going to use a MySQL server instead of using their default SQLite but it seems it’s better to just use what they give you.

Let’s start by going to http://wiki.mumble.info/wiki/Main_Page and downloading the latest stable release of the Static Linux Server. I typically do this by clicking on the link, right clicking the “direct link” on the sourceforge site, and selecting “Copy Link Address” and then downloading it directly onto the server with wget (the latest stable release at the time of this post was 1.2.8):

We now have murmur (the mumble server) installed in /usr/local/murmur and our settings file copied over to /etc/murmur.ini – now we can setup a user, group, and logs directory for murmur:

Now we need to create a systemd service so we can start mumble as a daemon process that runs in the background at startup. Create a file: /etc/systemd/system/mumble.service and put this inside it:

Note: in the “After” section above I put mariadb.service because I use MariaDB instead of the standard MySQL (which I recommend). If you are using the standard MySQL Server then you can change this to mysqld.service instead, or if you’re using the default SQLite then you really can just remove this entirely. It doesn’t hurt to make it start up after MySQL or MariaDB though so it doesn’t matter if this is in here so long as you have one of those services installed and enabled to run on boot.

Now we need to create a directory for the .pid files:

Now edit your /etc/murmur.ini config and change the following lines:

Then open up port 64738 (or whatever port you chose to use) for tcp and udp on your firewall:

Alright, that’s just about it. Now we can start mumble via the systemd process we setup:

Once you start mumble you’ll want to go into /var/log/murmur/murmur.log to get your SuperUser password and write that down. You’ll use that to connect as the SuperUser and configure your server. You can add your normal user as an admin once you’ve signed in with your normal user, right clicked your name, and clicked “register”. Then when you sign in as SuperUser you should be able to right click the Root channel and click edit to modify the groups and add your user to the admin group.

Update:

Thanks to Bob (from the comments below) there’s confirmation that this tutorial works just fine for CentOS 6 as well, sans the systemd service. If you’re interested in setting this up on CentOS 6, you can use the init.d bash script that Bob included below to start and stop the service with the service command:

 

46 comments on “How to install and setup a Mumble server on CentOS 7

  1. Kevin Moody on

    Thank you very much for taking the time to post this article! Very easy to follow and I now have my own murmur server running!
    The only problems I had, where after you create the user group, it doesn’t let you add a user to that group complaining that you need to use the -g flag. I used webmin to go in and set up the user because I wasn’t sure where to place that in relation to the -s flag. I assumed it was just in line with it (and not between the -s flag and the listed directory) but I didn’t want to take a chance I was wrong.
    Also, you create the log folder in the second step, then create it again in the 4th step, which gives the error that it’s already there. I just skipped the 2nd entry in your tutorial and everything was good.

    Reply
    • Jeff Hays on

      Hey Kevin,

      Excellent feedback! I’ve updated my tutorial to reflect the changes you mentioned. In regards to adding the user to the group, it was one of the things I skipped over assuming there may be a case where some people would want to manage users in their own way. If it becomes problematic for others, I’ll go ahead and modify the tutorial.

      Thanks for contributing back 🙂

      Reply
  2. Bob on

    I would like to first thank you for putting this up, I wouldn’t be able to have this set up without you. I actually used your guide to set up murmur on CentOS 6, it works just fine. Instead of using the systemd service you created (as is not possible to use on centos6 since it doesnt use systemd) I copied a init.d script from a .rpm mumble-server file. I just had to edit a few things and thought I would add it here, maybe you can add it to this post so you can cover CentOS 6 installations and help others as well.

    I have it in a pastebin, I can stop, start, restart and use the chkconfig command to enable on startup just fine. mumble server works fine as well.

    http://pastebin.com/YbfQA9wX

    Reply
    • Jeff Hays on

      Hey Bob,

      I’m glad you found this useful, and thank you very much for posting feedback and praise. I write articles like this specifically to help out others expedite a process that I had to figure out on my own, so it’s always nice to hear feedback and suggestions on how to make an article more useful to others.

      I’ve included your bash script in the tutorial for those that want to set this up on CentOS 6 with an init.d script. Cheers!

      Reply
  3. Steve on

    Hi Jeff,

    I have recently installed a new Centos 7 server and so needed to re-install murmur. I have followed these instructions but it does not mention anything about SELinux.

    SELinux seems to be blocking connections to murmur (when I turn SELinux off via “setenforce 0” the connections are accepted fine).

    The install docs over on the mumble wiki says to turn off SELinux completely to prevent any issues which is something I do not want to do (for security reasons).

    I have been reading various topics online including creating custom SELinux policies however this is way over my head as I have not used SELinux much as it has not caused many problems until now.

    Did you come across any issues during your installation? I have spent many hours trying to fix this with no success.

    Reply
    • Jeff Hays on

      Hey Steve,

      I personally disable SELinux as well as I find the hassles with it outweigh the added security it provides. However, in theory, it should be as simple as this:

      semanage port -a -t mumble_tcp -p tcp 64738
      semanage port -a -t mumble_udp -p udp 64738

      You should be able to confirm that these were added by listing out the ports after you ran those commands. This command will list all the open tcp/udp ports that SELinux has open (which you can pipe to grep to search for the specific port):

      semanage port -l

      Hopefully this helps. Let me know either way. 🙂

      Reply
      • Steve on

        Hi Jeff,

        Thanks for the fast reply.

        When I enter those commands, the output is:

        “ValueError: Type mumble_tcp is invalid, must be a port type”

        This looks to be because there is no mumble_tcp port defined by default in SELinux. It considers port 64738 as a “unreserved_port” as it is not considered to be related to any application.

        It looks like all of the common applications (such as http and mysql) have ports defined and configurations/policies already loaded – This was why I was looking into custom policies.

        I could be completely wrong though 🙂

        Reply
          • Steve on

            Yep so I just tried:

            “semanage port -a -t unreserved_port_t -p tcp 64738” (and the same for the udp port)

            however this just adds it to the unreserved port list as a seperate entry. Output of “semanage port -l | grep unreserved”:

            “unreserved_port_t tcp 64738, 1024-32767, 61001-65535”

            It seems there is no way to “open” a port like you would a firewall.

            This is quite annoying as there surely must be other services that don’t have defined ports in SELinux. This must mean these services have problems too.

    • Jeff Hays on

      Hey Steve,

      Okay… so read up and got some info on this. It should be as easy as this:

      When SELinux denies something, it logs an AVC denial message. You can grab the messages. One of these commands should work for you to get the messages:

      journalctl _AUDIT_TYPE=1400 --since today
      ausearch -m avc -ts today
      dmesg | grep -i denied
      grep -i denied /var/log/messages

      Once you get the AVC message output pertaining to murmur being blocked, you just need to echo that out and pipe it to the audit2allow tool that comes with SELinux like so:

      echo "INSERT AVC DENIAL HERE" | audit2allow -M murmur_fix; sudo semodule -i murmur_fix.pp

      Once that’s in there, you’ve created a module with audit2allow based on the AVC denial and SELinux should stop hating on murmur. Hopefully this works for you – I couldn’t test this out on my own because I couldn’t enable SELinux again on my production server without a bunch of issues, so if it works out, post back confirmation!

      Reply
        • Steve on

          Hi again,

          So long story short, I think its working fine now and it wasn’t SELinux.

          All of the evidence pointed to it being SELinux until I looked into the log and found that there were no AVC denials there…

          Here’s exactly what was happening/I was doing:

          – Server boot
          – Mumble starts
          – Attempt to connect to Murmur failed. Connection refused.

          So I then disabled SELinux and rebooted Murmur.
          This then allowed me to connect so I assumed it was SELinux and started researching it (it’s why I’m here now). What doesn’t help is that it states “SELinux by default will prevent murmur from functioning correctly.” in the Wiki. This appears to be incorrect.

          However when I seen that there were no AVC denials, I decided to try something.

          – I rebooted the server (with SELinux on).
          – Mumble starts
          – Attempt to connect to Murmur failed. Connection refused.
          – I then rebooted Murmur without turning off SELinux and the connection was accepted.

          So I then looked into how Murmur boots. There was no errors when i looked into “systemctl status murmur”, which I thought was strange and so I looked into the murmur.service file.

          It was then apparent that I had “mysqld.service” in the “After=” section.
          I did not have mysqld installed, I had mariadb like in your article. (I originally used the Wiki to install the server and so I copied it from there).

          Changing this to mariadb then completely fixed the situation on reboot.

          Seeing as the Mumble install Wiki is for Centos 7, it should really state mariadb in the murmur.service as this is the default database package. Will be double checking everything on there from now on.

          It seems to be working fine now, at least I think so as i haven’t had time to properly test it.

          Anyway, thanks for your help!

          I probably would have spent more time fixing it if i hadn’t looked into the lack of AVC denials! 🙂

          Reply
          • Jeff Hays on

            Hey Steve,

            I’m stoked that this shed some light into the resolution of the problem. Also excited that you got yours working with mariadb instead of the flat file they recommend. I’m sure your dialog will help others so thanks for posting back the troubleshooting steps and helping the community document some of the first attempts on this setup; this type of stuff is exactly why I started this blog.

    • Jeff Hays on

      Hey Fabrizio,

      This is definitely doable, but will depend on your database type. If you’ve used the default SQLite database then you’ll want to lookup some tutorials on how to connect to a SQLite database with PHP (the best route would be to use PDO here when you connect and query). Otherwise if you’ve used MySQL then you’ll want to connect to that database and modify the channels there.

      I don’t know the table structure of Murmur off-hand so I can’t tell you the exact queries to run or give you a code snippet. I may want to do this myself so perhaps I’ll write another tutorial on how to do this for users that are interested. If I do I’ll be sure to post back here and give you a link to that tutorial with code snippets for you to use.

      Reply
      • Fabrizio Bartolomucci on

        For the time being I tried to manually add a channel by means phpLiteAdmin. Yet it id not show on my Mumble application for the server, hinting to need of doing something else over adding a new row in the channel table. Is there someone familiar with the Murmur DB organization to help me? Once a thing works manually, it is usually just an issue of time before it is done programmatically…

        Reply
        • Jeff Hays on

          This is rather tough to find explicit documentation on, but I’d expect a refresh method somewhere, but I can’t seem to find it in the Ice docs:

          http://mumble.sourceforge.net/slice/1.3.0/_sindex.html

          I’d bet money on this working immediately without the need to refresh the server process if you used the Ice method addChannel() instead of adding the row in the table manually:

          http://mumble.sourceforge.net/slice/1.3.0/Murmur/Server.html#addChannel

          Reply
          • Fabrizio Bartolomucci on

            Ok, ICE is what I seem to miss. How do I install it or confirm it is installed? A next question would be how to process an action of ICE. Once I know hat it is and have it on my system.

          • Fabrizio Bartolomucci on

            I should have installed ICE, I already perused that page. In fact that is the result of the nets operation:
            netstat -apn | grep 6502
            tcp 0 0 127.0.0.1:6502 0.0.0.0:* LISTEN
            It is phpMumbleAdmin and MumPI to complain (the latter even produces a white page). How may I know better if ICE is correctly installed and working to be possibly used?

          • Fabrizio Bartolomucci on

            I installed ICE and in fact I may include the library from Python. Now I am just short of a method to create a new channel, possibly in python where I now the library is reachable. Can you help me?

          • Fabrizio Bartolomucci on

            The point is that I just need a couple of lines to create and delete a murmur channel by its name. I found:
            #!/usr/bin/python
            import Ice
            Ice.loadSlice(“/usr/local/murmur/ice/Murmur.ice”)
            import Murmur

            # Init ice
            comm = Ice.initialize()
            But it was not able to load the Murmur.ice file, ether if I entered it with its plain name or with its entire path as in this case. First of all, how do I pass Murmur.ice to it and then what method should I call on Ice to create and delete a murmur channel?

        • Jeff Hays on

          I understand what you’re trying to do, but I don’t have an answer for you as I’ve never done this myself. I’m just trying to pull up resources for you to help you find what you’re looking for.

          I’d probably start by checking to see that your file /usr/local/murmur/ice/Murmur.ice is readable by whatever process you’re trying to access it from (python or otherwise). You may need to change the permissions to 777 temporarily to see if this reads with the .loadSlice method, and if it does, try to figure out what ownership/permission combination will allow you to read that file without it being 777.

          As for the ICE methods to use to create, delete, and list channels, you’ll have to just try some of the methods in the docs that I linked to and print out the ICE object to see if it sheds some light on what methods you should be using.

          Again, I’ve never done this before so I won’t be able to provide code samples in your preferred language on how to do this, but it should be possible in theory since some of the other interfaces out there that use ICE allow you to do this.

          Reply
          • Fabrizio Bartolomucci on

            I set it to 777 but I get error:
            /usr/local/murmur/ice/Murmur.ice:9: error: Can’t open include file “Ice/SliceChecksumDict.ice”
            #include
            1 error in preprocessor.
            Traceback (most recent call last):
            File “ice.py”, line 3, in
            Ice.loadSlice(“/usr/local/murmur/ice/Murmur.ice”)
            RuntimeError: Slice preprocessing failed for `/usr/local/murmur/ice/Murmur.ice’

          • Fabrizio Bartolomucci on

            Unfortunately there is no such a file in my server. Where may I get it?

          • Fabrizio Bartolomucci on

            No way:
            git clone git@github.com:alfg/murmur-rest.git
            Cloning into ‘murmur-rest’…
            The authenticity of host ‘github.com (192.30.252.129)’ can’t be established.
            RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
            Are you sure you want to continue connecting (yes/no)? yes
            Warning: Permanently added ‘github.com,192.30.252.129’ (RSA) to the list of known hosts.
            Permission denied (publickey).
            fatal: Could not read from remote repository.

            Please make sure you have the correct access rights
            and the repository exists.

  4. Brendan on

    For the useradd line, I had to add “-g murmur” because the group exists before that point:

    $ groupadd -r murmur
    $ useradd -s /sbin/nologin murmur
    useradd: group murmur exists – if you want to add this user to that group, use -g.
    $ useradd -g murmur -s /sbin/nologin murmur
    $

    Reply
  5. Fabrizio Bartolomucci on

    At any rate I could download it with wget. I now have it on my server. Yet when I execute:
    python runserver.py
    I get:
    Traceback (most recent call last):
    File “runserver.py”, line 1, in
    from app import app
    File “/var/www/html/iPhone/inarrivo/python/murmur-rest/murmur-rest-master/app/__init__.py”, line 13, in
    from flask import Flask
    ImportError: No module named flask

    Also it is not clear why I should set up a virtual server just to create new channels on murmur.

    Reply
  6. Taylor on

    So how would one reset the superuser password with this setup? The standard wiki entries for murmur aren’t working with this setup.

    Reply
    • Jeff Hays on

      Hey Taylor,

      At the bottom of my tutorial I explain how you get the SuperUser password. Search through this page for “superuser” and you’ll see it mentioned towards the bottom of the instructions.

      Reply
        • Ben on

          An answer here would be great, the first time I ran murmur I accidentally had the log file line commented out so I did not get a SU password.

          Reply
          • Jeff Hays on

            Try deleting the .sqlite file and starting the binary again with /usr/local/murmur/murmur.x86 -ini /etc/murmur.ini >> ~/firstrun.log which should spit out the log (with SuperUser creds) inside firstrun.log inside your user’s home directory. Let me know if that doesn’t work for you – it should be as easy as “reinstalling mumble” which in this case will be just deleting the sqlite database.

  7. Fabrizio Bartolomucci on

    I found quite a fw information on this murmur bug, but none regarding the fix for python. As for php it would be enough to specify -i to include the directory where to find SliceChecksumDict.ice that in my case is in:
    /usr/share/Ice-3.5.1/slice/Ice/SliceChecksumDict.ice
    /usr/lib64/python2.7/site-packages/Ice/Ice_SliceChecksumDict_ice.py
    /usr/lib64/python2.7/site-packages/Ice/Ice_SliceChecksumDict_ice.pyc
    /usr/lib64/python2.7/site-packages/Ice/Ice_SliceChecksumDict_ice.pyo
    How may I specify the directory where to look for this file in the murmur.ini file? I tried putting the full path but I got error:
    File “ice.py”, line 3, in
    Ice.loadSlice(“/usr/local/murmur/ice/Murmur.ice”)
    File “/usr/local/murmur/ice/Murmur.ice”, line 3
    import _usr_share_Ice-3.5.1_slice_Ice_SliceChecksumDict_ice
    ^
    SyntaxError: invalid syntax

    Reply
    • Jeff Hays on

      You can set your import path programmatically in Python. Something like this (where the directory is the path to wherever those files exist)

      import sys
      sys.path.append("/path/to/import/directory")

      Reply
      • Fabrizio Bartolomucci on

        My problem is that what is not able to include the file is not the python script, but rather murmur.ini the syntax of which is much more obscure than that of Python. Any idea about how the set the path in murmur.ini?

        Reply
  8. Richard on

    First I would like to say fantastic post. This work well on my test server at home. However I have a V-Server and this is where I am having the problem. I had to reboot my server and Murmur did not startup so I did the following.
    systemctl start mumble, and I get the error,
    Job for mumble.service failed. See ‘systemctl status mumble.service’ and ‘journalctl -xn’ for details.

    # journalctl -xn
    Oct 24 17:39:30 catbert.redtalkers.net pure-ftpd[28687]: (__cpanel__service__auth__ftpd__Len8ud82Bzaf78ZhAk93xU8yU7JZNKy1AInGkI616Cx1sNDYiFVmbNEPi6CXczM5@127.0.0.1) [INFO] Logout.
    Oct 24 17:40:01 catbert.redtalkers.net CROND[28744]: (root) CMD (/usr/local/cpanel/3rdparty/attracta/scripts/daily_jobs.pl > /dev/null 2>&1)
    Oct 24 17:40:01 catbert.redtalkers.net CROND[28746]: (root) CMD (/usr/lib64/sa/sa1 1 1)
    Oct 24 17:40:01 catbert.redtalkers.net CROND[28747]: (munin) CMD (/usr/local/cpanel/3rdparty/perl/514/bin/munin-cron)
    Oct 24 17:40:01 catbert.redtalkers.net CROND[28748]: (rednews) CMD (/bin/wget -O /dev/null “http://redtalkers.org/index.php?option=com_easyblog&task=cron”)
    Oct 24 17:40:01 catbert.redtalkers.net CROND[28749]: (root) CMD (/usr/local/cpanel/bin/dcpumon >/dev/null 2>&1)
    Oct 24 17:41:01 catbert.redtalkers.net CROND[28782]: (root) CMD (/usr/local/cpanel/3rdparty/attracta/scripts/daily_jobs.pl > /dev/null 2>&1)
    Oct 24 17:42:01 catbert.redtalkers.net CROND[28790]: (root) CMD (/usr/local/cpanel/3rdparty/attracta/scripts/daily_jobs.pl > /dev/null 2>&1)
    Oct 24 17:43:01 catbert.redtalkers.net CROND[28795]: (root) CMD (/usr/local/cpanel/3rdparty/attracta/scripts/daily_jobs.pl > /dev/null 2>&1)
    Oct 24 17:43:01 catbert.redtalkers.net CROND[28796]: (root) CMD (/usr/local/cpanel/whostmgr/bin/dnsqueue > /dev/null 2>&1)

    systemctl status mumble.service
    mumble.service – Mumble Server (Murmur)
    Loaded: loaded (/etc/systemd/system/mumble.service; enabled)
    Active: failed (Result: timeout) since Sat 2015-10-24 17:41:17 UTC; 3min 35s ago
    Process: 28729 ExecStart=/usr/local/murmur/murmur.x86 -ini /etc/murmur.ini (code=exited, status=0/SUCCESS)

    Any help would be great. As we are really in need of this for our clients.

    Reply
  9. Richard on

    Jeff…

    Next battle I am having and this is for the master(wife). We run 2 group homes for TBI( Traumatic brain Injury) and Quadriplegics. we do work closely with Craig hospital here in Denver Colorado. I am trying hard with VERY little luck to get Ice and phpMumbleAdmin.

    I use WHM/Cpanel – EasyApache 4
    So PhP 5.6
    Ice 3.6.1
    Murmur 1.2.8
    web address: http://mumbleadmin.redtalkers.net/
    What we are trying to do is setup 4 murmur servers for her and 4 for me. Getting any help on this Sir would be greatly excepted.
    Thank you in advance.

    Reply
  10. Tyler Wilson on

    Unless you want to run the mkdir /var/run/murmur every time you boot you will need an entry in /usr/lib/tmpfiles.d/murmur.conf

    [root@m ~]# cat /usr/lib/tmpfiles.d/murmur.conf
    d /run/murmur 0700 murmur murmur – –

    Should do fine

    Reply
    • Jeff Hays on

      Hmm… I respectfully disagree. My step to create the /var/run/murmur directory was not in any of the systemd scripts or anything that runs on boot. Perhaps you misread the instructions – they were in a completely different code block and were intended to be ran once during this tutorial, not every time on boot.

      Reply

Leave a Reply

Your email address will not be published. Required fields are marked *