This repository was archived by the owner on Aug 23, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsetup-ssl.sh
More file actions
161 lines (130 loc) · 5.34 KB
/
setup-ssl.sh
File metadata and controls
161 lines (130 loc) · 5.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#!/bin/bash
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Функция для чтения пользовательского ввода
read_input() {
local prompt="$1"
local var_name="$2"
local default="$3"
if [ -n "$default" ]; then
echo -e "${BLUE}$prompt${NC} [${YELLOW}$default${NC}]: "
else
echo -e "${BLUE}$prompt${NC}: "
fi
read input
if [ -z "$input" ] && [ -n "$default" ]; then
input="$default"
fi
eval "$var_name='$input'"
}
# Функция для подтверждения
confirm() {
local prompt="$1"
while true; do
echo -e "${YELLOW}$prompt${NC} (y/n): "
read yn
case $yn in
[Yy]* ) return 0;;
[Nn]* ) return 1;;
* ) echo "Пожалуйста, ответьте y или n.";;
esac
done
}
echo -e "${GREEN}=== Настройка SSL сертификатов для CookieCMS ===${NC}"
echo ""
# Проверяем, что nginx и certbot настроены в docker-compose
if ! grep -q "nginx:" docker-compose.yml; then
echo -e "${RED}Ошибка: nginx не найден в docker-compose.yml${NC}"
echo "Убедитесь, что вы добавили nginx и certbot в docker-compose.yml"
exit 1
fi
# Получаем домен
read_input "Введите ваш домен (например, example.com)" DOMAIN_NAME
read_input "Введите email для Let's Encrypt" EMAIL
if [ -z "$DOMAIN_NAME" ] || [ -z "$EMAIL" ]; then
echo -e "${RED}Ошибка: домен и email обязательны${NC}"
exit 1
fi
echo ""
echo -e "${YELLOW}Домен: $DOMAIN_NAME${NC}"
echo -e "${YELLOW}Email: $EMAIL${NC}"
echo ""
if ! confirm "Продолжить настройку SSL?"; then
echo "Настройка отменена"
exit 0
fi
# Создаем директории для certbot
echo -e "${GREEN}Создание директорий для certbot...${NC}"
mkdir -p certbot/conf
mkdir -p certbot/www
# Обновляем конфигурацию nginx с реальным доменом
echo -e "${GREEN}Обновление конфигурации nginx...${NC}"
sed "s/\${DOMAIN_NAME}/$DOMAIN_NAME/g" nginx/conf.d/default.conf > nginx/conf.d/ssl.conf
# Временно переименовываем SSL конфиг
mv nginx/conf.d/ssl.conf nginx/conf.d/ssl.conf.temp
# Создаем временную конфигурацию для получения сертификата
cat > nginx/conf.d/temp.conf << EOF
server {
listen 80;
server_name $DOMAIN_NAME;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 200 'Server is ready for SSL setup';
add_header Content-Type text/plain;
}
}
EOF
# Запускаем nginx для получения сертификата
echo -e "${GREEN}Запуск nginx для получения сертификата...${NC}"
docker-compose up -d nginx
# Ждем запуска nginx
sleep 10
# Получаем сертификат
echo -e "${GREEN}Получение SSL сертификата от Let's Encrypt...${NC}"
docker-compose run --rm certbot certonly \
--webroot \
--webroot-path=/var/www/certbot \
--email $EMAIL \
--agree-tos \
--no-eff-email \
-d $DOMAIN_NAME
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ Сертификат успешно получен!${NC}"
# Удаляем временную конфигурацию
rm nginx/conf.d/temp.conf
# Возвращаем SSL конфигурацию
mv nginx/conf.d/ssl.conf.temp nginx/conf.d/ssl.conf
# Удаляем localhost конфиг для продакшена
if [ -f nginx/conf.d/localhost.conf ]; then
mv nginx/conf.d/localhost.conf nginx/conf.d/localhost.conf.backup
fi
# Перезапускаем nginx с SSL
echo -e "${GREEN}Перезапуск nginx с SSL конфигурацией...${NC}"
docker-compose restart nginx
echo ""
echo -e "${GREEN}=== SSL настроен успешно! ===${NC}"
echo -e "Ваш сайт доступен по адресу: ${BLUE}https://$DOMAIN_NAME${NC}"
echo -e "API доступно по адресу: ${BLUE}https://$DOMAIN_NAME/api${NC}"
echo -e "PgAdmin доступен по адресу: ${BLUE}https://$DOMAIN_NAME/pgadmin${NC}"
else
echo -e "${RED}❌ Ошибка при получении сертификата${NC}"
echo "Возможные причины:"
echo "1. Домен не указывает на этот сервер"
echo "2. Порт 80 недоступен извне"
echo "3. Firewall блокирует соединения"
# Возвращаем localhost конфигурацию
rm nginx/conf.d/temp.conf 2>/dev/null
rm nginx/conf.d/ssl.conf.temp 2>/dev/null
echo ""
echo -e "${YELLOW}Возврат к localhost конфигурации...${NC}"
docker-compose restart nginx
fi
echo ""
echo -e "${BLUE}Для автоматического обновления сертификатов certbot уже настроен в docker-compose.yml${NC}"
echo -e "${BLUE}Сертификаты будут обновляться каждые 12 часов${NC}"