Строим свой Gmail с куртизанками и преферансом

в 8:30, , рубрики: iredmail, nginx, owncloud, roundcube, tiny tiny rss, метки: , , , ,

Вместо предисловия

В один прекрасный, а может и не такой уж и прекрасный, день настигла паранойя и меня. Было принято решение бежать от Google подальше. При чем, бежать куда-нибудь на свою площадку, чтобы быть спокойным за сохранность своих любимых сервисов.

Итак, в этой статье я расскажу о том, как я поднимал и настраивал на своем сервере почту, календарь, контакты, RSS-аггрегатор и, в качестве бонуса, хранилище файлов.

0. Сервер

Прежде чем разворачивать все необходимые сервисы, сперва необходимо решить где они будут жить. Первая мысль, которая приходит в голову — развернуть все на своем домашнем компьютере. Но включенный 24/7 компьютер дома доставляет немало неудобств. К тому же, мы хотим, чтобы наши сервисы были доступны всегда, а с качеством домашнего интернета и электроснабжения это почти невозможно. Да что там говорить о качестве, многие интернет провайдеры запрещают держать какие-либо серверы дома.

Таким образом, выбор пал на виртуальный сервер от Digital Ocean. Думаю, сервис не нуждается в представлении. Для себя я выбрал самый простой тарифный план, а именно $5/мес, 20GB SSD и 512MB RAM. Таких скромных характеристик достаточно для решения вышеописанных задач в масштабах домашнего пользования.

Также, нам необходимо зарегистрировать домен. Так как я жадная жопа мне было жалко денег на домен в зоне .com, то я воспользовался услугами замечательного регистратора Dot.tk — они выдают домены в зоне .tk бесплатно, с условием, что ваш сайт будет работать и вы вовремя будете продлевать регистрацию доменного имени. Другими словами — если вы доменом пользуетесь, то пользуйтесь на здоровье. Если же просто застолбили имя, то не будьте жадиной, отдайте это имя кому-то другому.

Для удобства, можно перенести обслуживание домена на серверы Digital Ocean, что я и сделал, выбрав «Custom DNS» и прописав адреса следующих NS-серверов: ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com.

1. Почта

После того, как мы развернули сервер и зарегистрировали домен, можно приступать к установке необходимых нам служб. Я еще и ленивая жопа человек ленивый и люблю использовать пакеты, которые работают прямо из коробки. Поэтому для установки почтового сервера я выбрал iRedMail. Бесплатной версии будет вполне достаточно для решения наших задач.

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

  • dovecot
  • postfix
  • mysql/postgresql/openldap (по выбору)
  • amavisd
  • clamav
  • spamassissin
  • apache
  • roundcubemail

+ еще некоторые плюшки, о которых детельно написано тут.

ВНИМАНИЕ: на сайте iRedAdmin написано, что его нужно устанавливать _только_ на свежеустановленную ОС. Я не пробовал устанавливать пакет на «бэушный» сервер, однако, подозреваю, что закончится это все не самым лучшим образом.

Не будем долго задерживаться на этапе установки, эта процедура довольно проста и подробно описана тут, тут и тут. После установки можем пойти на панель управления по адресу http://example.com/iredadmin/ и создать нового пользователя. Теперь у нас есть полностью рабочий почтовый сервер.

Но мы пойдем немного дальше и заменим apache на nginx. Сперва, необходимо установить сам веб-сервер. В ubuntu это делается так:

apt-get install nginx

Теперь необходимо настроить его таким образом, чтобы все наши сервисы были доступны. Так как мы хотим, чтобы весь трафик шифровался, то необходимо немного модифицировать дефолтный конфиг, включив шифрование. Подробнее о настройке шифрования в nginx можно почитать тут. Мой глобальный конфиг /etc/nginx/nginx.conf выглядит следующим образом:

http {
    ssl_certificate /path/to/cert;
    ssl_certificate_key /path/to/key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "RC4:HIGH:!aNULL:!MD5:!kEDH";
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;
    ssl_prefer_server_ciphers on;

    add_header Strict-Transport-Security 'max-age=604800';

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    server_name_in_redirect on;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    gzip on;
    gzip_disable "msie6";

    include /etc/nginx/sites-enabled/*;
}

Таким образом, я включил шифрование глобально для всех сайтов, которые будет обслуживать nginx. Теперь нужно написать конфиги для необходимых нам сервисов.

Для этого в /etc/nginx/sites-enabled/ создаем новый файл примерно с таким содержанием:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri; # Принудительно перенаправляем на https
}
server {
    listen 443 ssl;
    server_name example.com www.example.com;
    index index.php index.html index.htm;
    ssl on;
    access_log /var/log/nginx/root/access.log;
    error_log /var/log/nginx/root/error.log;


    location /phpmyadmin {
        root /usr/share/;
        location ~ ^/phpmyadmin/(.+.php)$ {
            try_files $uri = 404;
            root /usr/share/;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param HTTPS on;
            include fastcgi_params;
        }
        location ~* ^/phpmyadmin/(.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
            root /usr/share/;
        }
    }

    location /iredadmin {
        root /var/www;
        uwsgi_pass 127.0.0.1:3031;
        include uwsgi_params;
        uwsgi_param SCRIPT_NAME /iredadmin;
        uwsgi_modifier1 30;

        location ~* ^/iredadmin/static/ {
            root /var/www;
        }
    }

    location ~/(.ht|README|AUTHORS|INSTALL|LICENSE|CONFIG|ChangeLog) {
        deny all;
    }
}

Здесь мы видим правила обслуживания адресов /phpmyadmin и /iredadmin. Так как phpmyadmin написан на вот так неожиданность php, то для его работы необходимо установить php5-fpm. В ubuntu это делается так:

apt-get install php5-fpm

Далее, в конфиге /etc/php5/fpm/pool.d/www.conf прописываем строчку:

listen = /var/run/php5-fpm.sock

Таким образом мы указываем fpm, чтобы он слушал на сокете /var/run/php5-fpm.sock. Именно на этот сокет настроен наш nginx.

iredadmin, в свою очередь, написан на python и для его работы нам понадобится uwsgi. Также, для красивого запуска uwsgi, я использую supervisor. Установим эти пакеты.

apt-get install supervisor
pip install uwsgi

Конфиг uwsgi-приложения /etc/uwsgi/iredadmin.ini у меня выглядит следующим образом:

[uwsgi]
chdir=/var/www/iredadmin
vacuum=True
pidfile=/var/run/uwsgi/iredadmin/iredadmin.pid
socket=127.0.0.1:3031
plugins=python
file=/var/www/iredadmin/iredadmin.py

Конфиг супервизора /etc/supervisor/conf.d/iredadmin.conf выглядит так:

[program:iredadmin]
command=/usr/local/bin/uwsgi /etc/uwsgi/iredadmin.ini
stdout_logfile=/var/log/supervisor/iredadmin.log
stderr_logfile=/var/log/supervisor/iredadmin_err.log
user=iredadmin

Останавливаем apache, запускаем nginx и supervisor:

service apache2 stop
service nginx start
supervisorctl start iredadmin

Идем в браузер и проверяем все ли работает.

2. Контакты и календари

Для того, чтобы наше рабочее окружение было максимально комфортным, нам необходимо поднять сервер контактов и календарей. Сперва мой выбор пал на Baikal. Это замечтаельное решение, которое разворачивается за считанные секунды и неплохо работает. Но мы ведь хотим, чтобы все наши сервисы также были доступны и через web, а Baikal, к сожалению, не имеет встроенного web-интерфейса. Таким образом, необходимо искать, устанавливтаь и настраивать еще один продукт. После непродожительного поиска, наткнулся на отличное решение — ownCloud. Это полноценный WebDAV сервер, у которого есть веб-интерфейс и клиенты для разных платформ. Из коробки мы получаем сервер контактов и календарь. Более того, мы получаем свое личное облачное хранилище!

Установка

  1. Скачать и распаковать архив;
  2. Создать пользователя базы данных и саму БД;
  3. Настроить nginx;
  4. Открыть в браузере страницу установщика и следовать инструкциям.

Конфиг для nginx я взял из документации.

Интеграция контактов с RoundCubeMail

Для того, чтобы мы могли пользоваться контактами прямо в веб-интерфейсе почтового ящика, необходимо установить плагин для RoundCubeMail. Я использовал этот.

Сначала нужно установить plugin-manager для RoundCube. Видео-инструкция по установке лежит тут. В моем случае оказалось, что iRedMail не выдал всех привелегий пользователю БД roundcube для базы roundcubemail. Убедитесь, что все права выданы, иначе плагин-менеджер не установится. После этого качаем архив с плагином Roundcube-CardDAV, распаковываем его и кладем содержимое в папку /var/www/roundcube/plugins/carddav/. Затем необходимо включить этот плагин в настройках RoundCube в веб-интерфейсе. Теперь в настройках появился новый пункт CardDAV, в котором необходимо прописать адрес нашего CardDAV-сервера.

3. RSS

В завершение осталось поднять только RSS аггрегатор. Для решения этой задачи я использовал Tiny Tiny RSS. Это легкий движок, который прост в установке и настройке и имеет несколько тем оформления.

Установка

  1. Скачать и распаковать архив;
  2. Создать пользователя базы данных и саму БД;
  3. Настроить nginx;
  4. Открыть в браузере страницу установщика и следовать инструкциям.

Конфиг nginx /etc/nginx/sites-enabled/rss имеет следующий вид:

server {
    listen 80;
    server_name rss.example.com;
    return 301 https://$server_name$request_uri;
}
server {
    listen 443 ssl;
    server_name rss.example.com;
    index index.php index.html index.htm;
    root /var/www/tt-rss;
    access_log /var/log/nginx/tt-rss/access.log;
    error_log /var/log/nginx/tt-rss/error.log;

    location ~ ^/favicon.ico$ {
        alias /var/www/tt-rss/images/favicon.png;
        log_not_found off;
        access_log off;
        expires max;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location ~ ^/(README.md|INSTALL|LICENSE|CHANGELOG|UPGRADING)$ {
        deny all;
    }

    location ~ ^/(schema|utils|install)/ {
        deny all;
    }

    location ~/. {
        deny all;
        access_log off;
        log_not_found off;
    }

    location ~ .php$ {
        try_files $uri = 404;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS on;
        include fastcgi_params;
        fastcgi_index index.php;
    }
}

Для того, чтобы фиды обновлялись автоматически в фоновом режиме, я добавил еще одно приложение для супервизора:

# cat /etc/supervisor/conf.d/tt_rss.conf
[program:tt_rss_up]
command=/usr/bin/php /var/www/tt-rss/update_daemon2.php
stdout_logfile=/var/log/supervisor/tt_rss_up.log
stderr_logfile=/var/log/supervisor/tt_rss_up_err.log
user=www-data

4. Синхронизация с мобильным телефоном

Зачем нам все это без синхронизации с мобильным телефоном? Вот и я думаю, что незачем.
Для синхронизации файлов, у ownCloud есть приложение для Android и iPhone. К сожалению, оно пока не умеет синхронизировать календарь и контакты, потому приходится использовать сторонние синхронизаторы.
На сколько мне известно, для iPhone ничего изобретать не надо, там синхронизация с CardDAV/CalDAV есть из коробки. В случае с Android, необходимо установить приложения, которые будут синхронизировать наши контакты и календари. В Google Play есть несколько приложений подобного рода, мой выбор пал на CalDAV-Sync и CardDAV-Sync.
Для Tiny Tiny RSS существует официальный клиент для Android.

Заключение

В итоге, мы получили хорошую альтернативу Gmail'у, полностью принадлежащую нам. Теперь можно спать спокойно, не опасаясь злых дядь, которые любят читать нашу почту и закрывать любимые сервисы. Как бонус, я обнаружил, что мой Android смартфон теперь живет в 1.5-2 раза дольше от одного заряда. Лишь благодаря отключению синхронизации гугловских календарей и контактов.

Спасибо всем, кто осилил весь этот поток мыслей. Пожелания, предложения и конструктивная критика приветствуются.

Автор: ketom_z80

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js