Деплоймент Docker-контейнерів за допомогою Ptah.sh
Всім привіт! Мене звуть Богдан. Дехто мене знає як активного користувача на форумі DOU, хтось — як колегу в EPAM або Astound Commerce, або ж ми бачилися на найкращій open-air, open-pool, true afterparty конференції України — Vinnytsia JS, яку я допомагав організовувати Олександру Павловському у
Програмую комерційно вже більше ніж 10 років. Близько половину цього часу я пропрацював у невеличкій вінницькій компанії, де й починав свою карʼєру. Там же знайшов собі друзів, з якими підтримую звʼязок і до сьогодні.
Напевне, саме робота в цій компанії заклала низку фундаментальних навичок, що не раз ставали мені в пригоді в майбутній кар’єрі: самостійність у вирішенні проблем, базове продуктове мислення, комунікація із замовниками та підлеглими.
TLDR: Якщо вам більше подобається відеоформат, пропоную почати ознайомлення з цього ролика:
Історія створення
У далекому
За всю історію ведення цього вебсайту я декілька разів мігрував між різними хмарами: від Heroku через AWS до DigitalOcean. Іноді причиною був перформанс, іноді — вартість, а часом впливали обидва фактори разом.
Втомившись від постійного налаштування всіх процесів під впливом спільноти #buildinpublic в X (formerly Twitter), я вирішив формалізувати свої знання та навички у вигляді зручного сервісу, що допоміг би мені простіше запускати нові підсистеми для цього проєкту.
У такий спосіб нам вдалося зекономити 82% щомісячного бюджету ($3,5 тисячі), які використовували лише на сервери та бази даних.
Архітектура Ptah.sh
Ptah.sh — це Fair Source програмне забезпечення, що складається з двох компонентів:
- Агент, що встановлюється на сервер (VPS) і взаємодіє із системою та запущеним Docker Daemon шляхом виконання заздалегідь заданих команд (створення — оновлення — запуск сервісів і бекапів).
- Web-based UI, що й дозволяє налаштовувати сервіси, точки доступу та періодичні завдання.
Це надає такі гарантії та можливості:
- Розгортання сервісів у будь-якому середовищі в будь-якого провайдера віртуальних або залізячних машин або взагалі в домашньому офісі.
- Безпека віртуальної машини: можна закрити всі порти й усе ще мати можливість деплойменту сервісів (наприклад, для інтранет-інфраструктури).
- Відкритий код гарантує (теоретично) швидке усунення критичних вразливостей.
- Модель Fair Source дозволяє також розміщувати сервіс на власному «залізі», таким чином беручи під контроль усю свою інфраструктуру.
- Docker Swarm, який є ключовим елементом системи, гарантує, що всі сервіси будуть ізольовані в межах своїх мереж, дає можливість обʼєднувати декілька нод в один кластер та допомагає збільшити надійність системи загалом.
- Vendorlock-free: всі конфігурації зберігаються на кластері Docker Swarm, що дозволяє відмовитись від сервісу в будь-який момент і все ще мати можливість виконувати деплойменти та бути впевненим, що вас сайт / застосунок / API не перетвориться опівночі на гарбуз.
Розгортання сервісів
Отже, тепер вам відомо, як працює система за кулісами. Настав час спробувати щось розгорнути та подивитися на сервіс безпосередньо.
Для цього потрібно мати:
- свіжий VPS з операційною системою Ubuntu;
- обліковий запис на ctl.ptah.sh;
- інтернет-з’єднання ;)
Крок № 1. Встановлення Docker та агента
Щоб мати можливість розгортати Docker-контейнери, потрібно встановити, відповідно, Docker і агент Ptah.sh. На щастя, це не потребуватиме значних зусиль: сервіс сформує для вас рядок bash, отож достатньо володіти поширеним умінням копіпастити :)
Щойно виконаєте скрипт у консолі вашого сервера, ви отримаєте:
- встановлений Docker Engine останньої версії;
- встановлений агент сервісу останньої версії;
- systemd-конфігурацію для автоматичного (пере-) запуску агента.
Крок № 2. Ініціалізація кластера Docker Swarm
Отже, після того як ви встановили агента та картка вашого сервера на дашборді змінила червоний напис Offline на зелененький Online, можете ініціалізувати кластер Docker Swarm, де, власне, і будуть запускатися ваші сервіси.
Серед необхідних параметрів — Advertisement Address, на випадок якщо ви бажаєте в майбутньому створити кластер із декількох серверів. Якщо всі ваші сервери будуть у межах однієї мережі вашого провайдера, оберіть внутрішню адресу. Якщо ж серед ваших вимог — мати декілька географічних зон (провайдерів, зон доступності тощо), оберіть зовнішню адресу.
Крок № 3. Деплоймент сервісу
Як тест я буду деплоїти простий Docker Image — nginxdemos/hello, який містить nginx-сервер та віддаватиме в браузер динамічну сторінку з базовою інформацією про HTTP-запит: адреса, назва госту (контейнера), дата та час обробки запиту.
Серед ключових параметрів потрібно буде вказати назву сервісу, Docker Image, з якого підіймати контейнер, та, у нашому випадку, HTTP Endpoint, за яким можна буде звертатись до запущеного сервісу.
Ptah.sh за замовчуванням запускає Caddy, який оброблює всі зовнішні HTTP-запити та автоматизує отримання сертифікатів через Let’s Encrypt.
Окрім уже зазначених можливостей, можна налаштовувати:
- змінні оточення (публічні й секретні);
- конфігураційні файли (також публічні й секретні);
- Docker Volumes (для збереження файлів на диску);
- бекапи (у вигляді самостійно заданих команд та автоматизованих бекапів Volumes);
- додаткові процеси (воркери для важких завдань);
- а також додаткові Docker Service, що працюватимуть за зразком Sidecar Containers в K8s (наприклад, для pgbouncer/pgpool).
Крок № 4. Перевірка справності сервісу
Щойно завершився деплоймент сервісу, можна подивитись результати у вашому улюбленому браузері.
У попередньому кроці я вказав, що сервіс буде працювати на localhost та обробляти всі запити, які починаються із /nginx-demos/
. Окрім того, я зазначив, що потрібно слухати запити на порту HTTPS, тож Caddy сконфігурує відповідний endpoint.
Отож повне посилання для тесту таке:
localhost/nginx-demos/dou-demo
Після проходження застережливого екрана щодо цілісності сертифіката, оскільки це localhost, має відобразитися такий екран:
Це все, я вас вітаю — розгорнуто перший сервіс за допомогою Ptah.sh :)
Як ви бачите, ми оминули багато питань, пов’язаних з конфігурацією, завдяки підходу сервісу. Цей оптимізований процес демонструє, як Ptah.sh спрощує розгортання, дозволяючи вам зосередитися на вашому застосунку, а не загрузнути в складних деталях конфігурації.
Opinionated-природа Ptah.sh означає, що він ухвалює певні рішення за вас, базуючись на найкращих практиках та поширених випадках використання. Такий підхід суттєво заощаджує час і зусилля, необхідні для запуску сервісу, при цьому все ще забезпечує гнучкість для більш складних конфігурацій, коли це потрібно.
Завершивши цей процес, ви особисто переконалися, як сервіс може зробити розгортання Docker більш доступним та ефективним, навіть для тих, хто не є експертом у налаштуванні серверів чи оркестрації Docker Swarm.
1-Click Apps
Для того, щоби зробити життя простіше, я впровадив до сервісу функціонал подібний до
Сьогодні це імплементовано як набір шаблонів для сервісів і я вже маю із десяток конфігурацій: від баз даних до аналітики та CMS.
Як це працює, можна побачити на прикладі Wordpress. Від користувача вимагається лише ввести параметри запуску (адреса, де має крутитись WP, та паролі до сервісів).
Що ж далі?
Наразі я в стадії пошуку ідей, як покращити продукт та куди його розвивати. Буду вдячний, якщо спробуєте сервіс та дасте чесний фідбек. Зірочки на GitHub теж приймаються. ;)
Щоб підсумувати, пропоную вам особисто спробувати розгорнути свій сервіс за допомогою Ptah.sh. Якщо бажаєте стежити за процесом розробки, запрошую долучитися в таких мережах:
- X (formerly Twitter) — @b_shulha
- GitHub — ptah-sh/ptah-server
- YouTube — @Ptah-sh
- Discord Community
А які плани?
Загалом з планами можна ознайомитись на GitHub: я намагаюсь групувати тікети в майлстоуни.
Якщо ж дивитися з висоти пташиного польоту, то хочу втілити такі ідеї:
- real-time оновлення статусів завдань, що виконуються агентом (зараз потрібно тицяти F5);
- упровадити можливість налаштування експорту логів у systemd та сумісні з AWS сховища;
- моніторинг серверних ресурсів (CPU/RAM/Disk)
- uptime моніторинг (з різних геолокацій)
- s3-compatible сховище для бекапів
Дякую!
16 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів