# Инструкция по деплою и правила разработкиа

## [](#%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5)Содержание

1. [Общие принципы](#%D0%BE%D0%B1%D1%89%D0%B8%D0%B5-%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B)
2. [Инструкции для фронтенда](#%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D0%B8-%D0%B4%D0%BB%D1%8F-%D1%84%D1%80%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D0%B4%D0%B0)
3. [Инструкции для бэкенда](#%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D0%B8-%D0%B4%D0%BB%D1%8F-%D0%B1%D1%8D%D0%BA%D0%B5%D0%BD%D0%B4%D0%B0)
4. [Тестовые стенды (Staging)](#%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D0%B5-%D1%81%D1%82%D0%B5%D0%BD%D0%B4%D1%8B-staging)
5. [Проверка перед деплоем](#%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0-%D0%BF%D0%B5%D1%80%D0%B5%D0%B4-%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B5%D0%BC)

## [](#%D0%BE%D0%B1%D1%89%D0%B8%D0%B5-%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B)Общие принципы

1. Все конфигурации должны управляться через переменные окружения (`.env` файлы)
2. Переопределение конфигурации доступно через `config.override.json` (только в режиме разработки)
3. Запрещено использование сторонних CDN для любых ресурсов (включая шрифты, скрипты, стили)
4. Весь код должен следовать принятым соглашениям о стиле кодирования

### [](#%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BE%D0%BA%D1%80%D1%83%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F)Настройка окружения

#### [](#%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%BE%D0%BA%D1%80%D1%83%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F)Переменные окружения

Все конфигурации приложения должны быть вынесены в `.env` файлы:

- `.env` - базовые настройки, общие для всех окружений
- `.env.development` - настройки для разработки
- `.env.production` - настройки для продакшена

Пример структуры `.env` файла:

```
VITE_API_URL=https://api-id.АОНК.ru/
VITE_APP_NAME=АОНК ID
```

<div class="gl-relative markdown-code-block js-markdown-code" id="bkmrk--4"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-2" data-title="Copy to clipboard" type="button"><svg></svg></button></div>#### [](#%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%B8)Переопределение конфигурации

В процессе разработки можно переопределить настройки без изменения исходного кода, используя файл `config.override.json`. Этот файл должен иметь следующую структуру:

```
{
  "config": {
    "apiUrl": "http://localhost:8000/",
    "appName": "АОНК ID (локальная разработка)"
  }
}
```

<div class="gl-relative markdown-code-block js-markdown-code" id="bkmrk--6"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-3" data-title="Copy to clipboard" type="button"><svg></svg></button></div>**Важно**: Механизм переопределения работает только в режиме разработки. В продакшн-среде он отключен для безопасности.

### [](#%D0%BF%D0%B5%D1%80%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D0%BF%D0%BA%D0%B8)Персистентные папки

Персистентные папки - это директории, которые сохраняются между обновлениями приложения и не очищаются при повторном развертывании.

Персистентные папки в проекте создаются и обозначаются в Dockerfile с помощью директивы `VOLUME`. Пример из бэкенд-проекта:

```
# Создание персистентной директории uploads
RUN mkdir -p /var/www/aonk-id/runtime/uploads
VOLUME /var/www/aonk-id/runtime/uploads

# Создание персистентной директории drivers
RUN mkdir -p /var/www/aonk-id/runtime/drivers
VOLUME /var/www/aonk-id/runtime/drivers
```

<div class="gl-relative markdown-code-block js-markdown-code" id="bkmrk--8"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-4" data-title="Copy to clipboard" type="button"><svg></svg></button></div>Чтобы создать новую персистентную папку:

1. Создайте директорию в корне проекта
2. Добавьте путь к этой директории в файл `.gitignore` (чтобы избежать коммита содержимого)
3. Добавьте следующие строки в `contrib/Dockerfile`: ```
    # Создание персистентной директории
    RUN mkdir -p /var/www/aonk-id/my-persistent-dir
    VOLUME /var/www/aonk-id/my-persistent-dir
    ```
    
    <div class="gl-relative markdown-code-block js-markdown-code"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-5" data-title="Copy to clipboard" type="button"><svg></svg></button></div>

Директива `VOLUME` в Dockerfile гарантирует, что содержимое указанной директории будет сохраняться между перезапусками контейнера и обновлениями приложения.

**Важно**: Данные в томах (`VOLUME`) сохраняются даже при удалении контейнера, но могут быть удалены при выполнении команды `docker volume prune`. Убедитесь, что у вас настроено резервное копирование важных данных.

## [](#%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D0%B8-%D0%B4%D0%BB%D1%8F-%D1%84%D1%80%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D0%B4%D0%B0)Инструкции для фронтенда

### [](#%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0-frontend)Структура проекта (Frontend)

```
frontend/
├── dist/               # Результат сборки (очищается при каждой сборке)
├── public/             # Статические файлы
│   └── config.override.json  # Файл переопределения конфигурации
├── src/                # Исходный код приложения
│   ├── config/         # Конфигурация приложения
│   │   ├── env.config.js      # Базовая конфигурация
│   │   ├── configRewrite.js   # Механизм переопределения
│   │   └── index.js           # Экспорт конфигурации
│   ├── components/     # Компоненты Vue
│   ├── plugins/        # Плагины Vue
│   ├── router/         # Маршрутизация
│   ├── stores/         # Хранилища Pinia
│   └── styles/         # Стили приложения
├── node_modules/       # Зависимости (очищаются при сборке)
├── contrib/            # Файлы для развертывания
│   ├── Dockerfile      # Dockerfile для сборки образа
│   └── aonk-id-frontend.nginx.conf  # Конфигурация Nginx
├── debian/             # Файлы для сборки Debian-пакета
│   ├── control         # Метаданные пакета
│   ├── aonk-id-frontend-bin.install  # Список файлов для установки
│   └── aonk-id-frontend-bin.dir      # Список создаваемых директорий
├── Makefile            # Скрипты сборки
└── build.sh            # Скрипт создания Debian-пакета
```

<div class="gl-relative markdown-code-block js-markdown-code" id="bkmrk--11"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-6" data-title="Copy to clipboard" type="button"><svg></svg></button></div>### [](#%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2-%D0%B8-%D0%BF%D0%B0%D0%BF%D0%BE%D0%BA-%D0%B2-%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D1%83)Добавление файлов и папок в сборку

При добавлении новых файлов и папок в проект, необходимо учитывать два аспекта:

1. **Включение файлов в сборку Vite**:
    
    
    - Все исходные файлы должны размещаться в директории `src/`
    - Статические файлы (изображения, шрифты и т.д.) должны размещаться в директории `public/`
    - Vite автоматически включит эти файлы в результирующую сборку (директория `dist/`)
2. **Включение файлов в установочный пакет**:
    
    
    - Для определения файлов, которые должны быть установлены на сервер, используется файл `debian/aonk-id-frontend-bin.install`
    - Каждая строка в этом файле содержит два элемента: исходный путь и путь назначения
    
    Пример содержимого файла `aonk-id-frontend-bin.install`:
    
    ```
    package.json /var/www/aonk-id
    package-lock.json /var/www/aonk-id
    dist/* /var/www/aonk-id/public
    ```
    
    <div class="gl-relative markdown-code-block js-markdown-code"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-7" data-title="Copy to clipboard" type="button"><svg></svg></button></div>

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

1. Добавьте новую строку в файл `debian/aonk-id-frontend-bin.install`, указав исходный путь и путь назначения
    
    ```
    my-config-file.json /var/www/aonk-id/configs
    ```
    
    <div class="gl-relative markdown-code-block js-markdown-code"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-8" data-title="Copy to clipboard" type="button"><svg></svg></button></div>
2. Убедитесь, что указанный каталог назначения существует или создайте его, добавив путь в файл `debian/aonk-id-frontend-bin.dir`:
    
    ```
    /var/www/aonk-id/configs
    ```
    
    <div class="gl-relative markdown-code-block js-markdown-code"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-9" data-title="Copy to clipboard" type="button"><svg></svg></button></div>

### [](#%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC)Управление состоянием

Для управления состоянием приложения используется Pinia. При добавлении нового хранилища:

1. Создайте файл в директории `src/stores/`
2. Используйте `defineStore` для определения хранилища
3. Импортируйте конфигурацию из `@/config`, если требуется доступ к настройкам

Пример:

```
import { defineStore } from 'pinia'
import config from '@/config'

export const useAuthStore = defineStore('auth', {
  state: () => ({
    user: null,
    apiUrl: config.apiUrl
  }),
  actions: {
    // ...
  }
})
```

<div class="gl-relative markdown-code-block js-markdown-code" id="bkmrk--14"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-10" data-title="Copy to clipboard" type="button"><svg></svg></button></div>### [](#%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0-%D0%B8-%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9-%D1%84%D1%80%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D0%B4%D0%B0)Сборка и деплой фронтенда

1. Установка зависимостей:
    
    ```
    yarn install
    ```
    
    <div class="gl-relative markdown-code-block js-markdown-code"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-11" data-title="Copy to clipboard" type="button"><svg></svg></button></div>
2. Запуск в режиме разработки:
    
    ```
    yarn dev
    ```
    
    <div class="gl-relative markdown-code-block js-markdown-code"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-12" data-title="Copy to clipboard" type="button"><svg></svg></button></div>
3. Сборка для продакшена:
    
    ```
    yarn build
    ```
    
    <div class="gl-relative markdown-code-block js-markdown-code"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-13" data-title="Copy to clipboard" type="button"><svg></svg></button></div>
4. Создание Debian-пакета:
    
    ```
    ./build.sh
    ```
    
    <div class="gl-relative markdown-code-block js-markdown-code"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-14" data-title="Copy to clipboard" type="button"><svg></svg></button></div>

## [](#%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D0%B8-%D0%B4%D0%BB%D1%8F-%D0%B1%D1%8D%D0%BA%D0%B5%D0%BD%D0%B4%D0%B0)Инструкции для бэкенда

### [](#%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0-backend)Структура проекта (Backend)

```
backend/
├── config/             # Конфигурация приложения
│   ├── env.config.js   # Базовая конфигурация
│   └── configRewrite.js # Механизм переопределения
├── controllers/        # Контроллеры
├── models/             # Модели данных
├── routes/             # Маршруты API
├── middleware/         # Промежуточное ПО
├── helpers/            # Вспомогательные функции
├── drivers/            # Драйверы (персистентная папка)
├── uploads/            # Загруженные файлы (персистентная папка)
├── contrib/            # Файлы для развертывания
│   └── Dockerfile      # Dockerfile для сборки образа
├── debian/             # Файлы для сборки Debian-пакета
│   ├── control         # Метаданные пакета
│   └── aonk-id-backend-bin.install  # Список файлов для установки
├── Makefile            # Скрипты сборки
└── build.sh            # Скрипт создания Debian-пакета
```

<div class="gl-relative markdown-code-block js-markdown-code" id="bkmrk--18"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-15" data-title="Copy to clipboard" type="button"><svg></svg></button></div>### [](#%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2-%D0%B8-%D0%BF%D0%B0%D0%BF%D0%BE%D0%BA-%D0%B2-%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D1%83-backend)Добавление файлов и папок в сборку (Backend)

Для включения файлов в установочный пакет бэкенда, используется файл `debian/aonk-id-backend-bin.install`. Каждая строка в файле определяет исходный путь и путь назначения:

```
package.json /var/www/aonk-id/runtime
package-lock.json /var/www/aonk-id/runtime
config /var/www/aonk-id/runtime
controllers /var/www/aonk-id/runtime
emails /var/www/aonk-id/runtime
helpers /var/www/aonk-id/runtime
middleware /var/www/aonk-id/runtime
models /var/www/aonk-id/runtime
readme /var/www/aonk-id/runtime
node_modules /var/www/aonk-id/runtime
routes /var/www/aonk-id/runtime
seeders /var/www/aonk-id/runtime
index.js /var/www/aonk-id/runtime
config.override.json /var/www/aonk-id/runtime
contrib/aonk-id.service /lib/systemd/system
contrib/aonk-id /etc/default
```

<div class="gl-relative markdown-code-block js-markdown-code" id="bkmrk--20"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-16" data-title="Copy to clipboard" type="button"><svg></svg></button></div>### [](#%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%BE%D0%B9-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)Работа с базой данных

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

1. Модели данных размещаются в директории `models/`
2. Миграции размещаются в директории `migrations/`
3. Сидеры для заполнения тестовыми данными - в директории `seeders/`

Пример создания миграции:

```
npx sequelize-cli migration:generate --name create-users-table
```

<div class="gl-relative markdown-code-block js-markdown-code" id="bkmrk--22"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-17" data-title="Copy to clipboard" type="button"><svg></svg></button></div>Запуск миграций:

```
npx sequelize-cli db:migrate
```

<div class="gl-relative markdown-code-block js-markdown-code" id="bkmrk--23"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-18" data-title="Copy to clipboard" type="button"><svg></svg></button></div>### [](#%D0%BF%D0%B5%D1%80%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D0%BF%D0%BA%D0%B8-backend)Персистентные папки (Backend)

На бэкенде определены следующие персистентные директории:

- `/var/www/aonk-id/runtime/uploads` - для загруженных файлов
- `/var/www/aonk-id/runtime/drivers` - для драйверов

### [](#%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0-%D0%B8-%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9-%D0%B1%D1%8D%D0%BA%D0%B5%D0%BD%D0%B4%D0%B0)Сборка и деплой бэкенда

1. Установка зависимостей:
    
    ```
    npm install
    ```
    
    <div class="gl-relative markdown-code-block js-markdown-code"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-19" data-title="Copy to clipboard" type="button"><svg></svg></button></div>
2. Запуск в режиме разработки:
    
    ```
    npm run dev
    ```
    
    <div class="gl-relative markdown-code-block js-markdown-code"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-20" data-title="Copy to clipboard" type="button"><svg></svg></button></div>
3. Создание Debian-пакета:
    
    ```
    ./build.sh
    ```
    
    <div class="gl-relative markdown-code-block js-markdown-code"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-21" data-title="Copy to clipboard" type="button"><svg></svg></button></div>

## [](#%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D0%B5-%D1%81%D1%82%D0%B5%D0%BD%D0%B4%D1%8B-staging)Тестовые стенды (Staging)

### [](#%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D1%82%D0%B5%D0%BD%D0%B4%D0%BE%D0%B2)Создание и обновление стендов

Для работы с тестовыми стендами используется механизм веток. Каждая ветка формата `stand/название` автоматически создает или обновляет соответствующий тестовый стенд:

1. Создайте новую ветку с префиксом `stand/`:
    
    ```
    git checkout -b stand/feature-name
    ```
    
    <div class="gl-relative markdown-code-block js-markdown-code"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-22" data-title="Copy to clipboard" type="button"><svg></svg></button></div>
2. Внесите необходимые изменения и закоммитьте их:
    
    ```
    git add .
    git commit -m "Описание изменений"
    ```
    
    <div class="gl-relative markdown-code-block js-markdown-code"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-23" data-title="Copy to clipboard" type="button"><svg></svg></button></div>
3. Отправьте ветку в удаленный репозиторий:
    
    ```
    git push origin stand/feature-name
    ```
    
    <div class="gl-relative markdown-code-block js-markdown-code"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-24" data-title="Copy to clipboard" type="button"><svg></svg></button></div>

После пуша изменений в ветку `stand/feature-name`, система CI/CD автоматически развернет или обновит тестовый стенд с соответствующим именем.

### [](#%D1%87%D0%B8%D1%81%D1%82%D0%B0%D1%8F-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D1%81%D1%82%D0%B5%D0%BD%D0%B4%D0%B0)Чистая установка стенда

Для полной очистки тестового стенда (включая базу данных и персистентные файлы) необходимо выполнить коммит с ключевым словом `CleanStand` в сообщении:

```
git commit --allow-empty -m "CleanStand: полная очистка тестового стенда"
git push origin stand/feature-name
```

<div class="gl-relative markdown-code-block js-markdown-code" id="bkmrk--29"><button class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-clipboard-target="pre#code-25" data-title="Copy to clipboard" type="button"><svg></svg></button></div>**Важно**: Используйте эту операцию с осторожностью, так как она приведет к потере всех данных на тестовом стенде.

## [](#%D0%B2%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5-%D1%84%D1%80%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D0%B4%D0%B0-%D0%B8-%D0%B1%D1%8D%D0%BA%D0%B5%D0%BD%D0%B4%D0%B0)Взаимодействие фронтенда и бэкенда

### [](#api-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D1%8B)API-интерфейсы

Взаимодействие между фронтендом и бэкендом осуществляется через REST API.

1. На бэкенде API-маршруты определяются в директории `routes/`
2. На фронтенде для работы с API используется axios

### [](#%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F-%D0%B8-%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F)Аутентификация и авторизация

Для авторизации используется механизм JWT-токенов:

1. Фронтенд отправляет учетные данные пользователя на бэкенд
2. Бэкенд проверяет учетные данные и выдает JWT-токен
3. Фронтенд сохраняет токен и использует его для последующих запросов

## [](#%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0-%D0%BF%D0%B5%D1%80%D0%B5%D0%B4-%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B5%D0%BC)Проверка перед деплоем

Перед деплоем в продакшн-среду необходимо выполнить следующие проверки:

1. Убедиться, что все тесты проходят успешно
2. Проверить сборку на наличие предупреждений или ошибок
3. Проверить работоспособность основных функций приложения
4. Удостовериться, что все переменные окружения для продакшн-среды корректно настроены

## [](#%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8)Правила разработки

### [](#%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%82%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)Обязательные требования

1. **Конфигурации через переменные окружения**
    
    
    - Все настройки, зависящие от окружения, должны быть определены через `.env` файлы
    - Доступ к переменным должен осуществляться через объект конфигурации, а не напрямую через `import.meta.env` или `process.env`
2. **Механизм переопределения конфигурации**
    
    
    - Каждый проект должен поддерживать переопределение конфигурации через `config.override.json`
    - Логика загрузки переопределений должна работать только в режиме разработки
3. **Запрет на использование сторонних CDN**
    
    
    - Все ресурсы (шрифты, скрипты, стили) должны быть локальными
    - Шрифты должны размещаться в директории проекта, а не загружаться через Google Fonts или другие CDN
    - Все библиотеки должны быть установлены через npm/yarn
4. **Безопасность**
    
    
    - Не хранить секреты и ключи в исходном коде
    - Не включать учетные данные в репозиторий
    - Использовать HTTPS для всех внешних запросов

### [](#%D0%BB%D1%83%D1%87%D1%88%D0%B8%D0%B5-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8)Лучшие практики

1. **Код**
    
    
    - Следовать принятому стилю кодирования
    - Писать тесты для критически важного функционала
    - Использовать типизацию где это возможно
2. **Производительность**
    
    
    - Минимизировать количество и размер внешних зависимостей
    - Оптимизировать изображения и другие медиа-ресурсы
    - Использовать ленивую загрузку для тяжелых компонентов
3. **Доступность**
    
    
    - Обеспечивать доступность интерфейса (WCAG)
    - Поддерживать корректное отображение на различных устройствах
    - Учитывать особенности разных браузеров