Анонс розыгрыша книг по программированию и моя небольшая история

18 июня будет два года как я создал сообщество "Код на салфетке". Сразу оговорюсь, что это некоммерческая история и возникло оно как решение важной для меня проблемы: "недостаток информации для начинающего разработчика". В процессе моего обучения и развития я сталкивался с различными нюансами, которые решались достаточно просто, но найти "комплексный ответ" зачастую было очень трудной задачей.

Каждый четверг я выпускал новые публикации, потом эту идею подхватили мои товарищи и мы начали чередовать наши статьи. За эти два года на телеграм канал "Код на салфетке" подписалось больше тысячи человек и я решил, что в качестве благодарности за внимание - устрою честный розыгрыш 9-ти книг по программированию. Подробности конкурса опубликую немного позже, но поучаствовать может кто угодно.

За эти два года мне в личку и в чат Telegram-канала довольно часто пишут новички и их вопросы можно разделить на две категории:

  1. Вопросы по опубликованным гайдам.

  2. Вопросы по деплою проекта.

Если с первой категорией все понятно - разбираемся в проблеме и решаем её, то по вопросам второй категории все немного сложнее, т.к. новичок написавший своего первого бота, как правило, испытывает трудности на всех этапах. Если человек уже знаком с Linux или Docker, то его достаточно направить, подсказать ошибки и он разберётся в процессе, то начинающий программист, написавший своего первого бота будет испытывать трудности на всех этапах.

В начале года передо мной стояла задача помочь в деплое нескольких сервисов на TrueNAS'е с предустановленным Portainer. Тогда я отнесся к этому GUI довольно скептически:

В тот момент мне показалось, что Portainer это какой-то Docker для ленивых, я больше предпочитаю работать с консолью, настраивать все руками, не смотря на то, что это может занять какое-то время, а то и силы. Проще говоря, я не сразу распознал практической полезности Portainer.

Буквально на днях, ко мне обратился парнишка, который спрашивал где лучше взять сервер для нескольких Telegram-ботов и какая нужна для этого конфигурация. Он честно признался, что времени разбираться у него нет и ему надо "задеплоить" как можно быстрее. Рассказав про сервера и хостинги которые использую или использовал я, вспомнил про Portainer, которым пользовался при настройке сервера с TrueNAS, а также несколько статей с Хабр о Docker-хостингах. Поискав решения, наткнулся на DockerHosting.ru, предоставляющий VPS с установленным Portainer. Меня зацепила цена и я решил изучить вопрос подробнее и на писать эту статью.

В этой статье мы рассмотрим сервис DockerHosting.ru, создание сервера и деплой проекта используя Portainer и Git. Основное внимание статьи будет отведено именно работе с Portainer, она подойдёт как для работы на хостинге, так и желающим развернуть свой собственный self-hosted Portainer.


Знакомство с сервисом DockerHosting.ru

Ключевые особенности:

  • 2 в 1 - предоставляют обычный VPS-сервер с доступом по SSH, при этом на него предустанавливается Portainer.

  • Бесплатный IPv4 - многие хостинги перешли на отдельную оплату IP-адреса, так ещё и не маленькую, тут же он включён в стоимость.

  • Цена - цены серверов в районе низа рынка, что очень приятно. Да, они не самые мощные, но полагаю, это дело времени и роста. Чуть ниже проведу сравнение и результаты весьма интересные.

На данный момент доступно четыре тарифа:

  • 1 ядро x 2600 MHz​, 2 Гб RAM​, 15 Гб SSD NVMe​ - 99 рублей

  • 2 ядро x 2600 MHz​, 4 Гб RAM​, 40 Гб SSD NVMe​ - 250 рублей

  • 4 ядра x 2600 MHz​, 8 Гб RAM​, 80 Гб SSD NVMe​ - 500 рублей

  • 6 ядер x 2600 MHz​, 12 Гб RAM​, 100 Гб SSD NVMe​ - 750 рублей

Также, стоит упомянуть, что после регистрации на баланс начисляется 98 рублей, т.е. достаточно пополнить всего на 1 рубль, чтобы купить минимальный сервер на 1 месяц. Честно, не знаю как долго продлится такая "халява", но это определённо плюс, поскольку часто хочется "пощупать" сервер, а тестовых не выдают.

Синтетическое сравнение

У меня есть несколько VPS, и интересно сравнить производительность самого дешевого с моими.

Сравнение будет не честным (сервера имеют разную конфигурацию) и синтетическим (искуственные, не реальные, сценарии), но примерно даст представление о возможностях сервера.Претенденты:

  1. DockerHosting.ru - 1 ядро x 2600 MHz​, 2 Гб RAM​, 15 Гб SSD NVMe - 99 рублей.

  2. appletec.ru - 2 ядра x 5500 MHz​, 5 Гб RAM​, 60 Гб SSD NVMe - 1190 рублей.

  3. cloud.ru - 2 ядра x 3000 MHz​, 4 Гб RAM​, 30 Гб SSD NVMe - 150 рублей (за IP-адрес, сам сервер "бесплатный").

Sysbench CPU (1 000 000 операций, сек.)

Провайдер

Прогон 1

Прогон 2

Прогон 3

Среднее (сек.)

DockerHosting.ru

1.73

1.72

1.73

1.73

appletech.ru

11.00

10.95

11.00

10.98

cloud.ru

1.96

2.00

2.01

1.99

Sysbench Memory (1 КБ блоки, 1 ГБ общий объём, МБ/с)

Провайдер

Прогон 1

Прогон 2

Прогон 3

Среднее (МБ/с)

DockerHosting.ru

4 782 772.11

4 811 702.52

4 857 625.73

4 817 366.12

appletech.ru

8 978 307.24

9 076 383.44

9 046 622.64

9 033 104.44

cloud.ru

5 278 989.77

3 768 260.16

5 393 387.02

4 813 545.65

dd: запись 1 ГБ нулей

Провайдер

Скорость записи

DockerHosting.ru

3.9 GB/s

appletech.ru

5.5 GB/s

cloud.ru

74.9 MB/s

dd: чтение 1 ГБ нулей

Провайдер

Скорость чтения

DockerHosting.ru

4.0 GB/s

appletech.ru

4.4 GB/s

cloud.ru

75.8 MB/s

OpenSSL SHA256 speed (КБ/с)

Провайдер

16 Б

64 Б

256 Б

1 024 Б

8 192 Б

16 384 Б

DockerHosting.ru

42 155,19

111 988,84

239 468,71

327 985,15

363 880,45

363 025,75

appletech.ru

199 923,05

616 466,39

1 396 908,63

2 129 420,97

2 500 452,35

2 541 578,92

cloud.ru

49 446,59

135 127,83

280 135,94

372 784,81

432 010,58

430 784,51


Что такое Portainer

Docker - это стандарт, скорее даже, база, без которой трудно представить современные сервисы. Но чтобы им управлять: запускать контейнеры (ваши приложения), настраивать сети, следить за ресурсами – обычно нужно знать специфические команды и понимать принцип работы.

Подобные возможности это безусловно здорово, но может показаться сложным, если вы только начинаете свой путь.

Вот тут-то и появляется Portainer! По сути, это веб-интерфейс для управления Docker. Вместо того чтобы вручную печатать команды в окне терминала, вы получаете красивую визуальную панель управления.

Что это значит на практике?

  1. Все как на ладони: Вы видите список всех ваших запущенных контейнеров, образов, сетей и томов в одном месте. Ничего не потеряется.

  2. Запуск в пару кликов: Хотите запустить новый контейнер? Просто выберите нужный образ, нажмите пару кнопок, задайте базовые настройки – и готово! Portainer сам сформирует правильную команду за вас.

  3. Управление без страха: Остановить, перезапустить, посмотреть логи (сообщения от приложения), заглянуть внутрь контейнера – все эти действия становятся интуитивно понятными.

  4. Меньше ошибок: Визуальный интерфейс снижает риск опечаток в командах, которые могут привести к сбоям.

Почему это ОСОБЕННО важно для новичков?

Portainer значительно снижает порог входа. Вам не нужно с первого дня запоминать десятки Docker-команд. Вы можете начать работать с контейнерами, понимать их логику и нарабатывать опыт, используя удобный интерфейс. Это как учиться водить на машине с автоматической коробкой передач – сначала вы сосредотачиваетесь на самом главном (дороге), а не на сложных манипуляциях.

Тем не менее, более продвинутые могут "задеплоить" Portainer на своём сервере самостоятельно, т.к. Portainer имеет Open Source Community редакцию. Инструкция по установке доступна в документации. Учтите, что хоть Portainer и потребляет мало ресурсов, ему нужен быстрый диск для работы с контейнерами, если ваш сервер не обладает свободными ресурсами, можно обратить внимание на Docker-хостинги.

И вот ключевой момент: То, что Portainer уже предустановлен и готов к работе – это огромный плюс. Вам не придется тратить время и силы на его самостоятельную настройку. Открываете ссылку на Portainer, логинитесь – и сразу получаете в руки этот мощный и дружелюбный инструмент для управления вашими Docker-проектами. Это экономит ваше время и нервы, позволяя сосредоточиться на разработке и запуске приложений, а не на технических сложностях инфраструктуры.

По сути, Portainer – это ваш надежный помощник и переводчик в мире Docker, делающий управление контейнерами доступным и комфортным с самого начала.

Под капотом: Технические плюсы Portainer

Кроме удобства, Portainer дает несколько важных технических преимуществ "из коробки":

  1. Управление Docker Engine & Swarm/Kubernetes:

    • Portainer подключается напрямую к Docker Engine вашего сервера (или хоста) через его API.

    • Он понимает не только одиночные Docker-хосты, но и кластеры: Docker Swarm и даже Kubernetes (K8s). Portainer поможет управлять сервисами, нодами, стеками и секретами Swarm'а через понятный интерфейс. Для новичков это мощный задел на будущее.

  2. Централизованное управление окружениями:

    • Portainer позволяет добавить и управлять несколькими Docker-окружениями из одной панели. Это может быть ваш основной хост на хостинге, тестовый сервер и даже локальный Docker с вашего ноутбука. Всё видно и управляемо в одном месте.

  3. Удобное управление образами (Images):

    • Просмотр всех скачанных образов.

    • Легкий поиск и скачивание (pull) новых образов напрямую из Docker Hub или других регистров (Registry).

    • Возможность сборки (build) образов прямо из Dockerfile через интерфейс (удобно для начальных экспериментов).

  4. Расширенное управление контейнерами (Containers):

    • Запуск контейнеров с детальными настройками: переменные среды (Environment Variables)порты (Port Bindings)тома (Volumes/Bind Mounts)сети (Networks)ресурсы (CPU/Memory limits) – всё настраивается в формах, а не запоминанием флагов командной строки.

    • Просмотр логов (Logs) в реальном времени в удобном читаемом виде.

    • Консоль (Console) прямо в контейнер (как docker exec).

    • Быстрые действия: Старт, стоп, перезапуск, пауза, удаление – в один клик.

  5. Работа с томами (Volumes) и сетями (Networks):

    • Создание, просмотр и управление Docker Volume'ами (постоянное хранилище для данных контейнеров).

    • Настройка и управление Docker Network'ами (изоляция и взаимодействие контейнеров).

  6. Базовые функции безопасности и администрирования:

    • Аутентификация: Доступ к Portainer защищен логином/паролем.

    • Ролевая модель (RBAC - Role-Based Access Control): Можно создавать пользователей и назначать им роли (Админ, Помощник, Только чтение и т.д.), контролируя кто что может делать. Идеально для работы в команде или предоставления ограниченного доступа.

    • Аудит (Audit Logs): Portainer ведет журнал действий пользователей (кто, что и когда сделал).

  7. Легковесность:

    • Сам Portainer работает в своем собственном Docker-контейнере. Он очень мало потребляет ресурсов (CPU/RAM), что практически не сказывается на производительности ваших основных приложений на хостинге.

Я крайне ограничен в финансовых ресурсах и мои сервера обычно работают, не сказать, что на пределе, но используют большую часть имеющихся ресурсов. Этим меня заинтересовал Docker-хостинг, а если учесть возможность добавления не только локального Docker'а, но и удалённых, можно в одном портейнере сделать управление и мониторинг контейнеров на нескольких серверах.


Создание сервера

Чтобы создать свой первый VPS переходим в раздел "DOCKER VPS". На странице нажимаем кнопку "Создать VPS/VDS", расположенную в правой части экрана:

На открывшейся странице выбираем желаемую конфигурацию VPS. Я возьму самый дешевый, его с головой хватит для Telegram-бота без сложной логики:

Вводим название сервера и нажимаем "Создать сервер":

После создания, серверу будет присвоен IP-адрес, по которому можно подключиться к серверу, используя SSH, но этот момент мы опустим и сконцентрируемся на использовании Portainer.

После создания сервера на почту придёт письмо с данными для подключения по SSH, а также ссылка для открытия Portainer:

Переходим по указанному адресу. Откроется страница авторизации в Portainer:

После авторизации попадаем в сам Portainer:


Подготовка проекта

Чтобы развернуть проект в Portainer нужно подготовить:

  1. Dockerfile - который позволит Docker'у собрать на основе проекта образ.

  2. docker-compose.yaml - который позволит Docker'у запустить собранный образ, передать в него данные, следить за работой и много чего ещё.

  3. git-репозиторий - чтобы избежать взаимодействия с сервером по SSH, проект необходимо загрузить в git-репозиторий, например, в GitHub, GitLab или как в моём случае собственный на основе Gitea (если интересно, вот статья про деплой Gitea).

  4. (Дополнительно) Вынести все изменяемые параметры в .env-файл, например, для Telegram-бота это может быть токен, а для веб-сервиса URL базы данных.

На самом деле их может быть больше, но они требуют взаимодействия с сервером по SSH, поэтому сосредоточимся на пунктах описанных выше.

Dockerfile

Dockerfile — это конфигурационный файл с инструкциями (шагами) для сборки Docker-образа (image).

Что такое образ (image)?

Это готовый "пакет" приложения или сервиса со всем необходимым для его запуска (код, зависимости, ОС). Например, когда вы поднимаете базу данных (PostgreSQL, MongoDB или даже Redis) через Docker, вы используете готовый образ из Docker Hub (как "коробочную версию" ПО от разработчика).

Зачем нужен Dockerfile?

Чтобы сделать то же самое со своим сервисом! Dockerfile — это "рецепт" создания кастомного образа.

В нем вы описываете:

  1. Какую основу взять (например, python:3.12).

  2. Что скопировать (ваш код, файлы конфигурации).

  3. Какие команды выполнить (установить зависимости, скомпилировать).

  4. Как запустить сервис.

Как это работает вместе?

  1. Dockerfile — собирает ваш сервис в образ (image).

  2. docker-compose.yaml — описывает, как запустить контейнер из этого образа (или готового образа БД), настроить сети, тома и т.д., но о нём в следующем блоке.

Пример базового Dockerfile для Python-проектов (на примере Dockerfile для Telegram-бота):

FROM python:3.12-slim  
  
RUN pip install --upgrade pip && pip install poetry  
  
WORKDIR /code  
  
COPY . /code  
  
RUN poetry install --no-interaction --no-ansi  
  
CMD ["poetry", "run", "app"]

Разберём каждое действие:

  • FROM - ключевое слово. Указывает на используемый базовый образ:

    • python - название базового образа. В данном примере это образ с установленным Python. Также могут быть другие базовые образы, например node или alpine.

    • 3.12-slim - версия образа. В данном примере она состоит из двух частей: 3.12 и приставки slim. Узнать актуальную версию базового образа можно на Docker Hub

  • RUN - ключевое слово. Выполняет указанную команду в виртуальном терминале образа. В данном примере таких команд две:

    • pip install --upgrade pip && pip install poetry - обновление менеджера пакетов pip и установка менеджера проектов poetry.

    • RUN poetry install --no-interaction --no-ansi - инициализация poetry-окружения с установкой зависимостей проекта.

  • WORKDIR - ключевое слово. Указывает на рабочий каталог. В данном примере это /code, следовательно, все дальнейшие команды и действия будут выполняться относительно этого пути.

  • COPY - ключевое слово. Определяет, что скопировать из локальной директории (оттуда, где запущен процесс сборки) внутрь контейнера. В данном примере . это откуда копируем, а /code целевой каталог.

  • CMD - ключевое слово. Указывает на то, какая команда будет выполнена при запуске контейнера с этим образом. В данном примере запускается проект, используя poetry, но может быть любая, например, python -m main.py - ["python", "-m", "main.py"]

Создайте этот файл в корне проекта.
Обратите внимание! Dockerfile это и есть название файла, без расширения.

docker-compose.yaml

docker-compose.yaml (или docker-compose.yml) — это "дирижер оркестра" для Docker. Он описывает все сервисы (контейнеры), которые должны работать вместе как единое приложение, и то, как они взаимодействуют.

Простыми словами:
Если Dockerfile — это рецепт приготовления одного блюда (образа), то docker-compose.yaml — это меню всего ужина с инструкциями, как и в какой последовательности подавать блюда.

Зачем это нужно?

Представьте, что вашему приложению нужны:

  1. Веб-сервер (ваш кастомный образ из Dockerfile)

  2. База данных (готовый образ PostgreSQL из Docker Hub)

  3. Кэш (готовый образ Redis)

  4. Веб-сервер (готовый образ Caddy или NGINX)

Без docker-compose вам пришлось бы вручную запускать каждый контейнер отдельно, настраивать сеть между ними и т.д. С ним же вы просто описываете все компоненты в одном файле:

Пример базового docker-compose.yaml:

services:  
  bot:  
    build: .  
    container_name: image_bot  
    environment:  
      TELEGRAM_BOT_TOKEN: "${TELEGRAM_BOT_TOKEN}"  
      ADMIN_ID: "${ADMIN_ID}"  
    volumes:  
      - ./images:/code/images  
      - ./logs:/code/logs  
    restart: always

Разберём по порядку:

  • services - ключевое слово. Обозначает, что далее будут идти определения сервисов (контейнеров). Также есть и другие ключевые слова для высшего уровня вложенности: volumesnetworks, но в данном примере они нам не нужны.

  • bot - название сервиса. Его указываете самостоятельно, чтобы логически обозначить к чему относится этот сервис.

  • build - ключевое слово. Указывает где искать Dockerfile для сборки проекта. В данном примере указана точка ., значит он будет искать Dockerfile в той же директории, что и docker-compose.yaml.

  • container_name - ключевое слово. Определяет имя контейнера. По умолчанию имя контейнера формируется из <название_директории>_<название_сервиса>_<номер>, не совсем удобно.

  • environment - ключевое слово. Определяет, какие переменные окружения будут переданы внутрь запущенного контейнера, по аналогии с использованием .env-файла. В данном примере передаются два параметра: TELEGRAM_BOT_TOKEN и ADMIN_ID"${...}" означает, что значения будут подставлены из текущего окружения, подробнее об этом будет далее в статье.

  • volumes - ключевое слово. Определяет, какие локальные директории на сервере будут подключены внутри контейнера. В данном примере монтируются две директории: images и logs. Первая для того, чтобы можно было обновлять материалы бота, вторая, чтобы сохранялись логи, т.к. содержимое контейнера, если его не подключить локально, сбрасывается при пересоздании.

  • restart - ключевое слово. Определяет политику перезагрузки контейнера, в случае падения запущенного процесса. В данном примере указано always, т.е. если бот упадёт, контейнер будет автоматически перезагружен.

Создайте этот файл в корне проекта.

git-репозиторий

Размещение проекта в git-репозитории несёт в себе сразу несколько весомых плюсов:

  1. Актуальность. У вас всегда будет место с актуальной версией кода. Внесли изменения на ПК, отправили в репозиторий, переключились на ноутбук и подтянули изменения.

  2. Автоматическое обновление. Portainer поддерживает автоматическое обновление запущенных контейнеров получая изменения из git-репозитория. Это в какой-то степени избавляет от необходимости прописывания CI/CD пайплайнов или ручного обновления на сервере.

  3. История версий. Не относится к репозиторию напрямую, а к git в целом. Вы сможете в любой момент откатиться на предыдущий этап изменений, если что-то пошло не так.

Подойдёт любой git-репозиторий, от GitHub и GitLab до Gitflick или GitVerse. Я буду использовать собственный git-репозиторий на основе Gitea.

Пример базовых команд для инициализации локального git и отправке изменений в репозиторий:

git init
git checkout -b main
git add README.md
git commit -m "first commit"
git remote add origin https://git.pressanybutton.ru/proDream/imagebot.git
git push -u origin main

Разберём команды:

  1. git init - инициализирует локальный git. В процессе будет создана скрытая директория .git.

  2. git checkout -b main - переключение на ветку main.

  3. git add <файл_или_директория> - добавлет указанные файлы в отслеживание git. Можно указать директорию или конкретные файлы, а можно указать всё, что есть в директории добавив ключ -A - git add -AОбратите внимание! Если добавлять все файлы, то могут добавиться ненужные файлы конфигурации IDE или ещё что-то, чему в git не место, для этого используется дополнительный файл .gitignore, в котором описываются директории и файлы, которые не попадут в git.

  4. git commit -m "<комментарий_коммита>" - создаёт коммит (так сказать снимок изменений), после аттрибута -m можно указать комментарий коммита.

  5. git remote add origin <ссылка_на_репозиторий> - прикрепляет к локальному git ссылку на удалённый репозиторий.

  6. git push -u origin main - отправка изменений в удалённый git-репозиторий. Выполняется один раз, чтобы указать связь текущей ветки с удалённой, после этого достаточно будет git push.

Пример проекта в репозитории:


Деплой проекта

Подготовили файлы для Docker? Создали git-репозиторий? Отилчно! Всё готов для деплоя!

Возвращаемся в Portainer. На главной странице нажимаем по значку докера по середине экрана с текстом "local":

Попадаем в панель управления установленным на сервере Docker. Тут выбираем "Stacks", пункт есть в левой панели, а также по центру самый первый блок:

На открывшейся странице увидим список всех запущенных "стаков". Stacks - это запущенные Docker Compose, в которых может быть как один контейнер (как в нашем примере ранее), так и сразу несколько, например, сайт + БД + Redis и так далее.

Нажимаем "Add stack":

На открывшейся странице нас встречает редактор создания "стака":

Сразу переключаемся на третий метод сборки "Repository":

Перед тем, как заполнять, на скрине выше есть важный переключатель "Authentication". Если вас приватный репозиторий (а это скорее всего так), нажмите на переключатель:

Начнём заполнять то, что на скриншоте выше:

  • Name - название "стака". Указывайте понятное для вас название, чтобы не запутаться, если будет несколько развёрнутых проектов. Заполнять в нижнем регистре!

  • Username - ваш логин чётной записи в git-репозитории.

  • Personal Access Token - сюда вводится пароль учётной записи в git-репозитории, одннако, многие сервисы прекращают доступ к репозиторию по паролю, для этого нужно генерировать PAT (Personal Access Token) в настройках учётной записи.

  • Repository URL - указываем ссылку на репозиторий.

  • Repository reference - если у вас основная ветка в git main - оставляем как есть, иначе прописываем refs/heads/<название_ветки>.

  • Compose path - указываем путь до docker-compose.yaml относительно корня проекта. Если он в корне, то прокто указываем корректное имя файла, если в другой директории, например docker/docker-compose.yaml, так и прописываем. В моём случае используется .yaml, а не .yml.

Прокручиваем вниз до следующих полей:

Тут нам интересны два блока: GitOps updates и Environment variables.

GitOps updates

Если включить, то Portainer будет автоматически проверять наличие изменений в репозитории и обновлять контейнеры при наличии. Давайте включим:

Открывается выбор настроек.
Нам доступно всего две:

  1. Mechanism - способ проверки изменений:

    • Polling - Portainer будет самостоятельно проверять изменения исходя из установленной частоты проверки.

    • Webhook - инициализация проверки изменений при отправке запроса на указанный URL. Удобно для CI/CD.

  2. Fetch interval - актуален для механизма Polling. Устанавливает частоту проверки репозитория на наличие изменений. По умолчанию установлено 5 минут.

Environment variables

В этом блоке устанавливаются переменные окружения. Именно отсюда в docker-compose.yaml будет подставлено значение вместо "${...}".

Есть три способа добавления:

  1. Самый простой - нажать на кнопку "Load variables from .env file". Название говорит само за себя - нажав на кнопку, можно выбрать локальный .env-файл с прописанными переменными.

  2. Удобный - нажать на кнопку "Advanced mode" в котором откроется редактор. нужно прописать используемые переменные в формате <ключ>=<значение>, например ADMIN_ID=123456.

  3. Стандартный - нажать на кнопку "Add an environment variable". В этом случае появится поле для ключа и значения. Каждое последующее нажатие кнопки будет добавлять поле.

Пример добавления вторым способом:

Пример добавления третьим способом:

После того, как всё заполнили нажимаем "Deploy the stack".

Начнётся процесс создания образа и контейнера. Минус портейнера в том, что нигде не отображается процесс запуска, нужно просто ждать.

По окончании процесса нам перенаправит на страницу со всеми запущенными "стаками", если этого не произошло и кнопка "Deploy the stack" стала снова активна, значит произошла какая-то ошибка. Посмотреть уведомления об ошибках можно прокрутив страницу на самый верх и нажав в правом верхнем углу на колокольчик:

Если всё хорошо, то увидим такую страницу:

Бот отрапортовал о своём запуске!


Заключение

Может показаться, что это долго, столько действий, по факту же, это всё занимает не больше 10 минут. Подготовить проект и заполнить поля в Portainer. При этом не обязательно знать как работать с VPS (но желательно научиться!), всё готово к запуску практически из "коробки".

Ну а я для себя открыл новый вид хостинга - Docker-хостинг. Если будет нужно что-то быстро развернуть или использовать как dev-сервер - DockerHosting.ru меня в этом плане полностью устраивает, особенно его цена!

Мы стараемся делать интересный и, надеюсь, полезный контент. Заходите в наш Telegram‑канал «Код на салфетке» 18-го июня на розыгрыш книг (и кое-чего ещё!), будет весело!

Комментарии (14)


  1. VictorVangeli
    12.06.2025 09:40

    Portainer и правда хорошая штука, а в связке с различными Docker хостингами это отличная идея для тестовых стендов

    Спасибо за статью!


    1. proDream Автор
      12.06.2025 09:40

      Мне теперь больше интересно попробовать его как "панель управления" докерами на разных серверах)


      1. VictorVangeli
        12.06.2025 09:40

        А он разве умеет так? Блин, если да, то это очень круто


        1. proDream Автор
          12.06.2025 09:40

          Да) И ещё интересно попробовать его управление докерами на серваках в связке с CI, чтоб стучаться в портейнер и делать дела, а не подключаться к каждому по SSH.


      1. Negash
        12.06.2025 09:40

        Rancher 1.x так делал


        1. proDream Автор
          12.06.2025 09:40

          Погуглил, он я полагаю больше для кубера? У меня пока нет необходимости в кубере, композов хватает с головой.


          1. Negash
            12.06.2025 09:40

            Rancher 1.x а не 2.х, первая версия уже полгода или больше как легаси, но было круто управлять кластером докера, без докер сварм


  1. Arduinum
    12.06.2025 09:40

    Думаю удобно для всяких тестов и dev серверов. Чтоб поднять по быстрому и показать.


    1. proDream Автор
      12.06.2025 09:40

      Нет ничего более постоянного, чем временное =)


  1. maxcoolmakarov
    12.06.2025 09:40

    Для работы тг бота совсем не нужен свой белый IP. Ещё и производить столько махинаций. Можно воспользоваться хероку подобными сервисами, например amvera.ru и задеплоить бота в пару кликов.


    1. aleksxx
      12.06.2025 09:40

      Не все так однозначно :)


    1. proDream Автор
      12.06.2025 09:40

      Бот всего лишь интерфейс взаимодействия с пользователем. Если не брать в расчёт простейших ботов отвечающих на сообщения предзаготовленными сообщениями, то они могут как много ресурсов потреблять за счёт большой внутренней логике, так и работают такие обычно не на polling, а на webhook сценарии, с реализацией ещё и API.
      Ну и у упомянутой амверы цены ни разу не демократичные.


  1. vsof
    12.06.2025 09:40

    Спасибо за подробную информацию, с Portainer-ом давно работаю, но вот некоторые тонкости не использовал, спасибо


    1. proDream Автор
      12.06.2025 09:40

      А мне он стал интересен) Планирую в несколько статей дальше углубиться в его работу =)