Title here
Summary here
В этом руководстве мы настроим полную инфраструктуру для статического сайта my-site.ru:
my-site.ru, указывающий на IP сервераmkdir -p ~/my-site
cd ~/my-sitecat > index.html << 'EOF'
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Мой сайт</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 50px;
text-align: center;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
}
h1 { font-size: 3em; margin-bottom: 20px; }
.container { max-width: 800px; margin: 0 auto; }
</style>
</head>
<body>
<div class="container">
<h1>Мой сайт работает!</h1>
<p>Сайт развернут в Docker контейнере</p>
<p>SSL сертификат настроен через Let's Encrypt</p>
</div>
</body>
</html>
EOFcat > Dockerfile << 'EOF'
FROM nginx:alpine
# Копируем статические файлы
COPY index.html /usr/share/nginx/html/
COPY 404.html /usr/share/nginx/html/
# Настройка Nginx
RUN echo 'server { \
listen 80; \
root /usr/share/nginx/html; \
index index.html; \
server_name localhost; \
location / { \
try_files $uri $uri/ =404; \
} \
}' > /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
EOFcat > 404.html << 'EOF'
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Страница не найдена</title>
</head>
<body>
<h1>404 - Страница не найдена</h1>
<a href="/">Вернуться на главную</a>
</body>
</html>
EOFdocker build -t my-site:latest .docker run -d \
--name my-site \
--restart unless-stopped \
-p 9000:80 \
my-site:latest# Проверка статуса контейнера
docker ps | grep my-site
# Проверка доступа к сайту локально
curl -I http://localhost:9000sudo apt update
sudo apt install -y nginxsudo nano /etc/nginx/sites-available/my-site.ruВставьте настройки конфигурации в файл my-site.ru:
# HTTP - временная конфигурация для получения сертификата
server {
listen 80;
server_name my-site.ru www.my-site.ru;
location / {
proxy_pass http://localhost:9000;
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;
}
}# Создайте симлинк
sudo ln -s /etc/nginx/sites-available/my-site.ru /etc/nginx/sites-enabled/
# Проверьте конфигурацию
sudo nginx -t
# Перезагрузите Nginx
sudo systemctl reload nginxsudo apt update
sudo apt install -y certbot python3-certbot-nginxsudo certbot --nginx -d my-site.ru -d www.my-site.ruВо время установки:
sudo certbot certificatesВы должны увидеть:
Certificate Name: my-site.ru
Domains: my-site.ru www.my-site.ru
Expiry Date: 2026-06-03 (VALID: 89 days)Certbot автоматически обновил конфигурацию Nginx. Проверьте её:
sudo cat /etc/nginx/sites-available/my-site.ruКонфигурация должна выглядеть примерно так:
server {
server_name my-site.ru www.my-site.ru;
location / {
proxy_pass http://localhost:9000;
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;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/my-site.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/my-site.ru/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
if ($host = www.my-site.ru) {
return 301 https://$host$request_uri;
}
if ($host = my-site.ru) {
return 301 https://$host$request_uri;
}
listen 80;
server_name my-site.ru www.my-site.ru;
return 404;
}# Проверьте статус таймера
sudo systemctl status certbot.timer
# Посмотрите время следующего запуска
sudo systemctl list-timers --all | grep certbotСоздайте deploy hook:
sudo mkdir -p /etc/letsencrypt/renewal-hooks/deploy
sudo nano /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.shВставьте скрипт:
#!/bin/bash
systemctl reload nginxСделайте его исполняемым:
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh# Тестовый прогон
sudo certbot renew --dry-runsudo nano /usr/local/bin/check-ssl-status.sh#!/bin/bash
DOMAIN="my-site.ru"
echo "=== СТАТУС SSL СЕРТИФИКАТА ==="
sudo certbot certificates | grep -A 3 "Certificate Name: $DOMAIN"
echo -e "\n=== ТАЙМЕР АВТООБНОВЛЕНИЯ ==="
sudo systemctl status certbot.timer --no-pager | grep -E "Active|Trigger"
echo -e "\n=== ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ ==="
sudo journalctl -u certbot.service --since "1 week ago" | grep -E "renew|Certificate" | tail -5
echo -e "\n=== СТАТУС КОНТЕЙНЕРА ==="
docker ps --filter "name=my-site" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
echo -e "\n=== СТАТУС NGINX ==="
sudo systemctl status nginx --no-pager | grep "Active"Сделайте скрипт исполняемым:
sudo chmod +x /usr/local/bin/check-ssl-status.sh# Проверка HTTP -> HTTPS перенаправления
curl -I http://my-site.ru
# Проверка HTTPS
curl -I https://my-site.ru
# Проверка сертификата
echo | openssl s_client -connect my-site.ru:443 -servername my-site.ru 2>/dev/null | openssl x509 -noout -datessudo /usr/local/bin/check-ssl-status.shПерейдите по адресу https://my-site.ru - вы должны увидеть созданную HTML страницу с зеленым замком в адресной строке.
# Проверьте логи
sudo journalctl -u certbot.service -f
# Запустите обновление вручную
sudo certbot renew --force-renewal# Проверьте hook
sudo ls -la /etc/letsencrypt/renewal-hooks/deploy/
sudo cat /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
# Проверьте права
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh# Проверьте логи контейнера
docker logs my-site
# Перезапустите контейнер
docker restart my-siteВаш сайт защищен и будет автоматически поддерживать актуальный SSL сертификат без вашего участия!
# Проверка статуса сертификата
sudo certbot certificates
# Ручное обновление (если нужно)
sudo certbot renew
# Просмотр логов обновления
sudo journalctl -u certbot.service -f
# Перезапуск контейнера
docker restart my-site
# Просмотр логов контейнера
docker logs my-site
# Проверка конфигурации Nginx
sudo nginx -t
sudo systemctl reload nginx