Серверные инструкции · 12 min read · Nov 01, 2025

Идеальный сервер – CentOS 7.1 с Apache2, Postfix, Dovecot, Pure-FTPD, BIND и ISPConfig 3 - Страница 2

9 Установка Dovecot

Dovecot можно установить следующим образом:

yum -y install dovecot dovecot-mysql dovecot-pigeonhole

Создайте пустой файл dovecot-sql.conf и создайте символическую ссылку:

touch /etc/dovecot/dovecot-sql.conf  
ln -s /etc/dovecot/dovecot-sql.conf /etc/dovecot-sql.conf

Теперь создайте ссылки для автозагрузки системы и запустите Dovecot:

systemctl enable dovecot  
systemctl start dovecot

10 Установка Postfix

Postfix можно установить следующим образом:

yum -y install postfix

Затем отключите Sendmail и запустите Postfix и Mariadb (MySQL):

systemctl enable mariadb.service  
systemctl start mariadb.service
systemctl stop sendmail.service  
systemctl disable sendmail.service  
systemctl enable postfix.service  
systemctl restart postfix.service

Мы отключаем sendmail, чтобы убедиться, что он не запустится, если он установлен на вашем сервере. Поэтому сообщение об ошибке “Не удалось выполнить вызов метода: единица sendmail.service не загружена.” можно игнорировать.

11 Установка Getmail

Getmail можно установить следующим образом:

yum -y install getmail

12 Установка паролей MySQL и настройка phpMyAdmin

Установите пароли для учетной записи root MySQL:

mysql_secure_installation
[root@server1 tmp]# mysql_secure_installation  
  
  
ПРИМЕЧАНИЕ: РЕКОМЕНДУЕТСЯ ЗАПУСКАТЬ ВСЕ ЧАСТИ ЭТОГО СКРИПТА ДЛЯ ВСЕХ СЕРВЕРОВ MariaDB, ИСПОЛЬЗУЕМЫХ В ПРОИЗВОДСТВЕ! ПОЖАЛУЙСТА, ВНИМАТЕЛЬНО ПРОЧИТАЙТЕ КАЖДЫЙ ШАГ!
Чтобы войти в MariaDB и обеспечить ее безопасность, нам нужен текущий  
пароль для пользователя root. Если вы только что установили MariaDB, и  
вы еще не установили пароль root, пароль будет пустым,  
поэтому просто нажмите Enter здесь.
Введите текущий пароль для root (нажмите Enter для отсутствия):  
Хорошо, пароль успешно использован, продолжаем...
Установка пароля root гарантирует, что никто не сможет войти в учетную запись root MariaDB  
без надлежащей авторизации.  

Установить пароль root? [Y/n] <-- ENTER  
Новый пароль: <-- вашпарольrootsql  
Повторите новый пароль: <-- вашпарольrootsql  
Пароль успешно обновлен!  
Перезагрузка таблиц привилегий..  
 ... Успех!  
  
  
По умолчанию установка MariaDB имеет анонимного пользователя, позволяя любому  
войти в MariaDB, не создавая учетную запись для них. Это предназначено только для тестирования и для того, чтобы сделать установку  
немного более гладкой. Вы должны удалить их перед переходом в  
производственную среду.  
  
Удалить анонимных пользователей? [Y/n] <-- ENTER  
 ... Успех!  
  
Обычно root  
должен иметь возможность подключаться только с 'localhost'.  
Это гарантирует, что кто-то не сможет угадать  
пароль root из сети.  
  
Запретить удаленный вход root? [Y/n] <-- ENTER  
 ... Успех!  
  
По умолчанию MariaDB поставляется с базой данных с именем 'test', к которой любой может  
доступ. Это также предназначено только для тестирования и должно быть удалено  
перед переходом в производственную среду.  
  
Удалить тестовую базу данных и доступ к ней? [Y/n] <-- ENTER  
 - Удаление тестовой базы данных...  
 ... Успех!  
 - Удаление привилегий на тестовую базу данных...  
 ... Успех!  
  
Перезагрузка таблиц привилегий гарантирует, что все изменения, сделанные до сих пор,  
вступят в силу немедленно.  
  
Перезагрузить таблицы привилегий сейчас? [Y/n] <-- ENTER  
 ... Успех!  
  
Очистка...  
  
  
Все готово! Если вы завершили все вышеперечисленные шаги, ваша установка MariaDB  
теперь должна быть безопасной.  
  
Спасибо за использование MariaDB!  
  
[root@server1 tmp]#

Теперь мы настраиваем phpMyAdmin. Мы изменяем конфигурацию Apache, чтобы phpMyAdmin разрешал подключения не только с localhost (закомментировав две строки “Require ip” и добавив новую строку “Require all granted” в разделе ):

nano /etc/httpd/conf.d/phpMyAdmin.conf
# phpMyAdmin - Веб-браузер MySQL на основе php
#
# По умолчанию разрешает только localhost
#
# Но разрешение phpMyAdmin для любого другого, кроме localhost, следует считать
# опасным, если не обеспечить его безопасность с помощью SSL

Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin


   
     # Apache 2.4
     
     #  Require ip 127.0.0.1
     #  Require ip ::1  
        Require all granted
     
   
   
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   

            

Затем мы изменяем аутентификацию в phpMyAdmin с cookie на http:

nano /etc/phpMyAdmin/config.inc.php
[...]
/* Тип аутентификации */
$cfg['Servers'][$i]['auth_type'] = 'http';
[...]

Затем мы создаем ссылки для автозагрузки системы для Apache и запускаем его:

systemctl enable  httpd.service  
systemctl restart  httpd.service

Теперь вы можете направить ваш браузер на http://server1.example.com/phpmyadmin/ или http://192.168.0.100/phpmyadmin/ и войти с именем пользователя root и вашим новым паролем root MySQL.

13 Установка Amavisd-new, SpamAssassin и ClamAV

Чтобы установить amavisd-new, spamassassin и clamav, выполните следующую команду:

yum -y install amavisd-new spamassassin clamav clamav-update unzip bzip2 perl-DBD-mysql

Отредактируйте файл конфигурации freshclam /etc/freshclam.conf

nano /etc/freshclam.conf

и закомментируйте строку “Example”

[....]  
# Example  
[....]

Затем мы запускаем freshclam, amavisd и clamd.amavisd:

sa-update  
freshclam   
systemctl enable amavisd.service

14 Установка Apache2 с mod_php, mod_fcgi/PHP5, PHP-FPM и suPHP

ISPConfig 3 позволяет использовать mod_php, mod_fcgi/PHP5, cgi/PHP5 и suPHP на уровне каждого сайта.

Мы можем установить Apache2 с mod_php5, mod_fcgid и PHP5 следующим образом:

yum -y install php php-devel php-gd php-imap php-ldap php-mysql php-odbc php-pear php-xml php-xmlrpc php-pecl-apc php-mbstring php-mcrypt php-mssql php-snmp php-soap php-tidy curl curl-devel perl-libwww-perl ImageMagick libxml2 libxml2-devel mod_fcgid php-cli httpd-devel php-fpm

Затем мы открываем /etc/php.ini…

nano /etc/php.ini

… и изменяем отчет об ошибках (чтобы уведомления больше не отображались), устанавливаем часовой пояс и раскомментируем cgi.fix_pathinfo=1:

[...]
;error_reporting = E_ALL & ~E_DEPRECATED
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
[...]
; cgi.fix_pathinfo обеспечивает *реальную* поддержку PATH_INFO/PATH_TRANSLATED для CGI. PHP's
; предыдущее поведение заключалось в том, чтобы установить PATH_TRANSLATED в SCRIPT_FILENAME и не понимать,
; что такое PATH_INFO. Для получения дополнительной информации о PAppp.tldTH_INFO смотрите спецификации cgi. Установка
; этого в 1 заставит PHP CGI исправить свои пути в соответствии со спецификацией. Установка
; нуля заставляет PHP вести себя как раньше. По умолчанию это 1. Вы должны исправить свои скрипты
; чтобы использовать SCRIPT_FILENAME вместо PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=1  
[...]  
date.timezone = 'Europe/Berlin'
[...]

Затем мы устанавливаем suPHP (в репозиториях доступен пакет mod_suphp, но, к сожалению, он несовместим с ISPConfig, поэтому нам нужно собрать suPHP самостоятельно):

cd /usr/local/src  
wget http://suphp.org/download/suphp-0.7.2.tar.gz  
tar zxvf suphp-0.7.2.tar.gz

CentOS 7.1 использует apache-2.4, поэтому нам нужен патч suphp, прежде чем мы сможем скомпилировать его против Apache. Патч применяется следующим образом:

wget -O suphp.patch https://lists.marsching.com/pipermail/suphp/attachments/20130520/74f3ac02/attachment.patch  
patch -Np1 -d suphp-0.7.2 < suphp.patch  
cd suphp-0.7.2  
autoreconf -if

[root@server1 suphp-0.7.2]# autoreconf -if

libtoolize: помещает вспомогательные файлы в AC_CONFIG_AUX_DIR, config.

libtoolize: копирует файл config/ltmain.sh

libtoolize: Рассмотрите возможность добавления AC_CONFIG_MACRO_DIR([m4]) в configure.ac и

libtoolize: повторного запуска libtoolize, чтобы сохранить правильные макросы libtool в дереве.

libtoolize: Рассмотрите возможность добавления -I m4 в ACLOCAL_AMFLAGS в Makefile.am.

configure.ac:9: предупреждение: AM_INIT_AUTOMAKE: формы с двумя и тремя аргументами устарели. Для получения дополнительной информации смотрите:

configure.ac:9: http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation

configure.ac:24: установка ‘config/config.guess’

configure.ac:24: установка ‘config/config.sub’

configure.ac:9: установка ‘config/install-sh’

configure.ac:9: установка ‘config/missing’

src/Makefile.am: установка ‘config/depcomp’

[root@server1 suphp-0.7.2]#

Это применит патч, теперь мы можем скомпилировать новый исходный код следующим образом:

./configure --prefix=/usr/ --sysconfdir=/etc/ --with-apr=/usr/bin/apr-1-config --with-apache-user=apache --with-setid-mode=owner --with-logfile=/var/log/httpd/suphp_log  
make  
make install

Затем мы добавляем модуль suPHP в нашу конфигурацию Apache…

nano /etc/httpd/conf.d/suphp.conf
LoadModule suphp_module modules/mod_suphp.so

… и создаем файл /etc/suphp.conf следующим образом:

nano /etc/suphp.conf
[global]
;Путь к файлу журнала
logfile=/var/log/httpd/suphp.log
;Уровень журнала
loglevel=info
;Пользователь, от имени которого работает Apache
webserver_user=apache
;Путь, в котором должны находиться все скрипты
docroot=/
;Путь к chroot() перед выполнением скрипта
;chroot=/mychroot
; Опции безопасности
allow_file_group_writeable=true
allow_file_others_writeable=false
allow_directory_group_writeable=true
allow_directory_others_writeable=false
;Проверить, находится ли скрипт в DOCUMENT_ROOT
check_vhost_docroot=true
;Отправить незначительные сообщения об ошибках в браузер
errors_to_browser=false
;Переменная окружения PATH
env_path=/bin:/usr/bin
;Umask для установки, укажите в восьмеричной нотации
umask=0077
; Минимальный UID
min_uid=100
; Минимальный GID
min_gid=100

[handlers]
;Обработчик для php-скриптов
x-httpd-suphp="php:/usr/bin/php-cgi"
;Обработчик для CGI-скриптов
x-suphp-cgi="execute:!self"

Отредактируйте файл /etc/httpd/conf.d/php.conf, чтобы включить разбор php только для phpmyadmin, roundcube и других системных пакетов в /usr/share, но не для веб-сайтов в /var/www, так как ISPConfig будет активировать PHP для каждого веб-сайта индивидуально.

nano /etc/httpd/conf.d/php.conf

измените строки:

  
SetHandler application/x-httpd-php  

на:

  
  
SetHandler application/x-httpd-php  
  

Таким образом, обработчик PHP будет заключен в директиву Directory.

Включите httpd и PHP-FPM, чтобы они запускались при загрузке, и запустите службу PHP-FPM.

systemctl start php-fpm.service  
systemctl enable php-fpm.service  
systemctl enable httpd.service

Наконец, перезапустите Apache:

systemctl restart httpd.service

15 Установка mod_python

Модуль apache mod_python недоступен в виде RPM-пакета, поэтому мы скомпилируем его из исходников. Первый шаг – установить файлы разработки python и скачать текущую версию mod_python в виде tar.gz файла

yum -y install python-devel
cd /usr/local/src/  
wget http://dist.modpython.org/dist/mod_python-3.5.0.tgz  
tar xfz mod_python-3.5.0.tgz  
cd mod_python-3.5.0

а затем настроить и скомпилировать модуль

./configure  
make  
make install

и включить модуль в apache

echo 'LoadModule python_module modules/mod_python.so' > /etc/httpd/conf.modules.d/10-python.conf  
systemctl restart httpd.service

16 Установка PureFTPd

PureFTPd можно установить следующей командой:

yum -y install pure-ftpd

Затем создайте ссылки для автозагрузки системы и запустите PureFTPd:

systemctl enable pure-ftpd.service  
systemctl start pure-ftpd.service

Теперь мы настраиваем PureFTPd для разрешения FTP и TLS-сессий. FTP – это очень небезопасный протокол, так как все пароли и все данные передаются в открытом виде. Используя TLS, всю связь можно зашифровать, что делает FTP гораздо более безопасным.

OpenSSL необходим для TLS; чтобы установить OpenSSL, мы просто выполняем:

yum install openssl

Откройте /etc/pure-ftpd/pure-ftpd.conf…

nano /etc/pure-ftpd/pure-ftpd.conf

Если вы хотите разрешить FTP и TLS-сессии, установите TLS в 1:

[...]
# Эта опция может принимать три значения :
# 0 : отключить уровень шифрования SSL/TLS (по умолчанию).
# 1 : принимать как традиционные, так и зашифрованные сессии.
# 2 : отклонить соединения, которые не используют механизмы безопасности SSL/TLS,
# включая анонимные сессии.
# Не раскомментируйте это бездумно. Убедитесь, что :
# 1) Ваш сервер был скомпилирован с поддержкой SSL/TLS (--with-tls),
# 2) Действительный сертификат установлен,
# 3) Только совместимые клиенты смогут войти.

TLS                      1
[...]

Чтобы использовать TLS, мы должны создать SSL-сертификат. Я создаю его в /etc/ssl/private/, поэтому сначала создаю этот каталог:

mkdir -p /etc/ssl/private/

После этого мы можем сгенерировать SSL-сертификат следующим образом:

openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem

Код страны (2 буквы) [XX]: <– Введите название вашей страны (например, “DE”).
Название штата или провинции (полное название) []: <– Введите название вашего штата или провинции.
Название населенного пункта (например, город) [Default City]: <– Введите ваш город.
Название организации (например, компания) [Default Company Ltd]: <– Введите название вашей организации (например, название вашей компании).
Название организационного подразделения (например, отдел) []: <– Введите название вашего организационного подразделения (например, “IT Department”).
Общее название (например, ваше имя или имя хоста вашего сервера) []: <– Введите полное доменное имя системы (например, “server1.example.com”).
Адрес электронной почты []: <– Введите ваш адрес электронной почты.

Измените разрешения SSL-сертификата:

chmod 600 /etc/ssl/private/pure-ftpd.pem

Наконец, перезапустите PureFTPd:

systemctl restart pure-ftpd.service

Вот и все. Теперь вы можете попробовать подключиться с помощью вашего FTP-клиента; однако вы должны настроить ваш FTP-клиент на использование TLS.

17 Установка BIND

Мы можем установить BIND следующим образом:

yum -y install bind bind-utils

Создайте резервную копию существующего файла /etc/named.conf и создайте новый следующим образом:

cp /etc/named.conf /etc/named.conf_bak  
cat /dev/null > /etc/named.conf  
nano /etc/named.conf
// named.conf
//
// Предоставлено пакетом bind от Red Hat для настройки ISC BIND named(8) DNS
// сервера как кэшируемого только именем сервера (как локальный DNS-резолвер).
//
// Смотрите /usr/share/doc/bind*/sample/ для примеров конфигурационных файлов named.
//
options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { any; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { any; };
                allow-recursion {"none";};
        recursion no;
};
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
zone "." IN {
        type hint;
        file "named.ca";
};
include "/etc/named.conf.local";

Создайте файл /etc/named.conf.local, который включается в конце /etc/named.conf ( /etc/named.conf.local позже будет заполнен ISPConfig, если вы создадите DNS-зоны в ISPConfig):

touch /etc/named.conf.local

Затем создаем ссылки для автозагрузки и запускаем BIND:

systemctl enable named.service  
systemctl start named.service

18 Установка Webalizer и AWStats

Webalizer и AWStats можно установить следующим образом:

yum -y install webalizer awstats perl-DateTime-Format-HTTP perl-DateTime-Format-Builder

19 Установка Jailkit

Jailkit используется для chroot SSH пользователей и cronjobs. Его можно установить следующим образом (важно: Jailkit должен быть установлен до ISPConfig - его нельзя установить позже!):

cd /tmp  
wget http://olivier.sessink.nl/jailkit/jailkit-2.17.tar.gz  
tar xvfz jailkit-2.17.tar.gz  
cd jailkit-2.17  
./configure  
make  
make install  
cd ..  
rm -rf jailkit-2.17*

20 Установка fail2ban

Это необязательно, но рекомендуется, так как монитор ISPConfig пытается показать журнал.

yum -y install iptables-services fail2ban fail2ban-systemd  
systemctl mask firewalld.service  
systemctl enable iptables.service  
systemctl enable ip6tables.service  
systemctl stop firewalld.service  
systemctl start iptables.service  
systemctl start ip6tables.service

Затем создаем файл /etc/fail2ban/jail.local и включаем мониторинг для ssh, email и ftp сервисов.

nano /etc/fail2ban/jail.local

Добавьте следующее содержимое в файл jail.local:

[sshd]  
enabled = true  
action = iptables[name=sshd, port=ssh, protocol=tcp]  
  
[pure-ftpd]  
enabled = true  
action = iptables[name=FTP, port=ftp, protocol=tcp]  
maxretry = 3  
  
[dovecot]  
enabled = true  
action = iptables-multiport[name=dovecot, port="pop3,pop3s,imap,imaps", protocol=tcp]  
maxretry = 5  
  
[postfix-sasl]  
enabled = true  
action = iptables-multiport[name=postfix-sasl, port="smtp,smtps,submission", protocol=tcp]  
maxretry = 3

Затем создаем ссылки для автозагрузки системы для fail2ban и запускаем его:

systemctl enable fail2ban.service  
systemctl start fail2ban.service

21 Установка rkhunter

rkhunter можно установить следующим образом:

yum -y install rkhunter

22 Установка Mailman

Если вы хотите управлять почтовыми списками с помощью Mailman на вашем сервере, установите mailman сейчас. Mailman поддерживается ISPConfig, поэтому вы сможете создавать новые почтовые списки через ISPConfig позже.

yum -y install mailman

Прежде чем мы сможем запустить Mailman, необходимо создать первый почтовый список с именем mailman:

touch /var/lib/mailman/data/aliases  
postmap /var/lib/mailman/data/aliases  
/usr/lib/mailman/bin/newlist mailman

[root@server1 tmp]# /usr/lib/mailman/bin/newlist mailman
Введите email человека, управляющего списком: <– адрес электронной почты администратора, например [email protected]
Первоначальный пароль mailman: <– пароль администратора для списка mailman
Чтобы завершить создание вашего почтового списка, вам необходимо отредактировать ваш файл /etc/aliases (или
эквивалентный) файл, добавив следующие строки, и, возможно, запустив
программу newaliases:

почтовый список mailman

mailman: “|/usr/lib/mailman/mail/mailman post mailman”
mailman-admin: “|/usr/lib/mailman/mail/mailman admin mailman”
mailman-bounces: “|/usr/lib/mailman/mail/mailman bounces mailman”
mailman-confirm: “|/usr/lib/mailman/mail/mailman confirm mailman”
mailman-join: “|/usr/lib/mailman/mail/mailman join mailman”
mailman-leave: “|/usr/lib/mailman/mail/mailman leave mailman”
mailman-owner: “|/usr/lib/mailman/mail/mailman owner mailman”
mailman-request: “|/usr/lib/mailman/mail/mailman request mailman”
mailman-subscribe: “|/usr/lib/mailman/mail/mailman subscribe mailman”
mailman-unsubscribe: “|/usr/lib/mailman/mail/mailman unsubscribe mailman”

Нажмите Enter, чтобы уведомить владельца mailman… <– ENTER

[root@server1 tmp]#

Откройте /etc/aliases после этого…

vi /etc/aliases

… и добавьте следующие строки:

[...]
mailman:              "|/usr/lib/mailman/mail/mailman post mailman"
mailman-admin:        "|/usr/lib/mailman/mail/mailman admin mailman"
mailman-bounces:      "|/usr/lib/mailman/mail/mailman bounces mailman"
mailman-confirm:      "|/usr/lib/mailman/mail/mailman confirm mailman"
mailman-join:         "|/usr/lib/mailman/mail/mailman join mailman"
mailman-leave:        "|/usr/lib/mailman/mail/mailman leave mailman"
mailman-owner:        "|/usr/lib/mailman/mail/mailman owner mailman"
mailman-request:      "|/usr/lib/mailman/mail/mailman request mailman"
mailman-subscribe:    "|/usr/lib/mailman/mail/mailman subscribe mailman"
mailman-unsubscribe:  "|/usr/lib/mailman/mail/mailman unsubscribe mailman"

Запустите

newaliases

после этого и перезапустите Postfix:

systemctl restart postfix.service

Теперь откройте файл конфигурации Apache Mailman /etc/httpd/conf.d/mailman.conf…

nano /etc/httpd/conf.d/mailman.conf

… и добавьте строку ScriptAlias /cgi-bin/mailman/ /usr/lib/mailman/cgi-bin/. Закомментируйте Alias /pipermail/ /var/lib/mailman/archives/public/ и добавьте строку Alias /pipermail /var/lib/mailman/archives/public/:

#
#  настройки конфигурации httpd для использования с mailman.
#

ScriptAlias /mailman/ /usr/lib/mailman/cgi-bin/
ScriptAlias /cgi-bin/mailman/ /usr/lib/mailman/cgi-bin/

    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all



#Alias /pipermail/ /var/lib/mailman/archives/public/
Alias /pipermail /var/lib/mailman/archives/public/

    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
    AddDefaultCharset Off


# Раскомментируйте следующую строку, чтобы перенаправить запросы на /mailman на страницу
# listinfo (рекомендуется).

# RedirectMatch ^/mailman[/]*$ /mailman/listinfo

Перезапустите Apache:

systemctl restart httpd.service

Создайте ссылки для автозагрузки системы для Mailman и запустите его:

systemctl enable mailman.service  
systemctl start mailman.service

После установки ISPConfig 3 вы сможете получить доступ к Mailman следующим образом:

Вы можете использовать псевдоним /cgi-bin/mailman для всех виртуальных хостов Apache (обратите внимание, что suExec и CGI должны быть отключены для всех виртуальных хостов, с которых вы хотите получить доступ к Mailman!), что означает, что вы можете получить доступ к интерфейсу администратора Mailman для списка по адресу http:///cgi-bin/mailman/admin/, а веб-страница для пользователей почтового списка может быть найдена по адресу http:///cgi-bin/mailman/listinfo/.

По адресу http:///pipermail/ вы можете найти архивы почтового списка.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.