Развертываем приложение golang на fly.io

пятница, 13 января 2023 19:55:08, написал Admin

Недавно я узнал о замечательном бесплатном сервере для приложений fly.io
Развернул на нем приложение golang через Dockerfile. В общем-то все понравилось. Бесплатно дают несколько гигабайт места, и три приложения по 256 мб оперативки каждое. Я поднял веб-сервер и базу данных postgres. Почти пустая база данных отняла у меня 120 мб оперативки, а веб-сервер на go около 60 мб. Из минусов – если превысить лимиты, то спишут деньги.

 Итак, рассмотрим установку в семь шагов.

Шаг первый. Регистрация

Идем сюда https://fly.io/app/sign-up вводим имя, почту, пароль, регаемся, подтверждаем почту. Дальше есть проблема – нужна виза или мастер-кард, причем виртуальная не подошла. Российские карты понятно там не работают. Я раздобыл данные зарубежной карты, с неё ничего не списало, просто проверило. 

Шаг второй. Устанавливаем приложение

Под виндой это делается так. Запускается PowerShell и там команда 

iwr https://fly.io/install.ps1 -useb | iex

Шаг третий. Готовим Dockerfile

Сначала я попытался запустить приложение через сборку го. Как в этом руководстве https://fly.io/docs/languages-and-frameworks/golang/ - но у меня не получилось. Возможно из-за специфики моего приложения. Плюс мне не понравилось, что скачалось куча всего. Поэтому я решил сделать Dockerfile и оставить там только бинарники

Итоговый файл

FROM golang:alpine AS builder

ENV CGO_ENABLED 0

ENV GOOS linux

RUN apk update --no-cache && apk add --no-cache tzdata

WORKDIR /app

ADD go.mod .

ADD go.sum .

RUN go mod download

COPY . .

RUN go build -ldflags="-s -w" -o main main.go

FROM alpine

RUN apk update --no-cache && apk add --no-cache ca-certificates

COPY --from=builder /usr/share/zoneinfo/Europe/Moscow /usr/share/zoneinfo/Europe/Moscow

ENV TZ Europe/Moscow

WORKDIR /app

COPY --from=builder /app/main /app/main
COPY --from=builder /app/docker.env /app/.env

RUN mkdir data

EXPOSE 8080

CMD ["./main"]

Шаг четвертый. Подключаемся к бд

Через командную строку это делается так:

flyctl postgres connect -a apptest-db

Через графический интерфейс – через прокси флай. Для этого запустите команду 

flyctl proxy 5433:5432 --app apptest-db

В настройках pgAdmin введите в хост значение 127.0.0.1 (ни в коем случае не localhost!)

Импортируйте свой дамп в базу. Закройте админку, выйдите из прокси.

Шаг пятый. Создаем конфиг

В PowerShell (или Терминале) выполняем

flyctl auth login

Дальше выполняем

fly launch

На первом шаге попросить ввести имя приложения. Имя приложения не может содержать подчерк, только тире. Пусть будет apptest для примера.

На втором шаге попросит выбрать, из-под кого будет приложение, персональное или организации. Организации – значит вы можете опубликовать приложение у человека, который вас пригласил в команду.

На третьем шаге попросит выбрать локацию. Я выбрал 

Amsterdam, Netherlands (ams)

На четвертом шаге предложило создать Postgresql, я согласился. Там же покажет данные, по которым входить.

На пятом шаге предложит поставить редис. Я отказался, мне он не нужен.

На шестом шаге предложит сделать сразу же деплой. Откажитесь. 

В итоге получается конфиг такого содержания (файл fly.toml)

# fly.toml file generated for apptest
app = "apptest"
kill_signal = "SIGINT"
kill_timeout = 5
processes = []

[env]
[experimental]
  allowed_public_ports = []
  auto_rollback = true

[[services]]
  http_checks = []
  internal_port = 8080
  processes = ["app"]
  protocol = "tcp"
  script_checks = []
  [services.concurrency]
    hard_limit = 25
    soft_limit = 20
    type = "connections"

  [[services.ports]]
    force_https = true
    handlers = ["http"]
    port = 80

  [[services.ports]]
    handlers = ["tls", "http"]
    port = 443

  [[services.tcp_checks]]
    grace_period = "1s"
    interval = "15s"
    restart_limit = 0
    timeout = "2s" 

Шаг шестой. Собираем докер-образ

Выполняем сборку через обычный докер 

docker build -t apptest:v1 -f Dockerfile .

Дальше подключаемся к хранилищу fly:

flyctl auth docker

Регистрируем тег

docker tag apptest:v1 registry.fly.io/apptest:v1

Отправляем образ в хранилище:

docker push registry.fly.io/apptest:v1

Вписываем в конфиг (файл fly.toml) перед [env]

[build]
  image = "registry.fly.io/apptest:v1"

Этим мы указали, что не надо ничего собирать, надо сразу забирать готовый образ

Исполняем

fly deploy

Там должна быть ссылка на логи типа такого  https://fly.io/apps/apptest/monitoring

Ваше приложение должно занимать порт 8080.

Если веб-сервер не нужен, то снесите все строки ниже, после раздела [env]

Иначе будет падать по таймауту с ошибкой.

Шаг седьмой. Управление

Я долго не мог понять, как приостановить работу приложения. Оказывается, так:

fly scale count 0 -a apptest

Возобновить 

fly resume apptest

Удалить 

flyctl apps destroy apptest

На этом все.

 

golang go fly.io Golang
  

Поделиться статьей с друзьями:

  

Комментарии к статье