# Docker-окружение для Bitrix (env-docker)

Этот проект предназначен для быстрого развертывания локального окружения для разработки на Битрикс с использованием Docker. В основе лежит репозиторий https://github.com/bitrix-tools/env-docker

## Директории
- [mysql](data/mysql) — файлы баз данных MySQL. Эта папка привязана к контейнеру через bind mount, поэтому данные сохраняются даже после удаления контейнеров.
- [www](data/www) — файлы проектов (скрипты Битрикс). Это основной рабочий каталог для разработки.

## Навигация
* [Инициализация проекта](#инициализация-проекта)
* [Настройка среды разработки](#настройка-среды-разработки)
* [Настройка доступа к сайту](#настройка-доступа-к-сайту)
* [Настройка Xdebug](#настройка-xdebug)
* [Docker](#docker)
* [Управление контейнерами (Docker Compose)](#управление-контейнерами)

## Инициализация проекта
1. Создайте директорию для вашего проекта и перейдите в неё.

2. Скачайте и распакуйте архив с репозиторием
```bash
https://g.it4gaz.ru/internal-automation/b24-docker
```

3. Запустите docker

4. В [www](data/www) Необходимо добавить папки:
- `вся публичная часть` - берем из репозитория с публичкой
- `/bitrix` - из копии б24
- `/upload` - из копии б24

Взять их можно из полной копии проекта (склеить и распаковать полный архив)
```bash
# Склеить архив и сразу распаковать (для не сжатых архивов):
cat *$(ls -v  *tar.*) | tar xf -

# Склеить архив и распаковать (для сжатых архивов):
cat *$(ls -v  *tar.gz*) | tar xzf -
```

Далее перенести необходимые директории

## Настройка среды разработки
Настройки вносятся **до первого запуска контейнеров**

1. Скопируйте файлы
```bash 
cp .env.example .env
cp .env_sql.example .env_sql
cp .env_push.example .env_push
cp confs/php84/etc/php/conf.d/timezone.ini.example confs/php84/etc/php/conf.d/timezone.ini
```
2. Заполните их значениями для вашей среды разработки:
    
**Пароль к базам данных MySQL**

Пароль для суперпользователя `root` задается в файле `.env_sql`:

```dotenv
MYSQL_ROOT_PASSWORD="..."
```

**Секретный ключ для Push-сервера**

Ключ используется для подписи соединений между клиентом и Push-сервером. Он задается в файле `.env_push`, можно использовать уже установленное значение

```dotenv
PUSH_SECURITY_KEY=...
```

**Часовой пояс (timezone)**
> Часовой пояс для контейнеров задается в двух местах

1. Файл `.env`. (основная настройка для большинства сервисов). Значение задано как:
```dotenv
TZ=Europe/Moscow
```

2. Файл `confs/php84/etc/php/conf.d/timezone.ini` (настройка для PHP):
```ini
date.timezone = Europe/Moscow
```

После выполнения этих шагов можно переходить к запуску контейнеров.

## Настройка доступа к сайту
Для macOS. Сайт использует порты **8560 (HTTP)** и **8561 (HTTPS)**. Эти настройки указаны в файле `docker-compose.yml`.

Если порты заняты, можно указать другие в `docker-compose.yml`.

### Предварительная настройка (общая для обоих способов)
Как открывать сайт:
1) через `127.0.0.1:8560`
2) `b24.local:8560`

1. Добавьте запись в файл `/etc/hosts`. Это свяжет доменное имя с локальным компьютером.
```bash
sudo nano /etc/hosts
```
Добавьте строку:
```text
127.0.0.1 b24.local
```

2. **(Опционально)** Создайте тестовый файл. 
Для проверки работы создайте в директории [data/www](data/www) файл `index.php` с содержимым:
```php
<?php
phpinfo(); 
```

3. Если настраиваете другой хост, поменяйте его в [confs/nginx/conf.d/default.conf](confs/nginx/conf.d/default.conf)

## Настройка Xdebug

### Настраиваем PhpStorm
#### 1. Настройка PHP Interpreter
1. `Settings` → `PHP` → `CLI Interpreter` → `+` → `From Docker, Vagrant, WSL...`
2. Выберите `Docker Compose`
3. Укажите путь к `docker-compose.yml` и сервис `php`
4. `PhpStorm` подключится к контейнеру и проиндексирует файлы

#### 2. Настройка Path Mappings
1. `Settings` → `PHP` → `Servers`
2. Добавьте сервер:
* Name: bitrix-docker
* Host: localhost (или ваш домен, например dev.bx)
* Port: 8588
* Debugger: Xdebug
3. Внизу в Path mappings укажите:
```text
Local: /путь/к/data/www  →  Remote: /opt/www/
```

#### 3. Настройка Debug
1. `Settings` → `PHP` → `Debug`:
* Debug port: 9003
* Can accept external connections
2. `Settings` → `PHP` → `Debug` → `Xdebug`:
* Filter debug connection by IDE key
* IDE key: `PHPSTORM`

#### 4. Создайте конфигурацию запуска
1. `Run` → `Edit Configurations` → `+` → `PHP Remote Debug`
2. Настройки:
* Name: `Bitrix Docker Debug`
* Server: выберите созданный сервер `bitrix-docker`
* IDE key: `PHPSTORM`
3. Примените и закройте

В PhpStorm включите "Start Listening for PHP Debug Connections" (иконка 🐞 в панели)

Поставьте брейкпоинт в коде и откройте страницу — отладка должна сработать!

## Docker
Для удобного управления контейнерами в графическом интерфейсе рекомендуется использовать `Docker Desktop`. Он доступен для Windows, Linux и macOS.

Документация по установке:
- `Docker Desktop on Windows`: https://docs.docker.com/desktop/setup/install/windows-install/
- `Docker Desktop on Linux`: https://docs.docker.com/desktop/setup/install/linux/
- `Docker Desktop on Mac`: https://docs.docker.com/desktop/setup/install/mac-install/

## Управление контейнерами
Для оркестрации контейнеров используется `Docker Compose`. Все команды выполняются из корневой директории проекта.

Основная команда для пересборки и перезапуска:
```bash
docker compose down && docker compose up -d
```

<details><summary>Полезные команды Docker</summary>

* **Запустить все контейнеры и оставить их работать в фоне:**

```bash
docker compose up -d
```

* **Отобразить список контейнеров и их статус:**
```bash
docker compose ps
```

* **Показать логи сразу всех контейнеров:**
```bash
docker compose logs
```

* **Показать лог определенного сервиса-контейнера:**
```bash
docker compose logs redis
```

* **Перезапустить определенный контейнер:**
```bash
docker compose restart nginx
```

* **Перезапустить все контейнеры:**
```bash
docker compose restart
```

* **Остановить все контейнеры:**
```bash
docker compose stop
```

* **Остановить все контейнеры, удалить их:**
```bash
docker compose down
```

* **Остановить все контейнеры, удалить их и удалить все тома этих контейнеров:**
```bash
docker compose down -v
```

* **Зайти в sh-консоль определенного контейнера, например nginx:**
```bash
docker compose exec nginx sh
```
</details>
