Spec-Zone.ru › Deno 2

Как развернуть Deno на Digital Ocean

Digital Ocean — популярный поставщик облачной инфраструктуры, предлагающий различные хостинг-услуги, начиная от сетей и вычислений и заканчивая хранением.

Вот пошаговое руководство по развертыванию приложения Deno на Digital Ocean с использованием Docker и GitHub Actions.

Для этого требуются:

  • docker командная строка
  • аккаунт GitHub
  • аккаунт Digital Ocean
  • doctl командная строка

Создать Dockerfile и docker-compose.yml

Для фокусировки на развертывании наше приложение будет просто main.ts файлом, возвращающим строку в качестве HTTP-ответа:

main.ts
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, добавим:

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.

Hello from localhost

Работает!

Сборка, маркировка и загрузка 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:

New deno image on Digital Ocean container registry

Отлично!

Развертывание на 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, мы видим:

Hello from Deno and 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API