Как код сайта попадает на сервер?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как код сайта попадает на сервер
Это вопрос о процессе деплоя — как мы переводим код с нашего компьютера на production сервер. Давайте разберемся полностью.
Общий процесс
Есть несколько этапов:
- Разработка кода локально
- Commit в git репозиторий
- Push на удаленный сервер (GitHub, GitLab, Bitbucket)
- CI/CD конвейер автоматически:
- Тестирует код
- Собирает артефакты (build)
- Деплоит на сервер
- Сервер запускает приложение
Вариант 1: Git push на production
Самый простой для маленьких проектов:
# На локальной машине
git add .
git commit -m "Добавил новую фичу"
git push origin main
На сервере установлен git hook:
# На сервере файл .git/hooks/post-receive
#!/bin/bash
cd /var/www/app
git pull origin main
npm install
npm run build
restartapp
Когда мы push'им, server автоматически:
- Скачивает код
- Устанавливает зависимости
- Собирает приложение
- Перезапускает процесс
Вариант 2: CI/CD (GitHub Actions, GitLab CI)
Мощнее и безопаснее для production:
GitHub Actions (файл .github/workflows/deploy.yml):
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm run test
- name: Build
run: npm run build
- name: Deploy to server
run: |
ssh -i ${{ secrets.DEPLOY_KEY }} user@server.com
'cd /var/www/app && git pull && npm install && npm run build && restart'
Что происходит:
- На GitHub запускается виртуальная машина
- Checkout код из репо
- Установка Node.js
- npm install зависимостей
- Запуск тестов (если упадут — деплой отменяется)
- npm run build сборка проекта
- SSH подключение к серверу
- Обновление и перезапуск приложения
Вариант 3: Dokku (как в нашем проекте)
Dokku — это мини-Heroku для своего сервера. Очень удобно!
**На сервере один раз:
# Установили Dokku
# Создали приложение
dokku apps:create prepbro
# Добавили переменные окружения
dokku config:set prepbro DATABASE_URL=... API_KEY=...
С локальной машины:
# Добавляем remote
git remote add dokku dokku@server.com:prepbro
# Деплоим просто push'ем
git push dokku main
Dokku автоматически:
- Получает код
- Читает Dockerfile (если есть)
- Собирает образ (docker build)
- Запускает контейнер
- Настраивает nginx
- Выдает SSL сертификат (Let's Encrypt)
Вариант 4: Docker + Registry
Для более сложных систем:
# На разработчика машине
docker build -t myregistry.com/prepbro:1.0.0 .
docker push myregistry.com/prepbro:1.0.0
# На сервере
docker pull myregistry.com/prepbro:1.0.0
docker run -d -p 80:3000 myregistry.com/prepbro:1.0.0
Вариант 5: Containerized deployment (Kubernetes)
Для огромных проектов с масштабированием:
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: prepbro
spec:
replicas: 3
template:
spec:
containers:
- name: app
image: myregistry.com/prepbro:1.0.0
ports:
- containerPort: 3000
kubectl apply -f deployment.yaml
Как именно код попадает на сервер
Физически:
- Git отправляет данные по HTTPS/SSH
- Сервер получает объекты Git
- Обновляет working directory
- Запускает hooks для сборки
- Заменяет старые файлы новыми
На уровне файлов:
Локально: /Users/dev/prepbro/.git
/Users/dev/prepbro/src/...
v push git commit
На сервере: /var/www/app/.git
/var/www/app/src/..
Сборка frontend
Что происходит при npm run build:
# Входные файлы
src/
components/
pages/
styles/
# Webpack/Vite собирает
bundle.js (весь JavaScript в одном файле)
styles.css (весь CSS в одном файле)
html с ссылками на bundle.js и styles.css
# Выходные файлы (готовые для браузера)
.next/
static/
chunks/
main.js
pages/...
css/
styles.css
Эти собранные файлы отправляются на сервер, браузер скачивает их оттуда.
Пример полного цикла
# 1. Разработка
I напишу компонент Button.jsx
I тестирую локально (npm run dev)
# 2. Commit
git add src/components/Button.jsx
git commit -m "Добавил Button компонент"
# 3. Push
git push origin main
# 4. CI/CD конвейер на GitHub Actions
# (автоматически запускается)
- Скачал код
- npm install
- npm run test (проверяет Button.test.jsx)
- npm run lint (проверяет стиль кода)
- npm run build (собирает production bundle)
- Отправил bundle на Dokku сервер
# 5. На Dokku сервере
- Получил новый код
- Запустил docker build
- Заменил старый контейнер на новый
- nginx перенаправляет трафик на новый контейнер
# 6. Пользователь
- Открывает site.com
- Браузер скачивает bundle.js с сервера
- Выполняет JavaScript
- Видит новый Button компонент
Что может пойти не так
Сборка упадет:
npm run build
# Error: Cannot find module 'react'
# Забыл добавить в package.json
Тесты упадут:
npm run test
# ✕ Button.test.jsx (2 failed)
# Деплой отменяется
Сервер не может скачать зависимости:
npm install
# Error: Cannot reach registry
# npm срегистри не доступен (редко)
Ошибка при запуске:
node app.js
# Error: Cannot read property 'database' of undefined
# Забыл установить environment переменные
Безопасность
Важные практики:
- SSH ключи для доступа на сервер
# Не используем пароли, используем ключи
git push dokku@server.com:app main
- Environment переменные скрыты
# На GitHub Actions
secrets.DEPLOY_KEY - скрыта
secrets.DATABASE_URL - скрыта
- Токены не в коде
# ПЛОХО
const API_KEY = "abc123"; // В коде!
# ХОРОШО
const API_KEY = process.env.API_KEY; // Из переменных окружения
- Только через HTTPS
# git push всегда через SSH или HTTPS, никогда незащищено
Мониторинг после деплоя
# Логи приложения
dokku logs prepbro
# Статус
dokku ps
# Метрики (CPU, память)
docker stats
Так что код попадает на сервер через git push, затем CI/CD система автоматически тестирует, собирает и деплоит приложение. Сервер получает собранный bundle и отправляет его браузеру пользователя.