Статья годичной давности, но недавнее знакомство показало, что основа осталась прежней.
Как упростить управление хостингом? Даже при тщательно спланированой архитектуре и выборе компонентов будущей системы, без некоторой автоматизации процесса потребуется очень много времени, чтобы решить все возможные задачи.
Началом проекта можно считать ноябрь 2003 года, когда Флориан Липперт (Florian Lippert) стал администрировать почтовый сервер. Скоро он заметил, что добавлять новых пользователей, субдомены не совсем удобно, некоторые изменения заносились в конфигурационный файл и требовался перезапуск сервера. Осенью 2004 года были сформулированы требования к будущей системе:
- по возможности она не должна создавать локальных (системных) пользователей;
- позволять управлять почтовыми адресами и пересылкой писем;
- создавать новые базы в MySQL;
- управлять субдоменами для клиентов;
И в последствии было добавлено еще одно требование создание новых зон в BIND.
Результат (SysCP) под лицензией GNU GPL был представлен общественности 15 июня 2004. Сама система написана на PHP, для хранения информации использован MySQL. Поддерживаются следующие сервисы:
- веб-сервер Apache 1.3 и 2.x с поддержкой PHP 4/5 (ранее рекомендовался только 1.3 и PHP 4, PHP должен поддерживать командный интерфейс CLI), Lighttpd;
- MTA Postfix, Exim4;
- POP3/IMAP – Courier, Dovecot;
- ftp-сервер – ProFTPd, PureFTP
- аутентификация Cyrus-sasl;
- статистика – Webalizer, Awstats.
Опционально могут быть установлены BIND (может быть заменен на PowerDNS), Maildrop, ClamAV и Spamassassin, PHPmyAdmin и веб-интерфейс к почте вроде SquirrelMail. Используя клиентскую часть ПО можно: управлять почтовыми учетными записями с возможностю Catch-all (то есть ловить все письма идущие в домен), управлять перенаправлением почты, субдоменами, паролями, базой данных, установкой паролей на каталоги, а также доступом к webmail и PHPmyAdmin. Административный интерфейс, с позволяет создавать новых пользователей, задавать доступные ресурсы и лимиты, поддерживается работа с реселлерами с заданием зоны видимости каждого. Интерфейс переведен на 15 языков среди которых есть и русский. Перед установкой можно ознакомиться с полнофункциональной демоверсией SysCP.
Поддерживаются:
В составе группы разработчиков есть мантайнер пакетов FreeBSD, поэтому в систему портов включен порт syscp, который можно можно найти в sysutil/syscp. Пакеты для Debian подходят и к Ubuntu. Актуальной на момент написания статьи была версия 1.2.19, поэтому все сказаное относится к ней. В нестабильной версии 1.3 установка несколько отличается, хотя процесс установки SysCP как вы увидите не самый тяжелый. Cкачиваем файл:
$ wget -c http://debian.syscp.de/etch/syscp_1.2.x_all.deb
Смотрим зависимости.
$ sudo dpkg-deb –info ./syscp_1.2.x_x.deb
Устанавливаем все необходимое.
$ sudo apt-get apache2-mpm-prefork libapache2-mod-php5 mysql-server postfix-mysql proftpd-mysql libsasl2 courier-authlib courier-authlib-mysql courier-base courier-pop-ssl bind9 php5 php5-mysql php5-cli webalizer
Создаем символическую ссылку с каталога /etc/apache2/mods-available в mods-enabled, чтобы активировать поддержку PHP в веб-сервере.
$ sudo a2enmod php5
This module is already enabled!
Установка с исходных текстов также не вызовет трудностей:
$ cd /var/www
$ sudo tar -xzvf syscp-1.2.x.tar.gz
$ chown www-data:www-data syscp/lib/userdata.inc.php
$ chmod 777 syscp/lib/userdata.inc.php
Теперь заходим по адресу http://server_name/syscp и нажимаем ссылку в строке «You have to configure SysCP first!». В появившемся окне выбираем язык интерфейса которым будут выводиться подсказки при инсталляции, в раскрывающемся списке присутствует только английский, французкий и немецкий.
Ниже вводим параметры для доступа к MySQL: узел, имя базы данных, пользователя для доступа к БД. В поле «Administrator Account» указываем пароль администратора, в целях безопасности можно указать учетную запись отличную от admin. И в «Server settings» указываем FQDN сервера и версию Apache. После нажатия на ОК будут проверены введенные данные и созданы все необходимые для работы таблицы, введенная информация будет сохранена в файле /var/www/syscp/lib/userdata.inc.php. В случае ошибки некорректное поле будет отмечено красным цветом. По окончании установки можно зарегистрироваться в системе с администраторскими правами, здесь уже можно выбрать русский язык интерфейса. Хотя делать это еще рано. Сначала необходимо указать Postfix, Courier и ProFTPd чтобы они получали настройки из MySQL и настроить Apache для работы с виртуальными серверами. Во вкладке «Сервер – Настройки служб» даны подсказки команд для Debian и SUSE , причем в них уже выставлены все необходимые имена применительно к установленной системе, поэтому часто их можно просто скопировать.
Некоторые пути предлагаемые скриптом можно изменить зайдя в «Настройки сервера». По умолчанию считается, что все сервисы размещены на одном компьютере, но ничего не мешает перенести почтовый сервер на другую машину, забирая данные из базы под управлением MySQL по сети.
Все указанные настройки не догма, можно добавить и другие параметры, не нарушающие общий принцип настроек. Комментировать их не буду, в журнале уже были статьи по этим серверам. Строку MYSQL_PASSWORD необходимо заменить на пароль пользователя syscp, который является владельцем базы данных. Начнем с Apache. Создаем и подключаем файл, в который будет заноситься информация о виртуальных узлах.
$ sudo echo -e «\nInclude /etc/apache2/sites-available/99_syscp_vhosts.conf» >> /etc/apache2/httpd.conf
$ sudo touch /etc/apache2/sites-available/99_syscp_vhosts.conf
И каталог для виртуальных узлов.
$ sudo mkdir -p /var/kunden/webs/
Перезапускаем веб-сервер.
$ sudo /etc/init.d/apache2 restart
Теперь настоим BIND, чтобы он добавлял необходимые записи автоматически. Создаем файл для записи виртуальных зон.
$ sudo touch /etc/bind/syscp_bind.conf
Подключаем его в основном файле.
$ sudo echo «include \»/etc/bind/syscp_bind.conf\»;» >> /etc/bind/named.conf
Добавляем в файл /etc/bind/default.zone, информацию о своем компьютере (вместо 127.0.0.1 указываем рабочий адрес):
$TTL 1W
@ IN SOA ns root (
2004060501 ; serial
8H ; refresh
2H ; retry
1W ; expiry
11h) ; minimum
IN NS ns
IN NS ns1.provider.com.
IN NS ns2.provider.com.
IN MX 10 mail
IN A 127.0.0.1
IN MX 10 mail
* IN A 127.0.0.1
IN MX 10 mail
ns IN A 127.0.0.1
mail IN A 127.0.0.1
IN MX 10 mail
И перезапускаем BIND.
$ sudo /etc/init.d/bind9 restart
Настройки ProFTPd вообщем то стандартны. Сначала в /etc/proftpd/modules.conf указываем необходимые для работы модули:
ModulePath /usr/lib/proftpd
ModuleControlsACLs insmod,rmmod allow user root
ModuleControlsACLs lsmod allow user *
#LoadModule mod_ctrls_admin.c
LoadModule mod_tls.c
LoadModule mod_sql.c
LoadModule mod_ldap.c
LoadModule mod_sql_mysql.c
LoadModule mod_quotatab.c
LoadModule mod_quotatab_file.c
LoadModule mod_quotatab_ldap.c
LoadModule mod_quotatab_sql.c
LoadModule mod_radius.c
LoadModule mod_wrap.c
LoadModule mod_rewrite.c
LoadModule mod_ifsession.c
<IfModule mod_delay.c>
DelayEngine off
</IfModule>
И в основном конфигурационном файле /etc/proftpd/proftpd.conf, особое внимание обращаем на параметры доступа к MySQL, остальные параметры стандартны:
Include /etc/proftpd/modules.conf
ServerName «grinder.com FTP Server»
ServerType standalone
DeferWelcome off
MultilineRFC2228 on
DefaultServer on
ShowSymlinks on
AllowOverwrite on
TimeoutNoTransfer 600
TimeoutStalled 600
TimeoutIdle 1200
DisplayLogin welcome.msg
DisplayFirstChdir .message
ListOptions «-l»
DenyFilter \*.*/
Port 21
MaxInstances 30
User nobody
Group nogroup
<Directory /*>
Umask 022 022
AllowOverwrite on
</Directory>
DefaultRoot ~
RequireValidShell off
SQLAuthTypes Crypt Plaintext
SQLAuthenticate users* groups*
# здесь меняем MYSQL_PASSWORD на пароль
SQLConnectInfo syscp@127.0.0.1 syscp MYSQL_PASSWORD
SQLUserInfo ftp_users username password uid gid homedir shell
SQLGroupInfo ftp_groups groupname gid members
SQLUserWhereClause «login_enabled = ‘y’»
SQLLog PASS login
SQLNamedQuery login UPDATE «last_login=now(), login_count=login_count+1 WHERE username=’%u’» ftp_users
SQLLog RETR download
SQLNamedQuery download UPDATE «down_count=down_count+1, down_bytes=down_bytes+%b WHERE username=’%u’» ftp_users
SQLLog STOR upload
SQLNamedQuery upload UPDATE «up_count=up_count+1, up_bytes=up_bytes+%b WHERE username=’%u’» ftp_users
И перезапускаем сервер.
$ sudo /etc/init.d/proftpd restart
Теперь приступаем к настройке почтовой подсистемы. Создадим необходимые для работы Postfix каталоги и новую учетную запись.
$ sudo mkdir -p /etc/postfix/sasl
$ sudo mkdir -p /var/spool/postfix/etc/pam.d
$ sudo mkdir -p /var/spool/postfix/var/run/mysqld
$ sudo groupadd -g 2000 vmail
$ sudo useradd -u 2000 -g vmail vmail
$ sudo mkdir -p /var/kunden/mail/
$ sudo chown -R vmail:vmail /var/kunden/mail/
В главный конфигурационный файл /etc/postfix/main.cf вносим информацию о подключении виртуальных почтовых ящиков:
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
myhostname = grinder.com
mydomain = grinder.com
myorigin = $myhostname
mydestination = $myhostname $mydomain localhost localhost.$mydomain
mynetworks = 127.0.0.0/8
alias_maps = $alias_database
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
virtual_mailbox_base = /var/kunden/mail/
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailbox_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_mailbox_domains.cf
virtual_alias_domains =
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_alias_maps.cf
virtual_uid_maps = static:2000
virtual_gid_maps = static:2000
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
Остальные параметры оставлены в значении по умолчанию, напомню, что просмотреть все настройки можно использовав команду postconf. Ничто не мешает добавить TLS и прочие возможности. И далее создаем конфигурационные файлы на которые есть ссылки в main.cf.
$ sudo cat > /etc/postfix/mysql-virtual_alias_maps.cf
user = syscp
# меняем MYSQL_PASSWORD на пароль
password = MYSQL_PASSWORD
dbname = syscp
table = mail_virtual
select_field = destination
where_field = email
additional_conditions = and destination <> » and destination <> ‘ ‘
hosts = 127.0.0.1
Следующий.
$ sudo cat > /etc/postfix/mysql-virtual_mailbox_domains.cf
user = syscp
# меняем MYSQL_PASSWORD на пароль
password = MYSQL_PASSWORD
dbname = syscp
table = panel_domains
select_field = domain
where_field = domain
additional_conditions = and isemaildomain = ‘1′
hosts = 127.0.0.1
$ sudo cat > /etc/postfix/mysql-virtual_mailbox_maps.cf
user = syscp
# меняем MYSQL_PASSWORD на пароль
password = MYSQL_PASSWORD
dbname = syscp
table = mail_users
select_field = maildir
where_field = email
hosts = 127.0.0.1
Настройка связки с Cyrus SASL.
$ sudo cat > /etc/postfix/sasl/smtpd.conf
pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: plain login cram-md5 digest-md5
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: syscp
# меняем MYSQL_PASSWORD на пароль
sql_passwd: MYSQL_PASSWORD
sql_database: syscp
sql_select: select password from mail_users where username=’%u@%r’
И перезапускаем Postfix.
$ sudo /etc/init.d/postfix restart
Для настройки Courier в каталоге /etc/courier/ необходимо отредактировать два файла. Основные настройки работы демона указываются в файле authdaemonrc:
authmodulelist=»authmysql»
authmodulelistorig=»authcustom authcram authuserdb authldap authmysql authpam»
daemons=5
version=»"
authdaemonvar=/var/run/courier/authdaemon
# и на всякий случай? Потом можно будет перевести в 0
DEBUG_LOGIN=1
И создаем файл /etc/courier/authmysqlrc, в котором описываются параметры подключения к MySQL:
MYSQL_SERVER 127.0.0.1
MYSQL_USERNAME syscp
# меняем MYSQL_PASSWORD на пароль
MYSQL_PASSWORD MYSQL_PASSWORD
MYSQL_PORT 0
MYSQL_DATABASE syscp
MYSQL_USER_TABLE mail_users
MYSQL_CRYPT_PWFIELD password_enc
MYSQL_UID_FIELD uid
MYSQL_GID_FIELD gid
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD homedir
MYSQL_MAILDIR_FIELD maildir
Перезапускаем демоны Courier.
$ sudo /etc/init.d/courier-authdaemon restart
$ sudo /etc/init.d/courier-pop restart
Последним шагом необходимо обеспечить периодическое обновление конфигурации серверов. Для этих целей используется скрипт cronscript.php запускаемый с помощью сrond.
$ sudo echo «*/5 * * * * root /usr/bin/php -q /var/www/syscp/scripts/cronscript.php » >> /etc/crontab
$ sudo /etc/init.d/cron restart
Теперь можно воспользоваться веб-интерфейсом. На первой странице показана статистика по использованным ресурсам, информация по системе. Выбрав ссылку внизу «Запросить через веб-сервис» можно уточнить наличие новой версии на сайте проекта. Прежде чем начинать создавать новых пользователй следует указать IP-адреса сервера с которых будут приниматься запросы, для этого выбираем «Сервер – IP-адреса и порты» и нажав «Добавить комбинацию IP/порт» вводим данные в доступные поля. Перейдя по ссылке «Клиенты» можно раздавать пространство на виртуальном сервере. В появившемся поле следует заполнить персональную информацию о клиенте и указать доступные ресурсы, создание поддомена, пароль и прочее. К сожалению если ввести имя на русском при проследующем просмотре в основном окне разобрать что-либо будет невозможно, поэтому лучше использовать транслит. После нажатия на кнопку «Сохранить», через некоторое время будут созданы все необходимые подкаталоги для FTP, HTTP серверов и добавлены необходимые записи в конфигурационные файлы. Все имеющиеся поддомены можно просмотреть и при необходимости отредактировать/добавить перейдя по ссылке «Домены». Как уже говорилось раздачу места можно разрешить другим администраторам или реселлерам, для этого следует зайти по ссылке «Админы» и установить разрешения и объем/количество ресурсов которыми он может распоряжаться. Доступные настройки не очень отличаются от пользовательских, но Админы сами могут раздавать ресурсы.
Не смотря на кажущуюся трудность, настройка SysCP не сильно отличается от установки стандартной связки серверов. Но если необходимо часто создавать виртуальные серверы и почтовые аккаунты, с установкой различных ограничений и работой с DNS, решения вроде SysCP на порядок упростят вам жизнь.