Отже, у вас є API на TypeScript-NodeJS, розроблене на локальній машині, і ви думаєте: "Як мені розгорнути це у реальному світі?". Ви можете знайти різні посібники та відео, що показують, як використовувати різні сервіси, такі як AWS, GCE і навіть Heroku.
Хоча ви можете орендувати сервер, наприклад, EC2 інстанс і розгорнути додаток з допомогою NGINX, я вважаю, що це потребує багато попередньої налаштування, на яку у вас може не бути часу. Сьогодні ми хочемо доставляти додатки якнайшвидше, тому я покажу вам, як швидко розгорнути ваш додаток (і майбутні) з мінімальною конфігурацією за допомогою сервісу AWS, який називається Elastic Beanstalk (AWS EBS) і контейнерів Docker.
Трохи про EBS та Docker
EBS (Elastic Beanstalk) займається налаштуванням, конфігурацією та наданням інших сервісів AWS, таких як EC2 та балансування навантаження, для створення веб-сервісу для вас. Завдяки правильній конфігурації ви можете отримати свій додаток в робочому стані менше ніж за годину. Автоматизація Elastic Beanstalk допоможе уникнути помилок, які можуть виникнути, коли ви намагаєтеся налаштувати все самостійно.
Для тих, хто новачок у Docker, є кілька переваг від його використання, хоча я не буду занурюватися глибоко в це: ви можете мати передбачуване та ізольоване середовище, час на розгортання значно зменшиться, ви можете запускати своє середовище будь-де, де підтримуються контейнери, ваша конфігурація та інфраструктура можуть бути безперешкодно репліковані на інші додатки, які ви хочете розгорнути.
Перед тим, як почати
Я припускаю, що у вас вже є API на TypeScript, розроблене на вашій локальній машині, з вхідним файлом, який виглядає десь так. Я використовую фреймворк Express:
Ми також будемо використовувати Docker і docker-compose (для управління нашими різними середовищами). Перейдіть на сторінку Docker (https://www.docker.com/get-started), вам потрібно буде завантажити десктопний клієнт і зареєструватися. Для Windows і MacOS десктопний клієнт включає docker-compose, для Linux ви можете слідувати цьому посібнику для його установки: https://docs.docker.com/compose/install/.
Після того, як ви встановите docker і docker-compose, ви повинні мати змогу перевірити це в командному рядку:
> docker version
Client:
Cloud integration: 1.0.17
Version: 20.10.8
API version: 1.41
Go version: go1.16.6
Git commit: 3967b7d
Built: Fri Jul 30 19:55:20 2021
OS/Arch: darwin/amd64
Context: default> docker-compose version
docker-compose version 1.29.2, build 5becea4c
Нарешті, я припускаю, що у вас є доступ до облікового запису AWS Console. Якщо ні, створіть його, це безкоштовно, і ви отримаєте пільги Free tier на рік.
Поїхали!
Є кілька конфігураційних файлів, але терпіть, як тільки ви зрозумієте їх, ви зможете створювати їх за лічені хвилини, і вони заощадять вам багато часу в майбутньому.
- Створимо два файли:
Dockerfile
таDockerfile.dev
. Як ви могли здогадатися, один буде використовуватися для продакшн-середовища, а інший для нашого розробницького або локального середовища.
Розробницький Dockerfile
просто копіює файли в кореневу директорію образу і запускає yarn start
для запуску нашого серверу для розробки.
Для продакшн-Dockerfile
, ми, по суті, запускаємо два етапи:
Спочатку ми копіюємо файли, що використовуються для збірки проекту, і власне будуємо його. Потім встановлюємо тільки продакшн-залежності і копіюємо вміст каталогу dist
в кореневу папку. Нарешті, ми встановлюємо PM2, відкриваємо порт 8000 (це може бути будь-який порт, який вам подобається) і запускаємо сервер за допомогою PM2.
- Як тільки ми маємо ці файли, створимо ще три файли для
docker-compose
:docker-compose.override.yml
,docker-compose.prod.yml
іdocker-compose.yml
. Ці файли, по суті, скажуть Docker-compose, як збирати ваші образи.
Зараз ми створимо тільки один образ додатка, але ви можете використовувати docker-compose, щоб додавати інші образи, наприклад, образ бази даних до потоку docker.
# docker-compose.yml
version: "3.7"
services:
app:
container_name: app
# docker-compose.prod.yml
version: "3.7"
services:
app:
container_name: app
restart: always
build: .
env_file: .env
environment:
- PORT=${PORT}
ports:
- 80:8000
# docker-compose.override.yml
version: "3.7"
services:
app:
container_name: app
restart: always
build:
context: .
dockerfile: Dockerfile.dev
env_file: .env
environment:
- PORT=${PORT}
ports:
- 8000:8000
Отже, по суті, що ми робимо — це говоримо docker-compose використовувати файл переваг для dev середовища і prod файл для продакшн середовища (ви можете мати кілька таких файлів для інших середовищ або задач).
Нарешті, створимо файл .dockerignore
, щоб docker не враховував ці файли.
# .dockerignore
# Проект ігнорує
.vscode# Каталоги залежностей
node_modules/# Node Version Manager
.nvmrc# Yarn
yarn.lock# NPM
package-lock.json
- Окей, час протестувати це на нашій локальній машині! З цими конфігураціями ми повинні бути в змозі запустити наш проект локально за допомогою docker.
У вашому терміналі запустіть: docker-compose build
. Це може зайняти деякий час, якщо ви пам'ятаєте, docker встановить всі наші залежності для створення нового образу.
Якщо збірка була успішною, запустіть docker-compose up
, і в браузері перейдіть за адресою localhost
. Ви повинні побачити щось подібне:
Круто, правда? Docker відкриває порт 8000 додатка через порт 80, тому вам не потрібно вказувати порт на localhost, оскільки порт 80 є стандартним. Ви можете змінити цю поведінку у файлі docker-compose.override.yml
.
Час для AWS EBS
Добре! Тепер, коли ми маємо наш docker-образ, що працює на локальній машині, ми готові запустити його з AWS Elastic Beanstalk.
- Спочатку потрібно стиснути файли для завантаження в EBS, для цього запустіть команду
zip -r compressed.zip . -x '*node_modules*' -x '*dist*' -x '*.env*'
. Це створить файл з назвою compressed.zip, що містить весь ваш код, крім файлівnode_modules/
,dist/
та.env
. - Перейдіть до консоль AWS і відкрийте сервіс AWS EBS.
- Натисніть "Створити додаток".
- Заповніть поля, для платформи виберіть
Docker
та виберіть опціюЗавантажте свій код
. Вам буде запропоновано завантажити файл, виберіть стиснутий файл. - Нарешті, натисніть
Створити додаток
, і чекайте! Процес повинен зайняти 5-7 хвилин, після чого ви повинні побачити щось подібне:
Чудово! Ваш додаток тепер працює. Ви можете натискати на це довге посилання (повинно бути щось на зразок test.eba-bf4mq4sq.us-east-1.elasticbeanstalk.com**), щоб перевірити ваш додаток.
Що далі?
- Ви можете використати AWS Route53 для налаштування вашого власного домену для вашого додатка.
- Ви можете налаштувати pipeline CI/CD за допомогою AWS CodePipeline, щоб процес збірки та стиснення автоматично запускався, коли ви вносите зміни в репозиторій.
Перекладено з: Deploying a TypeScript NodeJS API to AWS Elastic Beanstalk with Docker