В нашем случае, для быстрого развертывания web-сервера понадобится следующее:
- Docker
- Nginx
- Certbot
Директория проекта: cerbottest:
mkdir cerbottest
Далее создадим файл docker-compose:
services:
web1:
image: nginx
ports:
- "8081:80"
- "443:443"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
- ./nginx/web.conf:/etc/nginx/conf.d/web.conf:ro
- ./volume1/www:/var/www
- ./nginx/cert.pem:/etc/cert.pem
- ./nginx/key.pem:/etc/key.pem
web2:
image: httpd
ports:
- 8082:80
php:
image: php:8.2-fpm
ports:
- 9001:9001
volumes:
#- /mnt:/var/www
- ./volume1/www:/var/www
certbot:
ports:
- "6000:80"
env_file:
- .env
# и снова мониторуем директорию nginx
volumes:
- ./nginx/:/etc/nginx/
build:
context: ./certbot
dockerfile: Dockerfile
# задаем переменные среды
args:
DOMAIN_EMAIL: ${DOMAIN_EMAIL}
DOMAIN_URL: ${DOMAIN_URL}
configs:
app_config:
external: true
nginx_config:
external: true
Также отдельную директорию certbot с файлами Dockerfile и create-certificate.sh:
Dockerfile:
# Dockerfile
FROM ubuntu:22.04
EXPOSE 6000 80
# читаем переменные среды из .env
ARG DOMAIN_EMAIL
ARG DOMAIN_URL
# устанавливаем переменные среды в переменные
ENV DOMAIN_EMAIL=$DOMAIN_EMAIL
ENV DOMAIN_URL=$DOMAIN_URL
WORKDIR /certbot
COPY . /certbot
WORKDIR /certbot
RUN apt-get update
RUN apt-get -y install certbot
# запускаем скрипт генерации
CMD ["sh", "create-certificate.sh"]
create-certificate.sh:
#!/bin/bash
# create-certificate.sh
# чистим папку, где могут находиться старые сертификаты
rm -rf /etc/letsencrypt/live/certfolder*
# выдаем себе сертификат (обратите внимание на переменные среды)
certbot certonly --standalone --email $DOMAIN_EMAIL -d $DOMAIN_URL --cert-name=certfolder --key-type rsa --agree-tos
# удаляем старые сертификаты из примонтированной
# через Docker Compose папки Nginx
rm -rf /etc/nginx/cert.pem
rm -rf /etc/nginx/key.pem
# копируем сертификаты из образа certbot в папку Nginx
cp /etc/letsencrypt/live/certfolder*/fullchain.pem /etc/nginx/cert.pem
cp /etc/letsencrypt/live/certfolder*/privkey.pem /etc/nginx/key.pem
В качестве монтируемого тома также понадобится следующие папки:
Файл index.php для PHP-FPM:
<?php
function getUserIP()
{
// Get real visitor IP behind CloudFlare network
if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
$_SERVER['HTTP_CLIENT_IP'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
}
$client = @$_SERVER['HTTP_CLIENT_IP'];
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
$remote = $_SERVER['REMOTE_ADDR'];
if(filter_var($client, FILTER_VALIDATE_IP))
{
$ip = $client;
}
elseif(filter_var($forward, FILTER_VALIDATE_IP))
{
$ip = $forward;
}
else
{
$ip = $remote;
}
return $ip;
}
$user_ip = getUserIP();
echo '<div style="clear:both;"><h2>Mysql</h2></div>';
echo '<br/>';
echo $user_ip; // Output IP address [Ex: 177.87.193.134]
?>
В директории nginx создайте два файла web.conf и default.conf
web.conf:
server {
listen 80;
#server_name ;
root /var/www/public_html;
#error_log /var/log/nginx/error.log;
#access_log /var/www/app/log/nginx/access.log;
client_max_body_size 100m;
# мы уже примонтировали сертификаты в Docker Compose
# делаем переадресацию с HTTP на HTTPS
location / {
return 301 https://$host$request_uri;
}
# URL certbot'a, где он будет слушать входящие
# подключения во время выдачи SSL
location /.well-known {
# адрес certbot'a в Docker Compose на Linux
proxy_pass http://172.17.0.1:6000;
}
}
~
default.conf
server {
#listen 80;
listen 443 ssl http2;
#server_name ;
root /var/www/public_html;
error_log /var/www/log/nginx/error.log;
access_log /var/www/log/nginx/access.log;
client_max_body_size 100m;
# мы уже примонтировали сертификаты в Docker Compose
ssl_certificate /etc/cert.pem;
ssl_certificate_key /etc/key.pem;
location / {
# try to serve file directly, fallback to index.php
try_files $uri /index.php$is_args$args;
}
#location / {
# index index.php index.html;
#}
# URL certbot'a, где он будет слушать входящие
# подключения во время выдачи SSL
location /.well-known {
# адрес certbot'a в Docker Compose на Linux
proxy_pass http://172.17.0.1:6000;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
}
}
Так же обязательно создайте в директории nginx файла cert.perm и key.pem с любым текстом.
Файл .env в корне:
# .env
DOMAIN_URL=site.ru
DOMAIN_EMAIL=mail@rambler.ru
Запускаем nginx:
docker compose up web1 --build -d
Затем certbot:
docker compose up certbot --build
При запуске certbot должно появится следующее:
Это говорит что все успешно, зайдите на ваш домен, должно получится нечто следующее:
76 просмотров
Взаимосвязанные материалы
Типичный пример быстрой настройки Docker и Nginx c доступом по https. читать...
Небольшая статья - продолжение предыдущих трёх статей:
читать...Продолжаем настройку кластера Swarm. В этой статье мы попробуем добавить Traefik к уже существующему стэку Docker Swarm. читать...
Docker Swarm и Nginx, PHP. Вебсервер в кластере Docker Swarm. Часть 2. Mysql. В этой статье мы попробуем добавить сервер mysql к уже существующему стэку Docker Swarm. читать...
С помощью Docker можно быстро развернуть рабочее web приложение с различными настройками и версиями. Docker Swarm выступает инструментом «оркестрации» контейнеров Docker, который позволяет управлять контейнерами как единое целое. читать...