Развертывание приложения на VPS

Обзор

Данная документация описывает процесс развертывания приложения DevShip на виртуальном частном сервере (VPS) с использованием Docker. Наше приложение состоит из Laravel бэкенда и Next.js фронтенда, развертываемых в Docker-контейнерах.

Основные компоненты нашей системы развертывания:

  • Docker и Docker Compose для контейнеризации
  • Nginx в качестве обратного прокси-сервера
  • PostgreSQL для хранения данных
  • Скрипт автоматизации развертывания deploy-laravel-nextjs.sh

Автоматизированное развертывание с помощью скрипта

Общая информация о скрипте развертывания

Для упрощения процесса развертывания мы используем скрипт deploy-laravel-nextjs.sh, который автоматизирует следующие задачи:

  • Подключение к VPS по SSH
  • Создание и настройка swap файла (при необходимости)
  • Очистка сервера от старых контейнеров и освобождение места
  • Резервное копирование базы данных (по желанию)
  • Копирование файлов проекта на сервер
  • Настройка Nginx
  • Инициализация PostgreSQL
  • Сборка и запуск Docker-контейнеров
  • Проверка работоспособности развернутого приложения

Предварительные требования

Для использования скрипта развертывания вам потребуется:

  • VPS с Ubuntu 20.04 или новее
  • Правильно настроенный SSH-доступ к VPS
  • Доменное имя, указывающее на IP-адрес вашего VPS
  • Установленные локально: git, ssh, rsync

Использование скрипта развертывания

Процесс развертывания с использованием нашего скрипта выглядит следующим образом:

# Клонирование репозитория (если еще не клонирован)
git clone https://github.com/ваш-аккаунт/devship.git
cd devship

# Запуск скрипта развертывания
bash scripts/deploy-laravel-nextjs.sh

Скрипт запросит подтверждение для некоторых действий:

  • Выполнить ли очистку сервера для освобождения места (y/n)
  • Создать ли резервную копию базы данных перед развертыванием (y/n)

После завершения развертывания, скрипт выведет информацию о статусе и даст инструкции по проверке работоспособности и просмотру логов.

Адаптация скрипта для вашего VPS

Чтобы адаптировать скрипт для использования с вашим собственным VPS, необходимо внести некоторые изменения в начало скрипта:

#!/bin/bash
set -e

# Конфигурация - измените эти значения на свои
VPS_ALIAS="ваш-vps-alias"        # Алиас в SSH-конфигурации
DOMAIN="ваш-домен.ru"            # Ваш домен
PROJECT_DIR="/путь/к/проекту"    # Путь на VPS, куда будет копироваться проект

Настройка SSH для удобного доступа

Скрипт использует SSH-алиас для подключения к серверу. Вам нужно создать запись в файле ~/.ssh/config для вашего VPS:

# Добавьте в файл ~/.ssh/config
Host ваш-vps-alias
    HostName 123.456.789.10    # IP-адрес вашего VPS
    User root                  # или другой пользователь с правами sudo
    IdentityFile ~/.ssh/ваш_приватный_ключ

Также убедитесь, что ваш публичный ключ добавлен на сервер в файл ~/.ssh/authorized_keys.

Настройка переменных окружения

Создайте файл .env.production в корне проекта с необходимыми переменными окружения. Вот пример основных переменных, которые нужно настроить:

# PostgreSQL
POSTGRES_SERVER=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=ваш_надежный_пароль
POSTGRES_DB=devship

# Общие настройки
SERVER_NAME=ваш-домен.ru
SERVER_HOST=https://ваш-домен.ru
BACKEND_CORS_ORIGINS=["https://ваш-домен.ru"]
SECRET_KEY=ваш_секретный_ключ  # Сгенерируйте с помощью: openssl rand -hex 32

# Email настройки
SMTP_TLS=True
SMTP_PORT=ваш_порт
SMTP_HOST=ваш_smtp_сервер
SMTP_USER=ваш_email
SMTP_PASSWORD=ваш_пароль
EMAILS_FROM_EMAIL=ваш_email
EMAILS_FROM_NAME="Ваше Имя"

# URL-адреса для API
NEXT_PUBLIC_API_URL=https://ваш-домен.ru/api
API_URL=http://laravel:8000/api
BACKEND_URL=http://laravel:8000
FRONTEND_URL=https://ваш-домен.ru
NODE_ENV=production

Структура Docker-контейнеров

Наше приложение разворачивается в виде следующих Docker-контейнеров:

  • devship-postgres-prod: контейнер PostgreSQL для хранения данных
  • devship-laravel-prod: бэкенд на Laravel
  • devship-frontend-prod: фронтенд на Next.js

Все контейнеры объединены в сеть Docker, что позволяет им взаимодействовать друг с другом. Конфигурация контейнеров определена в docker-compose-fixed.yml, который генерируется скриптом на основе ваших настроек.

Обслуживание и устранение неполадок

Просмотр логов

Для просмотра логов контейнеров можно использовать следующие команды:

# Логи всех контейнеров
ssh ваш-vps-alias "cd /путь/к/проекту && docker compose -f docker-compose-fixed.yml logs -f"

# Логи Laravel бэкенда
ssh ваш-vps-alias "docker logs devship-laravel-prod"

# Логи Next.js фронтенда
ssh ваш-vps-alias "docker logs devship-frontend-prod"

Перезапуск контейнеров

Если необходимо перезапустить определенный контейнер:

# Перезапуск Laravel бэкенда
ssh ваш-vps-alias "docker restart devship-laravel-prod"

# Перезапуск Next.js фронтенда
ssh ваш-vps-alias "docker restart devship-frontend-prod"

Обновление приложения

Для обновления приложения до последней версии просто повторно запустите скрипт развертывания:

# Обновление локального репозитория
git pull

# Повторный запуск скрипта развертывания
bash scripts/deploy-laravel-nextjs.sh

Заключение

Благодаря нашему скрипту процесс развертывания значительно упрощается и становится более надежным. При возникновении вопросов или проблем обращайтесь к документации или создайте issue в репозитории проекта.

Скрипт разработан с учетом возможных проблем и имеет встроенные механизмы восстановления, что делает процесс развертывания более устойчивым к ошибкам.