База данных в облаке. Установка Firebird на VDS.

Что делать если нужен централизованный доступ к базе данных DataExpress через Интернет, а возможности выделить для этих целей отдельный сервер нет? На помощь придет VDS. VDS - это виртуальный сервер со своей операционной системой. Вы можете выполнять те же действия, что и с обычным компьютером: устанавливать различные приложения, настраивать права доступа. VDS уже имеет выделенный IP-адрес, который можно использовать для доступа к своим приложениям и сервисам. К тому же виртуальный сервер работает круглосуточно. Управление сервером осуществляется удаленно. Удовольствие это, правда, не бесплатное, но и не дорогое. На подавляющем большинстве VDS устанавливается ОС Linux. VDS с ОС Windows будут значительно дороже.

В этой статье я расскажу как настроить ОС Ubuntu 16.04 и Firebird 2.5 Classic, чтобы пользователи DataExpress могли получить доступ к базе, находящейся на VDS. Честно говоря, я сам недавно стал интересоваться этим вопросом, да и с Linux мало знаком. Но погуглив в интернете, смог по крупицам добыть нужную информацию. И вот теперь хочу поделиться этой информацией с вами. Я не буду особо разъяснять назначение команд, главное - это в точности повторить все действия. Подробную информацию по командам вы можете найти в интернете. Также я не буду рассказывать о том, какой VDS хостинг лучше выбрать и как создавать VDS. Эту информацию вы найдете на VDS хостинге. Для пробы можно выбрать самый дешевый вариант. Далее предполагается, что вы уже нашли подходящий VDS хостинг и установили ОС Ubuntu 16.04. Поехали.

Для удаленного управления сервером установите программу Putty. Окно программы Putty На рисунке показаны настройки программы по умолчанию. Их менять не нужно. Введите IP-адрес сервера (IP-адрес сервера, а также пароль root вам должны прислать на почту после установки системы на VDS) и нажмите кнопку «Open». Должна открыться консоль. Консоль Putty Войдите в систему под пользователем «root». При вводе пароля курсор не двигается - так и должно быть. Можно сразу сменить пароль пользователя на подходящий. Для этого воспользуйтесь командой passwd. Система предложит ввести новый пароль. Ввод пароля Перед установкой Firebird нужно установить демон inetd. Без него получить доступ к базе данных не получится. Вводим в командной строке:

sudo apt-get install -y openbsd-inetd

Теперь устанавливаем Firebird:

sudo apt-get install -y firebird2.5-classic

В процессе установки нужно будет задать пароль администратора SYSDBA. Конфигурируем Firebird:

dpkg-reconfigure firebird2.5-classic

Запустится программа настройки Firebird. Появится вопрос «Enable Firebird server?» (Включить сервер Firebird?). Ответьте утвердительно. Затем нужно заново задать пароль администратора SYSDBA. Если пароль отличается от стандартного (masterke), то при подключении DataExpress к базе нужно будет ввести этот пароль.

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

Отредактируем файл inetd.conf:

nano /etc/inetd.conf

Находим строчку (должна быть в конце):

localhost:gds_db stream tcp ...

И меняем «localhost» на «0.0.0.0». Выходим из редактора по Ctrl-X. На вопрос сохранить изменения отвечаем утвердительно. Редактор предложит ввести имя сохраняемого файла. Оставим прежнее имя, просто нажав ENTER. Перезагружаем машину:

reboot

Базовая настройка Firebird готова. Теперь нам нужно как-то загрузить на сервер базу. Для этого можно воспользовать программой FileZilla. Но перед тем как настраивать FileZilla создадим пользователя с обычными правами:

adduser user

Будет создан новый пользователь «user» и домашняя папка «/home/user». Система попросит назначить пароль пользователю, а также задаст несколько простых вопросов: фамилия, имя, телефон и т. д. Назначим права доступа к папке пользователю «user»:

chmod 777 /home/user

Теперь пользователю доступны операции чтения/записи/выполнения в этой папке. Настроим новое соединение в FileZilla. Настройка FileZilla Нажимаем кнопку «Новый сайт», вводим IP-адрес сервера, выбираем протокол SFTP, тип входа - нормальный, вводим имя пользователя, которого недавно создали, пароль и нажимаем кнопку «Соединиться». Если соединение будет успешным, то в панелях справа вы увидите домашний каталог пользователя. Слева отображаются папки и файлы локального компьютера. Найдите файл своей базы и перетащите его в домашний каталог пользователя - начнется загрузка файла на сервер.

После успешной загрузки базы вернемся к Putty. Мы по прежнему не получим доступа к базе пока не зададим необходимые права. При установке Firebird в системе был создан пользователь «firebird», сервер баз данных работает от его имени. Чтобы сервер БД смог получить доступ к нашему файлу базы, нужно назначить его владельцем этого файла.

chown firebird /home/user/DEMO_DB.FDB

Обратите внимание, что в Linux регистр имеет значение.

Все готово для того, чтобы мы могли подключиться к удаленной базе. Пробуем: Подключение к БД Если при конфигурировании Firebird вы ввели не стандартный пароль, то нужно снять флажок «Пароль по умолчанию» и ввести соответствующий пароль.

Дополнительные меры безопасности

Если вы серьезно решили использовать VDS для доступа к базе, то не лишним будет принять некоторые меры безопасности. Начнем с того, что скроем реальное расположение базы, создав алиас. Находим на сервере файл aliases.conf и редактируем:

nano /etc/firebird/2.5/aliases.conf

Пишем в конце файла, например:

mydb=/home/user/mybase.fdb

Разработчики Firebird рекомендуют изменить стандартный порт 3050 на какой-либо другой при доступе к базе через Интернет. По идее порт должен быть прописан в файле /etc/firebird/2.5/firebird.conf, в строке «RemoteServicePort» (которая должна быть раскоментирована). Но какой-бы порт не был указан, связь с сервером по прежнему осуществляется через порт 3050. На самом деле нужно редактировать файл inetd.conf:

nano /etc/inetd.conf

Находим уже знакомую нам строчку «0.0.0.0:gds_db …» и меняем «gds_db» на нужный порт, например 3051. Сохраняем изменения.

Теперь настроим файрвол ufw. Вводим в командной строке последовательно:

ufw enable
ufw allow 22
ufw allow 3051

Первая команда включает файрвол. По умолчанию файрвол ничего не пропускает. Вторая команда открывает порт 22 для удаленного управления сервером через программу Putty. Третья команда открывает порт 3051, который нам нужен для связи с сервером Firebird. Таким образом в системе открыто только два порта: 22 и 3051. Перезагружаем сервер. Пробуем подключиться. Подключение к БД, с указанием алиаса и порта Порт указывается через слеш после IP-адреса сервера, вместо полного пути к базе прописан алиас.

Настройка резервного копирования

Давайте теперь настроим резервное копирование. Резервные копии будем хранить в папке backups. Каждая копия будет иметь префикс из даты и времени. Создаем папку:

mkdir /home/user/backups

Резервное копирование выполняется утилитой gbak, входящей в состав Firebird. Чтобы было удобнее пользоваться командой резервного копирования, создадим небольшой скрипт:

nano /home/user/backup.sh

Сам скрипт:

#!/sbin/bash
filename=`date +%y%m%d_%H%M%S_mybase`
gbak -b -g /home/user/mybase.fdb /home/user/backups/$filename.fbk -v -y /home/user/backups/$filename.log -user SYSDBA -pass masterkey

В переменной filename хранится команда date, которая возвращает строку в формате ГодМесяцДень_ЧасМинСек_mybase. Утилита gbak выполняет резервное копирование (ключ -b), ключ -g запрещает сборку мусора. Это позволяет ускорить резервное копирование. Далее идут путь к файлу базы и путь к резервной копии. Ключ -v включает полное протоколирование процесса, а -y определяет, где будет создан лог.

Запустите скрипт и убедитесь, что резервная копия создается:

. /home/user/backup.sh
ls /home/user/backups

Процесс резервного копирования можно автоматизировать планировщиком cron. Он будет запускать резервное копирование по расписанию. Добавим новое задание в планировщик.

nano /etc/crontab

Добавим в этот файл строчку:

0 12 * * * root . /home/user/backup.sh

Она обозначает запускать наш скрипт каждый день в 12:00. Сохраняем изменения. И на этом наша настройка заканчивается. Ну и пару строчек как можно восстановить базу из резервной копии:

mv /home/user/mybase.fdb /home/user/oldbase.fdb
gbak -c /home/user/backups/mybase.fbk /home/user/mybase.fdb -user SYSDBA -pass masterkey

Перед восстановлением убедитесь, что к базе нет подключений. Нельзя выполнять восстановление из резервной копии на текущую базу. Поэтому переименовываем файл базы, а затем запускаем команду. В процессе из резервной копии будет создана новая база данных. Если восстановление было успешно, старую базу можно удалить.

rm /home/user/oldbase.fdb

Настройка KeepAlive

В случае обрыва соединения информация о нем может по прежнему храниться в базе. Из-за этого некоторые пользователи не смогут войти в базу или изменить некоторые записи, т. к. они могут быть заблокированы. Мы можем настроить систему таким образом, чтобы наличие соединений проверялось системой с некоторой периодичностью. Это позволит Firebird закрывать оборванные соединения. Параметры KeepAlive устанавливаются в файле sysctl.conf:

nano /etc/sysctl.conf

Добавим в файл следующие строчки:

net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 2

Первый параметр указывает системе начинать проверку соединения через 60 секунд. Если клиент не ответил, то повторить попытку через 30 секунд (второй параметр). Всего попыток 2 (третий параметр). После второй попытки система ждет еще 30 секунд (второй параметр) и закрывает соединение. Время закрытия соединения рассчитывается по формуле time + (probes + 1) * intvl. В нашем примере до закрытия соединения пройдет примерно: 60 + (2 + 1) * 30 = 150 секунд.

Оптимизация базы DataExpress

Скорость передачи данных в сети Интернет значительно ниже, чем в локальной сети. Если до этого вы работали с базой в локальной сети, а затем перешли в Интернет, то вы сразу заметите задержки.

  1. Первым делом нужно уменьшить размер текстовых полей до необходимого минимума. Если вы меняете размер полей в уже рабочей базе, то после изменения размера полей сделайте процедуру резервного копирования / восстановления, чтобы сжать базу и очистить ее от мусора. Также не меняйте размер большому количеству полей, т. к. это может привести к очень долгому сохранению изменений. При изменении размера поля DataExpress на самом деле создает новое поле и копирует содержимое старого поля в новое, старое поле затем удаляется. Поэтому размер базы после такой операции не уменьшается, а наоборот увеличивается.
  2. Старайтесь избегать интенсивного использования функций DB в выражениях и вычисляемых полях запросов.
  3. При открытии формы, программа читает данные всех полей, в том числе изображения и файлы, хранимые в базе (миниатюры изображений всегда хранятся в базе). Если изображения и файлы хранятся в базе, то это может привести к значительному замедлению чтения данных из базы. В этом случае имеет смысл создавать простую форму и запрос для выборки данных из нужной формы, или использовать отчет.
  4. Чтение подчиненных данных формы (таблиц и запросов) тоже может сильно замедлять работу. В этом случае тоже имеет смысл создавать простую форма + запрос или использовать отчет.