Когда я впервые столкнулась с задачей автоматизации доставки кода на VPS, выбор пал на Bitbucket Pipelines. Он простой, встроен в репозиторий и не требует отдельной установки Jenkins, GitLab CI или других тяжеловесных решений. На выходе получился удобный и устойчивый CI/CD пайплайн, который я с тех пор многократно масштабировала под разные проекты.
Что нам нужно:
- Bitbucket-репозиторий с включёнными Pipelines
- VPS с доступом по SSH
- Docker или Nginx (по желанию)
- Скрипт деплоя или
rsync, если проект не в контейнерах
Что такое pipeline?
Pipeline — это последовательность шагов, которые выполняются при каждом коммите, пуше или pull-запросе. В контексте CI/CD (Continuous Integration/Continuous Delivery) пайплайн автоматизирует сборку, тестирование и деплой проекта.
В Bitbucket пайплайны описываются в YAML-файле .bitbucket-pipelines.yml, который лежит в корне проекта. Всё, что нужно — задать шаги: сборка, тесты, деплой, уведомления и т. д.
Мой конфиг .bitbucket-pipelines.yml
Вот пример того, как я настраиваю CI/CD pipeline для обычного Python + Flask проекта:
image: python:3.11
pipelines:
branches:
main:
- step:
name: Deploy to VPS
caches:
- pip
script:
- pip install -r requirements.txt
- scp -o StrictHostKeyChecking=no -r ./ myuser@your.vps.ip:/home/myuser/project
- ssh myuser@your.vps.ip 'cd /home/myuser/project && systemctl restart flask-app'
Здесь:
- устанавливаем зависимости,
- копируем проект на VPS по SSH,
- и перезапускаем systemd-сервис приложения.
Переменные окружения и SSH-доступ
Bitbucket позволяет безопасно хранить SSH-ключи и токены через интерфейс Repository Settings → Pipelines → Repository variables. Чтобы соединение scp и ssh в пайплайне работало, я:
- Создаю SSH-ключ командой:
ssh-keygen -t rsa -b 4096 -C "ci@bitbucket"
- Публичный ключ (
.pub) добавляю на VPS в~/.ssh/authorized_keys. - Приватный ключ (
id_rsa) добавляю в Bitbucket какDEPLOY_KEY. - В скрипте прописываю:
script:
- echo "$DEPLOY_KEY" > id_rsa
- chmod 600 id_rsa
- ssh -i id_rsa ...
Теперь деплой полностью автоматизирован, а доступ — защищён.
Деплой через Docker
Если проект упакован в Docker, пайплайн становится чище. Я обычно пушу образ в Docker Hub, а VPS тянет его сам:
pipelines:
default:
- step:
name: Build and Push Docker Image
script:
- docker build -t mydockerhubuser/myproject:latest .
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
- docker push mydockerhubuser/myproject:latest
А на сервере:
docker pull mydockerhubuser/myproject:latest
docker compose up -d
Нюансы и удобства
Bitbucket Pipelines умеет:
- делать разные пайплайны по веткам (
main,dev,release); - триггерить пайплайны вручную;
- интегрироваться с Slack / Telegram через webhook;
- логировать каждый шаг для отладки.
Также удобно, что можно задать startLimitBurst, restart=on-failure, RestartSec=5s в systemd, чтобы сервис перезапускался сам при падении (см. статью про auto-healing с systemd).
Отлично! Вот Часть 3/3 статьи по теме «Создание CI/CD пайплайна с Bitbucket + VPS» — логично завершённая, с финальными разделами и SEO-блоком.
Мониторинг CI/CD и логика откатов
Когда пайплайн готов, важно наблюдать за ним: вдруг один из шагов будет падать после обновлений зависимостей, изменения API, банального timeout.
Я использую Telegram-бота, который присылает мне сообщения об успехе или провале:
- curl -X POST https://api.telegram.org/bot$TG_TOKEN/sendMessage \
-d chat_id=$TG_CHAT_ID \
-d text=" Деплой успешно завершён на $BITBUCKET_BRANCH"
Добавляю это в after-script, чтобы знать, даже если всё упало.
Также на сервере у меня настроено:
- fail2ban — блокирует IP при подозрительной активности;
- Uptime Kuma — следит за тем, что сайт доступен;
- systemd с
Restart=on-failure, чтобы приложение не падало навсегда.
Когда стоит выбрать не Bitbucket Pipelines
Bitbucket отлично справляется с CI/CD, но у него есть ограничения:
- бесплатный тариф ограничен 50 минутами в месяц (хватает для простых проектов);
- иногда сложно настроить развёртывание на несколько серверов или сложные пайплайны.
В таких случаях можно:
- перейти на GitHub Actions (больше интеграций и шаблонов);
- использовать GitLab CI — там всё в одном: git + CI/CD + registry.
Я использовала Bitbucket Pipelines, когда:
- проект был на Flask или Laravel, с одним VPS;
- нужен был простой и понятный конфиг;
- хотелось не тратить лишнее время на Jenkins и т.д.
Что я думаю…
Создание CI/CD пайплайна через Bitbucket и VPS — это не так страшно, как кажется. Нужно один раз всё собрать, протестировать — и дальше разработка идёт в удовольствие: никаких «заходи на сервер, перезагрузи руками», никаких «ой, забыла скопировать .env».
На проекте у меня это выглядит так:
- пушу код → пайплайн собирает и деплоит → Telegram уведомляет → сайт обновлён.
Экономия времени? Колоссальная.
Ошибок? Почти нет.
Покой? Почти дзен 😌