Стандартна система веб-розробника вдає із себе його особисту машину з встановленим пакетом, типу Denver або appserv, який включає в себе apache + php + mysql, кілька папок з копіями репозиторіїв для проектів, що дозволяємо йому переглядати і тестувати скрипти на своїй локальній машині. У цьому є багато плюсів, наприклад, якщо це на ноутбуці, то можна носити з собою і вдома працювати, але є і мінуси, наприклад, якщо треба показати кому то свої напрацювання, що треба запрошувати безпосередньо до свого робочого місця, або просити людини налаштовувати файл hosts, що б працювали віртуальні хости.
Виникла ідея, створити який-небудь сервер з віртуальними сервісами, для роботи з яким на робочу машину веб-розробника не треба було б нічого ставити.
В кінцевому підсумку, було прийнято рішення в якості ОС використовувати FreeBSD, samba, систему jail.
Кожному користувачеві видається jail зі своїм власним IP, доступом по ssh, mysql сервером, apache22 налаштованим під масовий віртуальний хостинг, з можливість вказівки додаткових віртуальних хостів, які не підходять під шаблон стандартного віртуального хоста, розшарений папкою через samba, куди просто шляхом додавання каталогу і скриптів автоматично з'являється піддомен третього рівня.
Для спрощення, будемо використовувати варіант з трьома розробниками.
Записуємо зміни в файлі /etc/rc.conf
Поставимо порт управління Джейла
Додаємо автозапуск Джейла, вказавши у файлі /etc/rc.conf:
У мене на сервері найбільший розмір має розділ / home. Тому, беремо файл прикладів налаштування ezjail і копіюємо його в конфігураційний файл
У ньому беремо рядок
І приводимо до виду
Зберігаємо файл і встановлюємо світ для Джейла, для цього використовуємо команду
Він лізе в інтернет і качає звідти збірку FreeBSD під поточну систему. В принципі, можна було б скористатися кодами FreeBSD, якби Ви їх поставили, але так набагато швидше. Поки воно все ставитися, можна піти і налити собі чайку / сходити покурити.
Ось, все поставив, тепер настав час створення керуючого Джейла, який буде використовувати вже Джейла розробників.
Суть керуючого Джейла в чому: кожен розробник отримує в своє користування повноцінну машину з рутовий правами. Треба воно йому, чи не треба, це вже залежить від конкретного розробника. Відповідно, ми не хочемо, що б він зміг там що-небудь поламати, тобто права у нього будуть повні, а зламати не може. Все це працює як. Згідно з документацією і тому як робляться Джейли за допомогою використання утиліти ezjail-admin, при установки світу для Джейла створюється кістяк оточення, тобто каталоги / bin / boot / lib / libexec / rescue / sbin / sys, які є симлінк на каталог в корені Джейла / basejail / bin / basejail / boot / basejail / lib / basejail / libexec / basejail / rescue / basejail / sbin / basejail / sys відповідно, які в свою чергу посилаються на каталог / home / jails / basejail. Каталог / basejail монтується в Джейли допомогою mount_nullfs в режимі тільки для читання, що означає, що користувач не зможе нічого зробити з системними файлами, ні видалити, не замінити, ні відредагувати. Відповідно, так само приблизно монтуються каталоги всередині каталогу / usr, за винятком каталогу / usr / local, куди користувач вже може писати і ставити різні порти.
Але ми підемо трохи далі. У поточній статті, розробників 3, але що робити, якщо їх буде більше? Це по перше, вони можуть ставити будь-який порт. Порт можна поставити нормально, можна криво, не хочеться потім розбиратися, чому так сталося. Так само, вони матимуть право видаляти порти, залежно та інше. Не кажучи вже про те, що при оновленні, доведеться заходити в кожен Джейли і оновлювати порти.
Розглянемо очевидне рішення, яке мені здалося розумним.
Для початку створимо керуючий Джейли.
Лежати він буде по шляху /home/jails/hq.local Створюємо каталог і супутні підкаталоги
У нашому випадку, він буде монтуватися в Джейлі в каталог / usr / local
Всі точки монтування визначаються файлами /etc/fstab.JAILNAME
У нашому випадку, це буде /etc/fstab.hq_local
Його вміст за замовчуванням
Для нашого випадку, що б розробники не могли нічого робити з встановленими портами, крім як безпосередньо працювати з ними, необхідно додати в цей файл ще одну точку монтування
Тобто для керуючого Джейла ми його будемо монтувати в режимі читання-запис, для установки або оновлення портів, а в разі для розробників ми його будемо монтувати в режимі тільки для читання, за винятком каталогу etc, де б розробники могли робити необхідні їм зміни з конфігураційних файлів сервісів.
Так само, нам потрібно буде працювати з портами. Для цього видаляємо симлінк з портами в Джейлі і робимо з нього папку, що б потім просто монтувати папку з портами в Джейли.
Так само прописуємо це в /etc/fstab.hq_local
Запускаємо безпосередньо Джейли
І дивимося в списках Джейла, який він має JID.
Все, ми в Джейлі.
Для того, що б всі встановлені порти могли використовуватися іншими Джейла треба створити кілька симлінк.
Тобто фактично, всі основні каталоги, крім etc будуть посилатися на каталог, який ми примонтировать для Джейла. У всіх Джейла вміст буде однаково.
Для установки портів я використовую локальну копію портів і його ж локальний кеш distfiles, що б не качати одні і ті ж порти, що вже і так є у мене, коли я налаштовував основну систему. Для цього треба підправити один файл, /etc/make.conf, закоментіровать рядок DISTDIR
І, відповідно, поле цього ставимо ті порти, які нам потрібні.
Створюються за таким же принципом, що і керуючий Джейли, за винятком того, що, все каталоги монтуються в режимі тільки для читання, а каталог з портами взагалі не використовується.
У каталозі / baselocaljail у мене є каталог var, куди я засунув файл extensions.ini. Відповідно, при цьому, при оновленні цього файлу в керуючому Джейло, він буде скрізь однаковий.
Далі. При установці якого-небудь додаткового порту, необхідно в кожному Джейлі запускати /etc/rc.d/ldcondig
Наприклад, для цього можна написати простенький скрипт:
Те ж саме відноситься до Апач
Ну, і звичайно, деякі програми кладуть скрипти запуску, а так же файли конфігурацій по шляху / usr / local / etc, їх уже треба відстежувати руками.
Вся ця система працює в офісі, комп'ютери якого використовують локальний DNS-сервер, де прописані сервера розробників для тесту. Створюємо, наприклад, в офісі зону local. І домени другого рівня, для Джейла розробників, наприклад user001.local user002.local user003.local.
Для початку, створюємо саму зону .local
У мене на сервері настройки і зони лежать в каталозі / etc / namedb
Беремо стандартний кофіг named.conf і додаємо туди рядок:
І, відповідно, самі зони:
Вміст файлу /etc/namedb/master/local.zone