> For the complete documentation index, see [llms.txt](https://utm-1.gitbook.io/utm-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://utm-1.gitbook.io/utm-docs/dokumentaciya/utm-it/resheniya/dokumentirovanie/bookstack/razvertyvanie-v-docker-gpt-5-mini.md).

# Развертывание в Docker (GPT-5-Mini)

## Инструкция по развёртыванию BookStack (ghcr.io/linuxserver/bookstack:25.12.1)

Автор: Masha Дата: 2026-01-07

***

### Краткое описание

В этой инструкции описан полный процесс подготовки файлов, создания репозитория GitHub, размещения в нём необходимых конфигураций, клонирования репозитория на сервер 192.168.4.9 и запуска контейнера BookStack (образ ghcr.io/linuxserver/bookstack:25.12.1) через Docker Compose. BookStack будет использовать существующий инстанс MySQL на 192.168.4.9:3306. Все пароли и настройки передаются через файл `.env`. В репозитории хранится шаблон `.env.template`.

DNS и проксирование

* Домен: `bookstack.utmsoft.ru` (DNS указывает на 77.51.201.4).
* На адресе 77.51.201.4 настроен обратный прокси nginx, который проксирует HTTPS (443) для `bookstack.utmsoft.ru` на `http://192.168.4.9:<HOST_PORT>` — где `<HOST_PORT>` это порт, на котором будет проброшен контейнер BookStack (в примерах ниже используем 6875).

***

### Содержимое репозитория

Рекомендуемая структура репозитория `bookstack`:

* README.md
* docker/
  * docker-compose.yml
  * .env.template

Файлы ниже — готовые к использованию. Поместите их в корень репозитория и в папку `docker/` соответственно.

***

### Файл: docker/docker-compose.yml

Скопируйте этот файл как `docker/docker-compose.yml`:

```yaml
version: "3.8"
services:
  bookstack:
    image: ghcr.io/linuxserver/bookstack:25.12.1
    container_name: bookstack
    env_file:
      - .env
    environment:
      - PUID=${PUID}
      - PGID=${PGID}
      - TZ=${TZ}
      - APP_URL=${APP_URL}
      - DB_HOST=${DB_HOST}
      - DB_PORT=${DB_PORT}
      - DB_DATABASE=${DB_DATABASE}
      - DB_USERNAME=${DB_USERNAME}
      - DB_PASSWORD=${DB_PASSWORD}
    volumes:
      - ./config:/config
    ports:
      - "${HTTP_PORT}:80"
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "curl -fsS --max-time 5 http://localhost/ || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 20s

networks: {}
```

Объяснение ключевых мест:

* `env_file: - .env` — все значения конфигурации будут подставлены из файла `.env` в той же папке `docker/`.
* `volumes` — весь конфиг и данные контейнера будут храниться в `./config`.
* `ports` — в примере хост-порт берётся из переменной `HTTP_PORT` (в шаблоне это 6875). Именно этот порт нужно проксировать с внешнего nginx.
* `healthcheck` проверяет HTTP-ответ контейнера.

***

### Файл: docker/.env.template

Поместите в `docker/.env.template` и закоммитьте этот файл в GitHub (файл `.env` не должен попадать в репозиторий).

```
# Параметры пользователя и группы контейнера
PUID=1000
PGID=1000

# Временная зона (укажите вашу)
TZ=Europe/Moscow

# Порт на хосте, на который будет проброшен контейнер (пример: 6875)
HTTP_PORT=6875

# URL приложения, должен быть полным с https, т.к. внешний прокси завершает TLS
APP_URL=https://bookstack.utmsoft.ru

# Настройки подключения к существующему MySQL
DB_HOST=192.168.4.9
DB_PORT=3306
DB_DATABASE=bookstack
DB_USERNAME=bookstack
DB_PASSWORD=CHANGE_ME_SET_STRONG_PASSWORD
```

Инструкция: при развёртывании копируйте `.env.template` в `.env` и заменяйте `DB_PASSWORD` и другие значения на реальные (см. ниже). Не храните реальные пароли в публичном репозитории.

***

### Создание базы данных и пользователя MySQL для BookStack

Подключитесь к вашему MySQL (на 192.168.4.9:3306). Примеры ниже показывают два варианта: с локально установленным клиентом `mysql` и через docker exec (если MySQL работает в контейнере и у вас есть имя контейнера).

1. Через локальный mysql-client (на сервере 192.168.4.9):

```bash
# при необходимости установите клиент
sudo apt update && sudo apt install -y mysql-client

mysql -h 127.0.0.1 -P 3306 -u root -p
# введите пароль root
```

Внутри MySQL выполните (замените пароль на сложный):

```sql
CREATE DATABASE bookstack CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'bookstack'@'%' IDENTIFIED BY 'SOME_STRONG_PASSWORD';
GRANT ALL PRIVILEGES ON bookstack.* TO 'bookstack'@'%';
FLUSH PRIVILEGES;
```

Пояснения:

* `CREATE DATABASE` — создаёт базу с utf8mb4 для корректной поддержки эмодзи и специальных символов.
* Пользователь создаётся с хоста `%`, чтобы контейнеру было разрешено подключаться с любого IP. При желании можно ограничить доступ конкретным IP (например, `192.168.4.%`).

2. Через docker exec (если нужен доступ внутри контейнера MySQL):

```bash
# узнайте имя контейнера mysql
docker ps
# затем
docker exec -it <mysql-container-name> mysql -u root -p
# и выполните те же SQL-команды
```

После выполнения этих команд подставьте созданные значения в `docker/.env`.

***

### Создание репозитория на GitHub и размещение файлов

1. Создайте репозиторий `bookstack` в аккаунте `utenkov-maxim` на GitHub (через веб-интерфейс или `gh` CLI).
2. В локальной копии (например, на вашей рабочей машине) подготовьте структуру и файлы (README, docker/docker-compose.yml, docker/.env.template).
3. Примеры команд для отправки в удалённый репозиторий (выполнять в корне локальной папки проекта):

```bash
git init
git checkout -b main
git add .
git commit -m "Initial commit: BookStack docker-compose and .env.template"
# добавьте remote; используйте SSH (у вас настроен доступ по SSH)
git remote add origin git@github.com:utenkov-maxim/bookstack.git
git push -u origin main
```

> Важно: не добавляйте файл `docker/.env` в репозиторий. Убедитесь, что `.gitignore` содержит строку `docker/.env`.

***

### Клонирование репозитория на сервер 192.168.4.9

На сервере выполните (папка корня аккаунта GitHub уже создана: `/srv/github/utenkov-maxim`):

```bash
cd /srv/github/utenkov-maxim
# если ещё нет каталога для репозитория:
# git clone
git clone git@github.com:utenkov-maxim/bookstack.git

# или, если уже есть папка db-projects и вы хотите разместить рядом
# cd /srv/github/utenkov-maxim
# git clone git@github.com:utenkov-maxim/bookstack.git
```

***

### Развёртывание на сервере (запуск контейнера)

1. Перейдите в папку `docker` в клонированном репозитории и создайте `.env` из шаблона:

```bash
cd /srv/github/utenkov-maxim/bookstack/docker
cp .env.template .env
# Откройте .env в редакторе и поменяйте DB_PASSWORD и, при необходимости, PUID/PGID/TZ
nano .env
# или
vi .env
```

Рекомендации:

* Придумайте надёжный пароль и вставьте в `DB_PASSWORD`.
* Установите права доступа к файлу: `chmod 600 .env`.

2. Запустите контейнеры:

```bash
# из папки docker
docker compose up -d
# или, если у вас установлены старые версии:
# docker-compose up -d
```

3. Проверка статуса:

```bash
# список контейнеров
docker ps --filter "name=bookstack"

# журналы
docker compose logs -f bookstack

# или
docker logs -f bookstack

# проверка health
docker inspect --format='{{json .State.Health}}' bookstack
```

В логах контейнера вы увидите сообщения о подключении к БД и о старте BookStack. Если возникают ошибки подключения — проверьте `DB_HOST`, `DB_PORT`, `DB_USERNAME`, `DB_PASSWORD` и сетевую доступность 192.168.4.9:3306 (например, `telnet 192.168.4.9 3306` или `nc -vz 192.168.4.9 3306`).

***

### Пример конфигурации внешнего nginx (на прокси 77.51.201.4)

Ниже — пример блока server для nginx, который расположен на прокси (77.51.201.4). Этот nginx завершает TLS и проксирует запросы к серверу 192.168.4.9:6875.

```nginx
server {
    listen 443 ssl;
    server_name bookstack.utmsoft.ru;

    # ssl_certificate ...;
    # ssl_certificate_key ...;

    location / {
        proxy_pass http://192.168.4.9:6875;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Увеличьте таймауты при необходимости
        proxy_read_timeout 90;
        proxy_send_timeout 90;
    }
}
```

Пояснение: nginx на внешнем адресе получает HTTPS-запросы и пересылает их в BookStack по HTTP. Поэтому в `docker/.env` APP\_URL должен быть `https://bookstack.utmsoft.ru`.

***

### Диагностика и типичные проблемы

1. Ошибка подключения к БД:
   * Проверьте, слушает ли MySQL порт 3306 на 192.168.4.9.
   * Проверьте, что пользователь создан и у него есть права.
   * Проверьте сетевую доступность: `nc -vz 192.168.4.9 3306`.
2. Контейнер падает или не проходит healthcheck:
   * Посмотрите логи `docker compose logs -f bookstack`.
   * Увеличьте `start_period` healthcheck, если контейнер стартует дольше.
3. Внешний доступ по HTTPS не работает:
   * Проверьте конфигурацию внешнего nginx и наличие сертификатов.
   * Убедитесь, что внешний nginx проксирует на правильный порт (например, 6875).

***

### Проверки после успешного запуска

* Зайдите в браузере по адресу: <https://bookstack.utmsoft.ru>
* Если страница не открывается — проверьте логи внешнего nginx на 77.51.201.4 и логи контейнера bookstack на 192.168.4.9.

***

### Пример быстрого командного чек-листа (для удобства копирования)

```bash
# на сервере 192.168.4.9
cd /srv/github/utenkov-maxim
git clone git@github.com:utenkov-maxim/bookstack.git
cd bookstack/docker
cp .env.template .env
# отредактируйте .env -> установите DB_PASSWORD и другие параметры
chmod 600 .env
docker compose up -d
docker compose logs -f bookstack
```

***

### Замечания по безопасности

* Никогда не храните реальные пароли в публичных репозиториях.
* Ограничьте доступ к MySQL (по возможности) конкретными IP-адресами вместо `%`.
* Подумайте о бэкапах каталога `./config` (там будет храниться БД приложения/загрузки файлов и конфиги).

***

Если хотите, я могу:

* Сгенерировать шаблон .gitignore для репозитория.
* Подготовить пример systemd-сервиса для автоматического старта docker compose (если нужно).
* Проверить конкретный файл docker-compose и .env перед коммитом (вы можете вставить их содержимое сюда).

Удачного развёртывания!


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://utm-1.gitbook.io/utm-docs/dokumentaciya/utm-it/resheniya/dokumentirovanie/bookstack/razvertyvanie-v-docker-gpt-5-mini.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
