.
├─ docker-compose.yml # общий (common) файлы сервисов / тома / сети
├─ docker-compose.override.yml # локальные правки (подхватывается автоматически)
├─ docker-compose.prod.yml # prod-параметры (SSL, открытые порты)
├─ nginx/
│ ├─ nginx.local.conf # nginx для локалки (без SSL)
│ └─ nginx.prod.conf # nginx для продакшна (SSL + acme)
├─ certbot/ # место для certs и webroot
│ ├─ conf/
│ └─ www/
├─ .env.example
├─ TaskMateFrontend/ # Frontend application (Vue/Vite)
├─ TaskMateTelegramBot/ # Backend application (Laravel)
├─ TaskMateAPI/ # API collection (Bruno)
└─ ...
- Скопируйте
.env.exampleв.envи заполните значения (особенноDB_USERNAME,DB_PASSWORD,PGADMIN_*и т.д.). Важно: не коммитьте.envс секретами в репозиторий.
cp .env.example .env
# отредактировать .env- Запустить контейнеры (override подхватится автоматически — удобнее для разработки):
docker compose up -d --build- Если хотите включить pgAdmin и certbot (dev-удобства), используйте профиль
dev:
docker compose --profile dev up -d --build- Проверить логи одного сервиса:
docker compose logs -f src_telegram_bot_api- Остановить (и удалить) контейнеры:
docker compose downВ проде мы используем отдельный override (docker-compose.prod.yml) с nginx на 80/443 и минимальным набором открытых портов. Всё управление сертификатами — вручную или через CI.
Пример запуска:
# собрали и подняли прод-стек (используется docker-compose.prod.yml)
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build --remove-orphansКлючевые принципы для продакшна
- В проде открываем только
nginxпорты (80/443). БД, valkey и другие сервисы — доступны только внутри сетиweb. - Секреты — через CI secret manager или docker secrets, не в открытом
.env. - Логи и метрики — подключить внешнюю систему (ELK/remote syslog) или собирать с помощью
docker logs+ ротация.
- Убедитесь, что DNS домена указывает на сервер с портом 80/443.
- В
docker-compose.prod.ymlмонтируется./certbot/wwwкак webroot (см.nginx.prod.conf).
Пример запуска получения сертификатов:
# временно запустить nginx, чтобы ACME- challange работал
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d nginx
# запустить certbot для доменов (замените на свои домены и email)
docker compose -f docker-compose.yml -f docker-compose.prod.yml run --rm certbot certonly \
--webroot -w /var/www/certbot \
--email [email protected] --agree-tos --no-eff-email \
-d taskmate.domen.com -d telegram.taskmate.domen.com -d vanilla.taskmate.domen.com
# после получения сертификатов перезапустите nginx (чтобы он подхватил новые файлы)
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d nginxАвтообновление сертификатов:
# Проверка/обновление
docker compose -f docker-compose.yml -f docker-compose.prod.yml run --rm certbot renew --quietРекомендуется настроить cron/systemd timer или CI задачу, вызывающую выше команду.
docker-compose.yml— теперь общий файл: сервисы, тома, сеть и healthchecks. По умолчанию НЕ пробрасывает все порты на хост (безопасно).docker-compose.override.yml— локальные удобные правки: проброс портов (postgres:5432,valkey:6379,frontend:8099), добавлениеpgadminв профильdev.docker-compose.prod.yml— prod-правки: nginx 80/443, certs; используйте при деплое.- nginx split:
nginx/nginx.local.conf(локалка) иnginx/nginx.prod.conf(prod — letsencrypt). - Используем
profiles(напримерdev) для сервисов, которые поднимать в проде не нужно (pgadmin, certbot).
- Поднять один сервис:
docker compose up -d src_telegram_bot_api- Пересобрать один сервис:
docker compose build --no-cache src_telegram_bot_api
docker compose up -d src_telegram_bot_api- Выполнить команду внутри контейнера:
docker compose exec src_telegram_bot_api bash
# или для миграций Laravel:
docker compose exec src_telegram_bot_api php artisan migrate --force- Очистка тома PostgreSQL (внимание — удалит данные):
docker compose down
docker volume rm <repo_name>_postgres_data-
Если nginx не может подключиться к php-fpm — проверьте
fastcgi_pass(имя сервиса + порт, напримерsrc_telegram_bot_api:9000) и что сервис поднят. -
Для
depends_onв docker compose: это не ждёт пока сервис полностью готов. Для корректного тайминга используйтеhealthcheckилиwait-for-it.sh/dockerize.
Обновлённый .env.example включает основные переменные:
DEBUG_MODE,APP_ENVIRONMENT,APP_TIMEZONEDB_*(DB_HOST=postgres,DB_PORT=5432,DB_USERNAME,DB_PASSWORD)VITE_API_BASE_URL(локальноhttp://localhost:8007/api/v1, в продеhttps://api.yourdomain.com/api/v1)TASK_MATE_TELEGRAM_BOT_TOKENи другие токены — никогда в публичный репозиторий
- Не публикуйте
.envс секретами. - Не пробрасывайте порты БД/Valkey в проде.
- Используйте
docker composeс двумя файлами (-f docker-compose.yml -f docker-compose.prod.yml) для предсказуемости. - Храните бэкапы Postgres (pg_dump) и снимки томов.
Permission deniedпри записи вstorage— проверьте права и владельца в контейнере:chown -R www-data:www-data storage bootstrap/cache.Cannot connect to database— проверьте.envв контейнере иDB_HOST(postgresв сетиweb).Ports already in use— проверьте процессы на хосте:ss -tulpn | grep :8007и изменитеdocker-compose.override.ymlили освободите порт.
Пример шага в CI для деплоя:
# pull новых образов и поднять только prod-override
docker compose -f docker-compose.yml -f docker-compose.prod.yml pull
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --remove-orphansСекреты подставляйте через CI переменные, не храните в репозитории.
License: Proprietary License Copyright: © 2023-2025 谢榕川 All rights reserved.