Когда я впервые столкнулась с задачей автоматизации доставки кода на 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
.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"
- Публичный ключ () добавляю на VPS в
.pub
.~/.ssh/authorized_keys
- Приватный ключ () добавляю в Bitbucket как
id_rsa
.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
Отлично! Вот Часть 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 уведомляет → сайт обновлён.
Экономия времени? Колоссальная.
Ошибок? Почти нет.
Покой? Почти дзен 😌
За стабильность — с бонусом
Долгосрочные клиенты получают больше: +1 месяц в подарок по промокоду