Pull to refresh

Установка Asterisk в контейнере OpenVZ Ubuntu 10.04.1 LTS на хосте Debian GNU/Linux 5.0

Reading time10 min
Views8.5K
image

Исходные данные:


  • Asterisk 1.6.2 — из родного репозитория Ubuntu
  • Ubuntu 10.04.1 LTS — контейнер в минимальной установке (x64bit)
  • Хостовая система для OpenVZ — Debian GNU/Linux 5.0 (Lenny) 2.6.26-2-openvz-amd64 — ядро из родного репозитория.

Устанавливаем и настраиваем OpenVZ хост. Особенности настройки OpenVZ-хоста тут рассматриваться не будут.
Считаем, что у нас он корректно настроен, включая NAT для гостевых машин и проброс необходимых для сервера портов.

Качаем шаблон для гостевой ОС


cd /var/lib/vz/template/cache
wget download.openvz.org/template/precreated/contrib/ubuntu-10.04-minimal_10.04_amd64.tar.gz


Создаем и настраиваем контейнер


sudo vzctl create 101 --ostemplate ubuntu-10.04-minimal_10.04_amd64
Создали контейнер с ID = 101 из нашего шаблона
sudo vzctl set 101 --name voip --save
задали имя контейнера
sudo vzctl set 101 --hostname voip.hurnet.ru --save
задали имя хоста для контейнера
sudo vzctl set 101 --nameserver 8.8.8.8 --save
задали DNS для контейнера
sudo vzctl set 101 --description 'Asterisk VoIP server' --save
описание контейнера
sudo vzctl set 101 --ipadd 192.168.xxx.xxx --save
Задали адрес сетевого интерфейса
sudo vzctl set 101 --cpulimit 60 --save
задаем лимит на использование процессора
sudo vzctl set 101 --diskspace 9000000:10000000 --save
квота дискового пространства 9Гб (временное превышение до 10Гб)
sudo vzctl set 101 --quotatime 6000 --save
время на которое можно превышать квоту
sudo vzctl set 101 --privvmpages 750M:768M --save
Доступное кол-во памяти
sudo vzctl set 101 --vmguarpages 250M:256M --save
Гарантированое кол-во памяти
sudo vzctl start 101
стартуем
sudo vzctl enter 101
заходим в контейнер
apt-get update
apt-get upgrade

обновляемся
sudo vzctl restart 101
(выполняем на хостовой машине, и заходим обратно в контейнер)
sudo apt-get install asterisk

Ставим asterisk


Нужные зависимости он сам потянет за собой. В процессе установки будут спрашивать телефонный
код региона (для России это 7 ), и пару вопросов по поводу grub (не актуальны, т.к. ядро и загрузчик из контейнера изменить нельзя) Будут попытки это все поставить с кучей ошибок — не обращайте внимания, терпеливо дождитесь окончания установки.

Качаем русские звуковые фразы от сюда http://ivrvoice.ru/downloader
Берем самый свежий архив. В моем случае это asterisk-​sounds-​ru-​gsm-​2010-​04-​28.​tar.​gz
cd /usr/share/asterisk/sounds/
wget ivrvoice.ru/downloader/download/file/11
tar xvfz 11
rm 11


Начинаем настройку asterisk


Идем в /etc/asterisk/sip.conf находим, раскоментриуем и исправляем опцию
language=ru
В секции [general] раскоментируем опцию allowguest=no
В конце файла создаем новую секцию
[200] ; Test user
type=friend
host=dynamic
username=200
secret=123
nat=no
canreinvite=no
context=office
callerid=”testuser″ <200>
allow=gsm
allow=ulaw
allow=alaw

Этим мы создали одного тестового пользователя. с подробным синтаксисом и описанием необходимо ознакомится в документации.

Дальше создаем экстеншены в конце файла /etc/asterisk/extensions.conf
[office]
exten => 200,1, Macro(stdexten,200,SIP/200)
exten => testuser, 1, Goto(200|1)
include => demo

[macro-stdexten]
exten => s, 1, Dial (${ARG2},20,t [4] )
exten => s, 2, Goto(s-$(DIALSTATUS),1)
exten => s-NOANSWER, 1, Voicemail(u${ARG1})
exten => s-NOANSWER, 2, (Goto(default,s,1))
exten => s-BUSY, 1, Voicemail(b,${ARG1})
exten => s-BUSY, 2, (Goto(default,s,1))
exten => _s-., 1, Goto(s-NOANSWER)
exten => a, 1, VoiceMailMain(${ARG1})


Настроим человеческую интеграцию в систему asterisk-а


Создадим группу и юзера от которой будет работать asterisk в системе:
addgroup --gid 109 asterisk
adduser --home /var/lib/asterisk --shel /bin/false --uid 104 --gid 109 --disabled-login asterisk
adduser asterisk dialout
adduser asterisk audio

Должно получиться вроде такого:
# cat /etc/group |grep asterisk
dialout:x:20:asterisk
audio:x:29:asterisk
asterisk:x:109:
# cat /etc/passwd |grep asterisk
asterisk:x:104:109:Asterisk PBX daemon,,,:/var/lib/asterisk:/bin/false


Выставляем необходимые права на файлы
chown -R asterisk. /etc/asterisk
chown -R asterisk. /var/{lib,log,spool}/asterisk
chown -R asterisk. /usr/share/asterisk/
mkdir /var/run/asterisk
chown -R asterisk. /var/run/asterisk/


Создаем стартовый скрипт:
nano /etc/init.d/asterisk со следующим содержанием:

#! /bin/sh
#
# asterisk start the asterisk PBX
# © Mark Purcell <msp@debian.org>
# © Tzafrir Cohen <tzafrir.cohen@xorcom.com>
# © Faidon Liambotis <paravoid@debian.org>
 
#   This package is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
# Based on:
#
# skeleton example file to build /etc/init.d/ scripts.
# This file should be used to construct scripts for /etc/init.d.
#
# Written by Miquel van Smoorenburg <miquels@cistron.nl>.
# Modified for Debian GNU/Linux
# by Ian Murdock <imurdock@gnu.ai.mit.edu>.
#
# Version: @(#)skeleton  1.9  26-Feb-2001  miquels@cistron.nl
#
 
### BEGIN INIT INFO
# Provides:          asterisk
# Required-Start:    $local_fs zaptel
# Required-Stop:     $local_fs
# Should-Start:      
# Should-Stop:       
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Asterisk PBX
# Description:       Controls the Asterisk PBX
### END INIT INFO
 
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=asterisk
USER=$NAME
GROUP=$USER
DAEMON=/usr/sbin/$NAME
DESC="Asterisk PBX"
PIDFILE="/var/run/asterisk/asterisk.pid"
ASTSAFE_PIDFILE="/var/run/asterisk/asterisk_safe.pid"
PIDFILE_DIR=`dirname $PIDFILE`
UMASK=007 # by default
#MAXFILES=1024 # (the system default)
 
# by default: use real-time priority
PARAMS=""
CHDIR_PARM=""
AST_REALTIME="yes"
RUNASTERISK="yes"
AST_DUMPCORE="no"
AST_DUMPCORE_DIR="/var/spool/asterisk" # only used if AST_DUMPCORE != no
# core_pattern. See: http://lxr.linux.no/source/Documentation/sysctl/kernel.txt
#CORE_PATTERN=
if [ -r /etc/default/$NAME ]then . /etc/default/$NAMEfi
 
if [ "$RUNASTERISK" !"yes" ];then
echo "Asterisk not yet configured. Edit /etc/default/asterisk first."
exit 0
fi
 
if [ "$AST_REALTIME" !"no" ]
then
  PARAMS="$PARAMS -p"
fi
 
if [ "$AST_DUMPCORE" !"no" ]
then
PARAMS="$PARAMS -g"
if [ "$CORE_PATTERN" !'' ]
then
echo "$CORE_PATTERN" >/proc/sys/kernel/core_pattern
fi
if [ -d "$AST_DUMPCORE_DIR" ]
then
CHDIR_PARM="--chdir $AST_DUMPCORE_DIR"
fi
fi
 
if [ "x$USER" = "x" ]
then
  echo "Error: empty USER name"
  exit 1
fi
if [ `id -u "$USER"` = 0 ]
then
  echo "Starting as root not supported."
  exit 1
fi
PARAMS="$PARAMS -U $USER"
 
if [ "x$AST_DEBUG_PARAMS" = x ] 
then
  AST_DEBUG_PARAMS=-cvvvvvddddd
fi
if [ "$RUNASTSAFE" = "yes" ];then
# The value of WRAPPER_DAEMON in can be set in /etc/default/asterisk
WRAPPER_DAEMON=${WRAPPER_DAEMON:-/usr/sbin/safe_asterisk}
REALDAEMON="$WRAPPER_DAEMON"
else
REALDAEMON="$DAEMON"
fi
 
test -x $DAEMON || exit 0
 
if [ ! -d "$PIDFILE_DIR" ];then
mkdir "$PIDFILE_DIR"
chown $USER:$GROUP "$PIDFILE_DIR"
fi
 
set -e
 
if [ "$UMASK" !'' ]
then
umask $UMASK
fi
 
# allow changing the per-process open files limit:
if [ "$MAXFILES" !'' ]
then
ulimit -n $MAXFILES
fi
 
status() {
plist=`ps ax | awk "{ if (\\$5 == \"$DAEMON\") print \\$1 }"`
if [ "$plist" = "" ]then
echo "$DESC is stopped"
return 1
else
echo "$DESC is running: $plist"
return 0
fi
}
 
asterisk_rx() {
if ! status >/dev/null; then return 0fi
 
# if $HOME is set, asterisk -rx writes a .asterisk_history there
(
unset HOME
 
$DAEMON -rx "$1"
)
}
 
case "$1" in
  debug)
# we add too many special parameters that I don't want to skip
# accidentally. I'm afraid that skipping -U once may cause
# confusing results. I also want to maintain the user's choice
# of -p
echo "Debugging $DESC: "
$DAEMON $PARAMS $AST_DEBUG_PARAMS
exit 0
;;
  start)
if status > /dev/null; then
echo "$DESC is already running. Use restart."
exit 0
fi
echo -n "Starting $DESC: "
if [ "$RUNASTSAFE" !"yes" ];then
# TODO: what if we cought the wrapper just as its asterisk
# was killed? status should check for the wrapper if we're in
# "safe mode"
if status > /dev/null; then
echo "$DESC is already running. Use restart."
exit 0
fi
start-stop-daemon --start --group $GROUP --pidfile "$PIDFILE" \
$CHDIR_PARM \
--exec $REALDAEMON -- $PARAMS
else
start-stop-daemon --start --group $GROUP \
--background --make-pidfile \
$CHDIR_PARM --pidfile "$ASTSAFE_PIDFILE" \
--exec $REALDAEMON -- $PARAMS
fi
 
 
echo "$NAME."
;;
  stop)
echo -n "Stopping $DESC$NAME"
# Try gracefully.
# this may hang in some cases. Specifically, when the asterisk
# processes is stopped. No bother to worry about cleanup: 
# it will either fail or die when asterisk dies.
( asterisk_rx 'stop now' > /dev/null 2>&1 & ) &
if [ "$RUNASTSAFE" = "yes" ];then
start-stop-daemon --stop --quiet --oknodo \
  --pidfile $ASTSAFE_PIDFILE
rm -f $ASTSAFE_PIDFILE
fi
# just making sure it's really, really dead. 
# KILL is necessary just in case there's an asterisk -r in the background
start-stop-daemon --stop --quiet --oknodo --retry=0/2/TERM/2/KILL/5 --exec $DAEMON
echo "."
;;
  reload)
echo "Reloading $DESC configuration files."
asterisk_rx 'module reload'
;;
  logger-reload)
asterisk_rx 'logger reload'
;;
  extensions-reload|dialplan-reload)
echo "Reloading $DESC configuration files."
asterisk_rx 'dialplan reload'
;;
  restart-convenient)
asterisk_rx 'restart when convenient'
;;
  restart|force-reload)
$0 stop
$0 start
;;
  status)
status
exit $?
;;
  zaptel-fix)   
echo "Unloading and reloading loading Asterisk and Zaptel:"   
$0 stop   
/etc/init.d/zaptel unload   
# load modules from /etc/modules. This will break if you count on   
# discover/hotplug   
/etc/init.d/module-init-tools   
/etc/init.d/zaptel start   
$0 start   
;;   
  *)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|reload|status|debug|logger-reload|extensions-reload|restart-convenient|force-reload}" >&2
exit 1
;;
esac
 
exit 0


Даем на него правильные права
chmod 755 /etc/init.d/asterisk

Делаем запуск при старте:
update-rc.d asterisk defaults 90 10

Перезагружаем контейнер, чтобы убедиться что все стартует само:
sudo vzctl restart 101

Убеждаемся что все работает, подключившись VoIP-клиентом к:
сервер 192.168.xxx.xxx
логин: 200
пароль: 123


Делаем тестовый звонок, например, на номер 500

Радуемся.
Tags:
Hubs:
Total votes 12: ↑8 and ↓4+4
Comments4

Articles