← Назад к вопросам
Как разворачивал приложение?
2.0 Middle🔥 161 комментариев
#Soft Skills и рабочие процессы
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Процесс развёртывания фронтенд-приложения
Развёртывание (deployment) фронтенд-приложения - это многоэтапный процесс, который включает сборку кода, оптимизацию и публикацию на production сервер. Я участвовал в развёртывании приложений на различных платформах, от облачных сервисов до self-hosted решений. В этом ответе я рассмотрю полный цикл развёртывания современного фронтенд-приложения.
Технологический стек в моих проектах
В последних проектах я работал с:
// Стек технологий
- Next.js / React для фронтенда
- Webpack / Vite для сборки
- Docker для контейнеризации
- Dokku / Vercel для хостинга
- GitHub Actions / GitLab CI для CI/CD
- Nginx для reverse proxy
Процесс разработки и развёртывания
1. Локальная разработка
# Инициализация проекта
npm install
npm run dev
# Или для Next.js
npm create next-app@latest
cd my-app
npm run dev # Запуск на localhost:3000
2. Сборка и оптимизация
# Проверка качества кода
npm run lint
npm run test
# Сборка для production
npm run build
# Анализ бандла (опционально)
npm run analyze
3. Docker контейнеризация
# Dockerfile для Next.js приложения
FROM node:18-alpine AS builder
WORKDIR /app
# Копируем package.json и устанавливаем зависимости
COPY package*.json ./
RUN npm ci
# Копируем исходный код
COPY . .
# Собираем приложение
RUN npm run build
# Финальный образ (меньше размер)
FROM node:18-alpine
WORKDIR /app
# Копируем только необходимые файлы из builder
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/public ./public
COPY --from=builder /app/package*.json ./
# Expose порт
EXPOSE 3000
# Start скрипт
CMD ["npm", "start"]
4. Development pipeline
# .github/workflows/deploy.yml для GitHub Actions
name: Deploy to Production
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm run test
- name: Build
run: npm run build
- name: Build Docker image
run: docker build -t myapp:${{ github.sha }} .
- name: Push to registry
run: |
echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
docker push myapp:${{ github.sha }}
- name: Deploy
run: |
ssh -i ${{ secrets.SSH_KEY }} user@server 'docker pull myapp:${{ github.sha }} && docker run -d -p 80:3000 myapp:${{ github.sha }}'
Развёртывание на Dokku
Я часто использую Dokku - облегчённую версию Heroku для self-hosted решений:
# Инициализация на сервере
ssh user@server
dokku apps:create myapp
# Настройка на локальной машине
git remote add dokku dokku@server:myapp
# Развёртывание (просто git push)
git push dokku main
# Просмотр логов
dokku logs myapp
# Перезагрузка приложения
dokku ps:restart myapp
Развёртывание на Vercel
Для более простых проектов я использую Vercel (специально оптимизирована для Next.js):
# Установка CLI
npm i -g vercel
# Развёртывание
vercel
# Production развёртывание
vercel --prod
# Или просто git push в подключенный репозиторий
# Vercel автоматически будет собирать и разворачивать
Настройка окружения
# Переменные окружения должны быть в .env.local (не коммитить!)
# Для production используются переменные на сервере
REACT_APP_API_URL=https://api.example.com
REACT_APP_ENV=production
Оптимизация для production
1. Компрессия
# Nginx конфигурация для сжатия
server {
gzip on;
gzip_types text/plain text/css text/javascript application/json application/javascript;
gzip_min_length 1000;
gzip_comp_level 6;
location / {
try_files $uri $uri/ /index.html;
}
}
2. Кэширование
# Кэширование статических файлов
location /static/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# HTML файл не кэшируется
location / {
expires -1;
add_header Cache-Control "no-cache, no-store, must-revalidate";
}
3. Security headers
# Добавляем security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
Мониторинг и логирование
// Отправка ошибок на сервис мониторинга
import * as Sentry from "@sentry/react";
Sentry.init({
dsn: process.env.REACT_APP_SENTRY_DSN,
environment: process.env.NODE_ENV,
tracesSampleRate: 1.0,
});
// Логирование ошибок
window.addEventListener('error', (event) => {
Sentry.captureException(event.error);
});
// Отслеживание производительности
Sentry.captureMessage('User navigated to /dashboard', 'info');
Database миграции (если нужны)
# Перед развёртыванием запускаем миграции
nnpm run migrate
# Или в docker entrypoint
#!/bin/bash
npm run migrate
npm start
Откат приложения
# На Dokku
dokku releases:list myapp
dokku releases:rollback myapp v2
# На Vercel
# Можно откатить через UI или CLI
vercel rollback
Checks перед production
// Checklist перед развёртыванием
- npm run build успешна (нет ошибок)
- npm run lint без ошибок
- npm run test покрывает >= 80% кода
- Все env переменные заданы на сервере
- Security headers настроены
- HTTPS включен
- Стратегия кэширования правильная
- CDN настроена (если используется)
- Бекап базы данных сделан (если есть)
- Морнинг-стенды запланированы (если критичный запуск)
Мой процесс
# 1. Разработка
git checkout -b feature/new-feature
# ... code ...
git add .
git commit -m "feat: Add new feature"
# 2. Testing
npm run test
npm run lint
npm run build
# 3. Code Review
git push origin feature/new-feature
# Открыть Pull Request
# Получить approval от коллег
# 4. Merge
git checkout main
git pull origin main
git merge feature/new-feature
# 5. Deploy
git push origin main
# CI/CD автоматически запустится
# После успеха - приложение на production
# 6. Monitor
# Проверить логи на ошибки
# Проверить метрики производительности
# Готов откатить если что-то не так