Деплоймент Docker-контейнерів за допомогою Ptah.sh

💡 Усі статті, обговорення, новини про DevOps — в одному місці. Приєднуйтесь до DevOps спільноти!

Всім привіт! Мене звуть Богдан. Дехто мене знає як активного користувача на форумі DOU, хтось — як колегу в EPAM або Astound Commerce, або ж ми бачилися на найкращій open-air, open-pool, true afterparty конференції України — Vinnytsia JS, яку я допомагав організовувати Олександру Павловському у 2018-му та 2019 роках.

Програмую комерційно вже більше ніж 10 років. Близько половину цього часу я пропрацював у невеличкій вінницькій компанії, де й починав свою карʼєру. Там же знайшов собі друзів, з якими підтримую звʼязок і до сьогодні.

Напевне, саме робота в цій компанії заклала низку фундаментальних навичок, що не раз ставали мені в пригоді в майбутній кар’єрі: самостійність у вирішенні проблем, базове продуктове мислення, комунікація із замовниками та підлеглими.

TLDR: Якщо вам більше подобається відеоформат, пропоную почати ознайомлення з цього ролика:

Історія створення

У далекому 2020-му мій друг Андрій запропонував започаткувати новий невеличкий стартап — сайт кіберспортивної статистики. Знаючи, що Андрій — це майстер стратегічного мислення, в мене не було жодного сумніву в успішності проєкту. Тому я одразу погодився. Зустрілися ми з ним у ресторані, де я, надивившись фільмів про Кремнієву долину, намалював на серветці початкову архітектуру сервісу. Загалом це багато розповідає, що ми тоді знали про IT-бізнес узагалі :)

За всю історію ведення цього вебсайту я декілька разів мігрував між різними хмарами: від 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

Для того, щоби зробити життя простіше, я впровадив до сервісу функціонал подібний до 1-Click Apps, що мають інші популярні платформи.

Сьогодні це імплементовано як набір шаблонів для сервісів і я вже маю із десяток конфігурацій: від баз даних до аналітики та CMS.

Як це працює, можна побачити на прикладі Wordpress. Від користувача вимагається лише ввести параметри запуску (адреса, де має крутитись WP, та паролі до сервісів).

Що ж далі?

Наразі я в стадії пошуку ідей, як покращити продукт та куди його розвивати. Буду вдячний, якщо спробуєте сервіс та дасте чесний фідбек. Зірочки на GitHub теж приймаються. ;)

Щоб підсумувати, пропоную вам особисто спробувати розгорнути свій сервіс за допомогою Ptah.sh. Якщо бажаєте стежити за процесом розробки, запрошую долучитися в таких мережах:

А які плани?

Загалом з планами можна ознайомитись на GitHub: я намагаюсь групувати тікети в майлстоуни.

Якщо ж дивитися з висоти пташиного польоту, то хочу втілити такі ідеї:

  • real-time оновлення статусів завдань, що виконуються агентом (зараз потрібно тицяти F5);
  • упровадити можливість налаштування експорту логів у systemd та сумісні з AWS сховища;
  • моніторинг серверних ресурсів (CPU/RAM/Disk)
  • uptime моніторинг (з різних геолокацій)
  • s3-compatible сховище для бекапів

Дякую!

👍ПодобаєтьсяСподобалось6
До обраногоВ обраному1
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Дуже не вникав в цей проект але це опенсорс то поставив плюс, років 5-7 тому ніби і той портейнер міг оперувати не просто контейнером а аплікацією де могла бути апка і база і ще купа всього, де також купа варсів вводилась до сетапу а далі там та вся магія відбувалась.
В цілому для мене таке вже вимерло, IAC і всі ці діла, а не мишкою тикати, k0s, k3s вирішують всі проблеми якщо це щось не велике. Та і всякі номади є як оркестратори докера або просто апок.

Дяка.

В цілому для мене таке вже вимерло, IAC і всі ці діла, а не мишкою тикати, k0s, k3s вирішують всі проблеми якщо це щось не велике. Та і всякі номади є як оркестратори докера або просто апок.

Ентерпрайзи точно мають йти цією дорогою.

Місце ж моєму проєкту там, де немає «дорогих» девопсів, що будуть підтримувати життєздатність k8s кластерів: малий та середній бізнес. ;)

Там, де є кілька програмістів, або невеликий відділ, або самостійні команди всередині більшої компанії, і кидати робочі години в інфраструктуру немає можливості. Окрім того, вимоги до ресурсів в Swarm трохи менші (я би сказав, на порядок). Як вже відповідав тезці, Ptah.sh ближчий до PaaS (як Heroku), аніж до запускалки контейнерів, бо зверху вже є, за замовчуванням, реверс-проксі (+ легкий інтерфейс бекапів) та відповідні важелі для керування цим оркестром.

---

Хоча сам Docker Swarm, теоретично, скейлиться на сотні машин, проте не бачу сенсу його в такому вигляді юзати тоді, бо із вірогідністю 80% там потрібно буде добре так шаманити конфіги всього, до чого тільки дотягнешся.

---

Пізніше (скоріш за все, наступного року) теж зашаманю в цей сервіс конфіги, API та CLI, щоби можна було ще простіше автоматизувати будь-яку операцію.

Зараз із API лише «задеплой, будь ласка, ось цей контейнер в цей сервіс і встанови нові змінні». :)

Хіба Портейнер не робить все це і багато іншого?

А хіба робить? :)

Бекапи роби руками
github.com/...​ortainer/discussions/9388

Реверс-проксі — сам піднімай налаштовуй.

Мій сервіс, приймаючи декотрі рішення за користувача, надає більш зручний інтерфейс, порівняно із конкурентами. Бо ptah.sh це не про менеджмент контейнерів, а про швидкий та легкий деплоймент сервісів. Цільова аудиторія — малий та середній бізнес, тому намагаюсь максимально зрізати кути, де можливо.

Загалом, питання дивне. За таким принципом, мали би по одній монополії на кожен вид товару/сервісу. Нащо нам Google Cloud, якщо вже є AWS? ;)

А хіба робить? :)

Ну, портейнер робить все те саме, що робить звичайний докер + сварм. Особисто мені ще подобається той факт, що портейнер тепер працює з подменом. А для складних проектів я використовую kubernetes на основі Talos Linux — ультимативне рішення в плані безпеки і автоматизації.

Бекапи роби руками

Ну, я прочитав як робить бекапи ptah (ptah.sh/...​/services/#backup-command) і не дуже схоже, що це рішення є універсальним. Наприклад, бекап TDEngine так не зробити.

Реверс-проксі — сам піднімай налаштовуй.

npm встановлюється як звичайний контейнер, а для чогось складнішого, то в будь-якому випадку прийдеться обмазуватись конфігами.

Я зрозумів. Ще один клоун, який зразу зливається, коли його мокають в його ж гівно.

а, тобто nginxproxymanager.com а не npm? навчись на майбутнє може назви повністю писати)

Дядя, ця штука буквально відома під абревіатурою NPM. Те, що ти вперше про це почув, і зразу біжиш щось комусь втирати, тільки говорить про твою обізнаність в ситуації.

Ну, портейнер робить все те саме, що робить звичайний докер + сварм

Отже, не робить. :)

Ptah.sh робить все, що робить Docker Swarm і більше.

не дуже схоже, що це рішення є універсальним. Наприклад, бекап TDEngine так не зробити.

Є docs.tdengine.com/cloud/tools/taosdump , тож налаштувати бекап це справа двох хвилин (якщо працювали з taosdump; хвилин 15-20 — якщо ніколи його не бачили). Ptah.sh дозволяє задавати довільні команди для створення бекапів (а якщо використати «конфіг», то можна кілометровий скрипт бекапу зробити), тож рішення, навпаки, максимально універсальне.

А для складних проектів я використовую kubernetes на основі Talos Linux
npm встановлюється як звичайний контейнер, а для чогось складнішого, то в будь-якому випадку прийдеться обмазуватись конфігами.

«Складніші проєкти» це не цільова аудиторія мого сервісу. Моя ЦА така ж сама, як в Heroku: малий та середній бізнес. Звідси і йдуть всі рішення щодо взаємодії користувача із сервісом.

Завдяки маяку, у вигляді Heroku, для запуску сервісу в «підпапці» або створення реврайтів-редіректів не потрібно йти в конфіг. Все налаштовується на етапі створення сервісу в системі і при зберіганні оновлюється конфіг Caddy.

Проте, ніхто не забороняє «обмазуватись конфігами», але, знову ж таки, 90% малого бізнесу це взагалі не цікавить. :)

P.S. «npm» сьогодні це таки «node package manager», а не достатньо маловідомий «nginxproxymanager».

Є docs.tdengine.com/cloud/tools/taosdump , тож налаштувати бекап це справа двох хвилин (якщо працювали з taosdump; хвилин 15-20 — якщо ніколи його не бачили).

Ну, це ви прочитали в документації, а я цю систему використовую в роботі кожного дня. Коли ти сам білдиш свій образ з taos, то ніякого taosdump там і не буде (про це в доках також написано), як і не буде більшості повсякдневних тулів в образах на основі альпайн, слім чи балсай. Тому тут єдиний варіант бекапити змаунчений вольюм.

P.S. «npm» сьогодні це таки «node package manager», а не достатньо маловідомий «nginxproxymanager».

З вам не погодиться більша частина учасників r/selfhosted, r/homelab та інших сабів, де популярна ця тула.

Ну, це ви прочитали в документації

А де ж ще мені прочитати було? ;)

Коли ти сам білдиш свій образ з taos

... то ти, скоріш за все, не цільова аудиторія сервісу.

Як це вирішується в Portainer?

Star History мабуть краще малювати на gnuplot або його обгортках

Я обрав простоту. :)

Воно безкоштовне, не вимагає жодних налаштувань і робить свою роботу.

Підписатись на коментарі