Как развернуть Deno на Digital Ocean
Digital Ocean — популярный поставщик облачной инфраструктуры, предлагающий различные хостинг-услуги, начиная от сетей и вычислений и заканчивая хранением.
Вот пошаговое руководство по развертыванию приложения Deno на Digital Ocean с использованием Docker и GitHub Actions.
Для этого требуются:
dockerкомандная строка- аккаунт GitHub
- аккаунт Digital Ocean
doctlкомандная строка
Создать Dockerfile и docker-compose.yml
Для фокусировки на развертывании наше приложение будет просто main.ts файлом, возвращающим строку в качестве HTTP-ответа:
import { Application } from "https://deno.land/x/oak/mod.ts";
const app = new Application();
app.use((ctx) => {
ctx.response.body = "Hello from Deno and Digital Ocean!";
});
await app.listen({ port: 8000 });
Затем, мы создадим два файла — Dockerfile и docker-compose.yml — для сборки Docker-изображения.
В наш Dockerfile, добавим:
FROM denoland/deno
EXPOSE 8000
WORKDIR /app
ADD . /app
RUN deno install --entrypoint main.ts
CMD ["run", "--allow-net", "main.ts"]
Затем, в наш docker-compose.yml, добавим:
version: "3"
services:
web:
build: .
container_name: deno-container
image: deno-image
ports:
- "8000:8000"
Давайте протестируем это локально, запустив docker compose -f docker-compose.yml build, затем docker compose up, и перейдя по ссылке localhost:8000.
Работает!
Сборка, маркировка и загрузка Docker-изображения в Digital Ocean Container Registry
Digital Ocean имеет собственный частный Container Registry, с помощью которого можно загружать и извлекать Docker-изображения. Для использования этого реестра, давайте установим и аутентифицируем doctl в командной строке.
После этого создадим новый частный реестр под названием deno-on-digital-ocean.
doctl registry create deno-on-digital-ocean
Используя наш Dockerfile и docker-compose.yml, мы соберем новое изображение, добавим ему метку и загрузим его в реестр. Обратите внимание, что docker-compose.yml будет называть сборку локально как deno-image.
docker compose -f docker-compose.yml build
Давайте добавим метку new:
docker tag deno-image registry.digitalocean.com/deno-on-digital-ocean/deno-image:new
Теперь мы можем загрузить его в реестр.
docker push registry.digitalocean.com/deno-on-digital-ocean/deno-image:new
Вы должны увидеть ваше новое deno-image с меткой new в вашем реестре контейнеров Digital Ocean:

Отлично!
Развертывание на Digital Ocean через SSH
После того, как наше deno-image находится в реестре, мы можем запустить его где угодно с помощью docker run. В данном случае мы запустим его в нашей Digital Ocean Droplet — их виртуальной машине.
На странице Droplet нажмите на свой Droplet, а затем console для подключения по SSH к виртуальной машине. (Или вы можете подключиться по SSH напрямую из вашей командной строки.)
Для извлечения deno-image изображения и его запуска, давайте выполним:
docker run -d --restart always -it -p 8000:8000 --name deno-image registry.digitalocean.com/deno-on-digital-ocean/deno-image:new
Используя наш браузер, перейдя по адресу Digital Ocean, мы видим:
Готово!
Автоматизация развертывания с помощью GitHub Actions
Давайте автоматизируем весь этот процесс с помощью GitHub Actions.
Сначала получим все необходимые переменные окружения для входа в doctl и подключения по SSH к Droplet:
- DIGITALOCEAN_ACCESS_TOKEN
- DIGITALOCEAN_HOST (IP-адрес вашего Droplet)
- DIGITALOCEAN_USERNAME (по умолчанию
root) - DIGITALOCEAN_SSHKEY (подробнее об этом ниже)
Генерация DIGITALOCEAN_SSHKEY
DIGITALOCEAN_SSHKEY — это закрытый ключ, где его открытый аналог существует на виртуальной машине в файле ~/.ssh/authorized_keys.
Для этого сначала выполним ssh-keygen на вашей локальной машине:
ssh-keygen
При запросе электронной почты, обязательно используйте адрес электронной почты GitHub для правильной аутентификации GitHub Action. Ваш окончательный вывод должен быть похож на этот:
Output
Your identification has been saved in /your_home/.ssh/id_rsa
Your public key has been saved in /your_home/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:/hk7MJ5n5aiqdfTVUZr+2Qt+qCiS7BIm5Iv0dxrc3ks user@host
The key's randomart image is:
+---[RSA 3072]----+
| .|
| + |
| + |
| . o . |
|o S . o |
| + o. .oo. .. .o|
|o = oooooEo+ ...o|
|.. o *o+=.*+o....|
| =+=ooB=o.... |
+----[SHA256]-----+
Далее, нам нужно загрузить сгенерированный открытый ключ на ваш Droplet. Вы можете использовать ssh-copy-id или вручную скопировать его, подключиться к Droplet по SSH и вставить его в ~/.ssh/authorized_keys.
Используя ssh-copy-id:
ssh-copy-id {{ username }}@{{ host }}
Эта команда попросит вас ввести пароль. Обратите внимание, что это автоматически скопирует id_rsa.pub ключ с вашей локальной машины и вставит его в файл ~/.ssh/authorized_keys вашего Droplet. Если вы назвали свой ключ иначе, чем id_rsa, вы можете передать его с помощью флага -i к команде:
ssh-copy-id -i ~/.ssh/mykey {{ username }}@{{ host }}
Чтобы проверить, выполнено ли это успешно:
ssh -i ~/.ssh/mykey {{ username }}@{{ host }}
Отлично!
Определить файл yml
Последний шаг — объединить все это. По сути, мы берем каждый шаг при ручном развертывании и добавляем их в файл GitHub Actions workflow yml:
name: Deploy to Digital Ocean
on:
push:
branches:
- main
env:
REGISTRY: "registry.digitalocean.com/deno-on-digital-ocean"
IMAGE_NAME: "deno-image"
jobs:
build_and_push:
name: Build, Push, and Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout main
uses: actions/checkout@v2
- name: Set $TAG from shortened sha
run: echo "TAG=`echo ${GITHUB_SHA} | cut -c1-8`" >> $GITHUB_ENV
- name: Build container image
run: docker compose -f docker-compose.yml build
- name: Tag container image
run: docker tag ${{ env.IMAGE_NAME }} ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.TAG }}
- name: Install `doctl`
uses: digitalocean/action-doctl@v2
with:
token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}
- name: Log in to Digital Ocean Container Registry
run: doctl registry login --expiry-seconds 600
- name: Push image to Digital Ocean Container Registry
run: docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.TAG }}
- name: Deploy via SSH
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.DIGITALOCEAN_HOST }}
username: ${{ secrets.DIGITALOCEAN_USERNAME }}
key: ${{ secrets.DIGITALOCEAN_SSHKEY }}
script: |
# Login to Digital Ocean Container Registry
docker login -u ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} -p ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} registry.digitalocean.com
# Stop and remove a running image.
docker stop ${{ env.IMAGE_NAME }}
docker rm ${{ env.IMAGE_NAME }}
# Run a new container from a new image
docker run -d --restart always -it -p 8000:8000 --name ${{ env.IMAGE_NAME }} ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.TAG }}
При отправке изменений в GitHub, этот файл yml автоматически обнаруживается, вызывая действие Deploy.
© 2018–2024 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/tutorials/digital_ocean