https://github.com/luckyfoxdesign/docker-nginx-http
A production-ready secure HTTP Nginx setup with Docker featuring ModSecurity WAF, rate limiting, security headers, and token-based authentication. Designed for secure API gateway deployments with minimal configuration required.
https://github.com/luckyfoxdesign/docker-nginx-http
api-gateway containerization devops docker docker-compose infrastructure-as-code modsecurity nginx rate-limiting reverse-proxy security waf web-security
Last synced: 29 days ago
JSON representation
A production-ready secure HTTP Nginx setup with Docker featuring ModSecurity WAF, rate limiting, security headers, and token-based authentication. Designed for secure API gateway deployments with minimal configuration required.
- Host: GitHub
- URL: https://github.com/luckyfoxdesign/docker-nginx-http
- Owner: luckyfoxdesign
- Created: 2025-05-15T12:08:48.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2025-05-15T19:20:49.000Z (about 1 year ago)
- Last Synced: 2025-05-15T20:24:16.635Z (about 1 year ago)
- Topics: api-gateway, containerization, devops, docker, docker-compose, infrastructure-as-code, modsecurity, nginx, rate-limiting, reverse-proxy, security, waf, web-security
- Language: Dockerfile
- Homepage:
- Size: 6.84 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Nginx Docker — HTTP / HTTPS
Готовый nginx в Docker с защитой: rate limiting, security headers (включая HSTS), токен-авторизация.
Поддерживает два режима:
- **HTTP** — для локальной разработки или сервера без SSL
- **HTTPS** — для продакшена, сертификаты Let's Encrypt через Certbot
---
## Что нужно перед началом
- [Docker Desktop](https://www.docker.com/products/docker-desktop/) (включает Docker Compose)
- Git
Проверь что всё установлено:
```bash
docker --version
docker compose version
```
---
## Структура проекта
```
conf/
http-nginx.conf # Конфиг nginx для HTTP-режима
https-nginx.conf # Конфиг nginx для HTTPS-режима
snippets/
security-headers.conf # Заголовки безопасности
.env # Твои настройки (не коммитить!)
.env.example # Шаблон настроек
compose.yml # Docker Compose
Dockerfile # Образ nginx Alpine
entrypoint.sh # Подстановка переменных при старте
init-ssl.sh # Скрипт первого запуска с HTTPS
```
---
## Режим 1 — HTTP (локально или сервер без SSL)
### Шаг 1 — Клонируй репозиторий
```bash
git clone git@github.com:luckyfoxdesign/docker-nginx-http.git
cd docker-nginx-http
```
### Шаг 2 — Создай файл настроек
```bash
cp .env.example .env
```
Открой `.env` и заполни:
```env
NGINX_CONF=http-nginx.conf # HTTP-режим
DOMAINS=example.com # Твой домен (или localhost)
PRIMARY_DOMAIN=example.com # Главный домен (тот же)
LETSENCRYPT_EMAIL= # Можно оставить пустым
AUTH_TOKEN=Bearer замени-это # Секретный токен для API
```
> Для генерации сильного токена: `openssl rand -hex 32`
### Шаг 3 — Запусти
```bash
docker compose up -d
```
### Шаг 4 — Проверь что работает
```bash
curl http://localhost/healthz
# Должно вернуть: OK
```
---
## Режим 2 — HTTPS (продакшен на реальном сервере)
> Домен должен уже указывать на IP сервера, иначе Let's Encrypt не выдаст сертификат.
### Шаг 1 — Клонируй репозиторий
```bash
git clone git@github.com:luckyfoxdesign/docker-nginx-http.git
cd docker-nginx-http
```
### Шаг 2 — Создай файл настроек
```bash
cp .env.example .env
```
Открой `.env` и заполни:
```env
NGINX_CONF=http-nginx.conf # Скрипт сам переключит на https
DOMAINS=example.com www.example.com # Все домены через пробел
PRIMARY_DOMAIN=example.com # Главный домен (первый из списка)
LETSENCRYPT_EMAIL=you@email.com # Email для уведомлений Let's Encrypt
AUTH_TOKEN=Bearer замени-это # Секретный токен для API
```
> Для генерации сильного токена: `openssl rand -hex 32`
### Шаг 3 — Запусти скрипт инициализации
```bash
./init-ssl.sh
```
Скрипт сделает всё сам:
1. Поднимет nginx на HTTP для проверки домена
2. Получит SSL-сертификат от Let's Encrypt
3. Переключит nginx на HTTPS
4. Запустит автообновление сертификата
### Шаг 4 — Проверь что работает
```bash
curl https://example.com/healthz
# Должно вернуть: OK
```
---
## Подключить свой контейнер
Допустим, у тебя есть контейнер с приложением на порту 8080.
### Шаг 1 — Добавь его в `compose.yml`
Раскомментируй и отредактируй блок в конце файла:
```yaml
my-app:
image: my-app:latest
container_name: my-app-c
restart: always
networks:
- internal_net # Только внутренняя сеть — снаружи недоступен
# НЕ добавляй ports: — доступ только через nginx
```
### Шаг 2 — Добавь маршрут в nginx конфиг
Открой `conf/http-nginx.conf` (или `https-nginx.conf`) и добавь `location` внутрь нужного `server {}`:
```nginx
location /api/ {
proxy_pass http://my-app-c:8080;
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;
}
```
> Имя `my-app-c` — это `container_name` из compose.yml. Docker использует его как DNS внутри сети.
### Шаг 3 — Перезапусти
```bash
# HTTP-режим
docker compose up -d
# HTTPS-режим
docker compose --profile https up -d
```
---
## Полезные команды
```bash
# Посмотреть статус контейнеров
docker compose ps
# Посмотреть логи nginx
docker compose logs -f nginx-s
# Перезагрузить nginx без остановки (после изменения конфига)
docker exec nginx-c nginx -s reload
# Принудительно обновить сертификат
docker compose --profile https run --rm certbot renew --force-renewal
# Остановить всё
docker compose down
```
---
## Настройка токен-авторизации для API
Эндпоинты `/api/*` защищены Bearer-токеном. Сгенерируй сильный токен:
```bash
openssl rand -hex 32
```
Вставь результат в `.env`:
```env
AUTH_TOKEN=Bearer <сгенерированный-токен>
```
Чтобы обратиться к API:
```bash
curl -H "Authorization: Bearer <твой-токен>" https://example.com/api/signal
```
---
## License
MIT