Last active 2 weeks ago

Това е мениджър система, която лесно създава един или множество WordPress сайтове.

urocibg revised this gist 2 weeks ago. Go to revision

2 files changed, 680 insertions

wp-manager.sh(file created)

@@ -0,0 +1,352 @@
1 + #!/bin/bash
2 +
3 + # WordPress Multi-Site Manager
4 + # Създава изолирани WordPress инсталации с Docker
5 +
6 + set -e
7 +
8 + SITES_DIR="./sites"
9 + SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10 +
11 + # Цветове заOutput
12 + GREEN='\033[0;32m'
13 + BLUE='\033[0;34m'
14 + RED='\033[0;31m'
15 + NC='\033[0m'
16 +
17 + # Генериране на силна парола
18 + generate_password() {
19 + openssl rand -base64 32 | tr -d "=+/" | cut -c1-25
20 + }
21 +
22 + # Намиране на свободен порт
23 + find_free_port() {
24 + local start_port=8080
25 + while netstat -tuln 2>/dev/null | grep -q ":$start_port "; do
26 + start_port=$((start_port + 1))
27 + done
28 + echo $start_port
29 + }
30 +
31 + # Създаване на нов сайт
32 + create_site() {
33 + local site_name=$1
34 +
35 + if [ -z "$site_name" ]; then
36 + echo -e "${RED}Грешка: Въведи име на сайта${NC}"
37 + echo "Примерно: ./wp-manager.sh create mysite"
38 + exit 1
39 + fi
40 +
41 + local site_dir="$SITES_DIR/$site_name"
42 +
43 + if [ -d "$site_dir" ]; then
44 + echo -e "${RED}Грешка: Сайт '$site_name' вече съществува${NC}"
45 + exit 1
46 + fi
47 +
48 + echo -e "${BLUE}Създавам WordPress сайт: $site_name${NC}"
49 +
50 + # Създаване на директории
51 + mkdir -p "$site_dir"/{wordpress,mysql}
52 +
53 + # Генериране на пароли
54 + DB_PASSWORD=$(generate_password)
55 + WP_ADMIN_PASSWORD=$(generate_password)
56 +
57 + # Намиране на свободен порт
58 + HTTP_PORT=$(find_free_port)
59 +
60 + # Създаване на .env файл
61 + cat > "$site_dir/.env" << EOF
62 + # WordPress Site: $site_name
63 + # Създаден на: $(date)
64 +
65 + # MySQL настройки
66 + MYSQL_ROOT_PASSWORD=$(generate_password)
67 + MYSQL_DATABASE=wordpress
68 + MYSQL_USER=wpuser
69 + MYSQL_PASSWORD=$DB_PASSWORD
70 +
71 + # WordPress настройки
72 + WORDPRESS_DB_HOST=db:3306
73 + WORDPRESS_DB_NAME=wordpress
74 + WORDPRESS_DB_USER=wpuser
75 + WORDPRESS_DB_PASSWORD=$DB_PASSWORD
76 +
77 + # Admin достъп
78 + WP_ADMIN_USER=admin
79 + WP_ADMIN_PASSWORD=$WP_ADMIN_PASSWORD
80 + WP_ADMIN_EMAIL=admin@$site_name.local
81 +
82 + # Портове
83 + HTTP_PORT=$HTTP_PORT
84 + EOF
85 +
86 + # Създаване на docker-compose.yml
87 + cat > "$site_dir/docker-compose.yml" << 'EOF'
88 + version: '3.8'
89 +
90 + services:
91 + db:
92 + image: mysql:8.0
93 + container_name: ${COMPOSE_PROJECT_NAME}_db
94 + restart: unless-stopped
95 + volumes:
96 + - ./mysql:/var/lib/mysql
97 + environment:
98 + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
99 + MYSQL_DATABASE: ${MYSQL_DATABASE}
100 + MYSQL_USER: ${MYSQL_USER}
101 + MYSQL_PASSWORD: ${MYSQL_PASSWORD}
102 + networks:
103 + - wp_network
104 +
105 + wordpress:
106 + image: wordpress:latest
107 + container_name: ${COMPOSE_PROJECT_NAME}_wp
108 + restart: unless-stopped
109 + depends_on:
110 + - db
111 + ports:
112 + - "${HTTP_PORT}:80"
113 + volumes:
114 + - ./wordpress:/var/www/html
115 + - ./php.ini:/usr/local/etc/php/conf.d/custom.ini
116 + environment:
117 + WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST}
118 + WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME}
119 + WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
120 + WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD}
121 + networks:
122 + - wp_network
123 +
124 + networks:
125 + wp_network:
126 + driver: bridge
127 + EOF
128 +
129 + # Създаване на php.ini
130 + cat > "$site_dir/php.ini" << EOF
131 + ; Custom PHP settings
132 + upload_max_filesize = 256M
133 + post_max_size = 256M
134 + memory_limit = 512M
135 + max_execution_time = 300
136 + max_input_time = 300
137 + max_input_vars = 3000
138 +
139 + ; Error logging
140 + display_errors = Off
141 + log_errors = On
142 + error_log = /var/log/php_errors.log
143 +
144 + ; Session
145 + session.gc_maxlifetime = 1440
146 + session.cookie_httponly = On
147 +
148 + ; Security
149 + expose_php = Off
150 + allow_url_fopen = On
151 + EOF
152 +
153 + # Стартиране на контейнерите
154 + cd "$site_dir"
155 + COMPOSE_PROJECT_NAME="${site_name}" docker-compose up -d
156 +
157 + echo -e "${GREEN}✓ Сайт '$site_name' създаден успешно!${NC}"
158 + echo ""
159 + echo -e "${BLUE}Достъп до сайта:${NC}"
160 + echo " URL: http://localhost:$HTTP_PORT"
161 + echo " Admin: http://localhost:$HTTP_PORT/wp-admin"
162 + echo ""
163 + echo -e "${BLUE}Admin креденшъли:${NC}"
164 + echo " Потребител: admin"
165 + echo " Парола: $WP_ADMIN_PASSWORD"
166 + echo ""
167 + echo -e "${BLUE}Файлове:${NC}"
168 + echo " Локация: $site_dir"
169 + echo " .env файл: $site_dir/.env"
170 + echo ""
171 + echo -e "${GREEN}Изчакай 30-60 секунди за инициализация на базата${NC}"
172 + }
173 +
174 + # Спиране на сайт
175 + stop_site() {
176 + local site_name=$1
177 + local site_dir="$SITES_DIR/$site_name"
178 +
179 + if [ ! -d "$site_dir" ]; then
180 + echo -e "${RED}Грешка: Сайт '$site_name' не съществува${NC}"
181 + exit 1
182 + fi
183 +
184 + cd "$site_dir"
185 + COMPOSE_PROJECT_NAME="${site_name}" docker-compose stop
186 + echo -e "${GREEN}✓ Сайт '$site_name' спрян${NC}"
187 + }
188 +
189 + # Стартиране на сайт
190 + start_site() {
191 + local site_name=$1
192 + local site_dir="$SITES_DIR/$site_name"
193 +
194 + if [ ! -d "$site_dir" ]; then
195 + echo -e "${RED}Грешка: Сайт '$site_name' не съществува${NC}"
196 + exit 1
197 + fi
198 +
199 + cd "$site_dir"
200 + COMPOSE_PROJECT_NAME="${site_name}" docker-compose start
201 +
202 + source .env
203 + echo -e "${GREEN}✓ Сайт '$site_name' стартиран${NC}"
204 + echo " URL: http://localhost:$HTTP_PORT"
205 + }
206 +
207 + # Изтриване на сайт
208 + delete_site() {
209 + local site_name=$1
210 + local site_dir="$SITES_DIR/$site_name"
211 +
212 + if [ ! -d "$site_dir" ]; then
213 + echo -e "${RED}Грешка: Сайт '$site_name' не съществува${NC}"
214 + exit 1
215 + fi
216 +
217 + read -p "Сигурен ли си, че искаш да изтриеш '$site_name'? (yes/no): " confirm
218 + if [ "$confirm" != "yes" ]; then
219 + echo "Отказано"
220 + exit 0
221 + fi
222 +
223 + cd "$site_dir"
224 + COMPOSE_PROJECT_NAME="${site_name}" docker-compose down -v
225 + cd ..
226 + rm -rf "$site_dir"
227 +
228 + echo -e "${GREEN}✓ Сайт '$site_name' изтрит${NC}"
229 + }
230 +
231 + # Списък със сайтове
232 + list_sites() {
233 + if [ ! -d "$SITES_DIR" ] || [ -z "$(ls -A $SITES_DIR 2>/dev/null)" ]; then
234 + echo "Няма създадени сайтове"
235 + exit 0
236 + fi
237 +
238 + echo -e "${BLUE}Налични WordPress сайтове:${NC}"
239 + echo ""
240 +
241 + for site_path in "$SITES_DIR"/*/ ; do
242 + if [ -d "$site_path" ]; then
243 + site_name=$(basename "$site_path")
244 + env_file="$site_path.env"
245 +
246 + if [ -f "$env_file" ]; then
247 + # Вземаме порта от .env
248 + HTTP_PORT=$(grep "^HTTP_PORT=" "$env_file" | cut -d'=' -f2)
249 +
250 + # Проверяваме дали контейнерът работи (без wp_ префикс)
251 + container_id=$(docker ps -q -f "name=${site_name}_wp" 2>/dev/null)
252 +
253 + if [ -n "$container_id" ]; then
254 + echo -e " ${GREEN}●${NC} $site_name - http://localhost:$HTTP_PORT"
255 + else
256 + echo -e " ${RED}○${NC} $site_name - http://localhost:$HTTP_PORT (спрян)"
257 + fi
258 + fi
259 + fi
260 + done
261 + }
262 +
263 + # Показване на информация за сайт
264 + info_site() {
265 + local site_name=$1
266 + local site_dir="$SITES_DIR/$site_name"
267 +
268 + if [ ! -d "$site_dir" ]; then
269 + echo -e "${RED}Грешка: Сайт '$site_name' не съществува${NC}"
270 + exit 1
271 + fi
272 +
273 + source "$site_dir/.env"
274 +
275 + echo -e "${BLUE}Информация за сайт: $site_name${NC}"
276 + echo ""
277 + echo "URL: http://localhost:$HTTP_PORT"
278 + echo "Admin: http://localhost:$HTTP_PORT/wp-admin"
279 + echo ""
280 + echo "WordPress Admin:"
281 + echo " Потребител: $WP_ADMIN_USER"
282 + echo " Парола: $WP_ADMIN_PASSWORD"
283 + echo ""
284 + echo "MySQL:"
285 + echo " База: $MYSQL_DATABASE"
286 + echo " Потребител: $MYSQL_USER"
287 + echo " Парола: $MYSQL_PASSWORD"
288 + echo ""
289 + echo "Файлове: $site_dir"
290 + }
291 +
292 + # Помощна информация
293 + show_help() {
294 + cat << EOF
295 + WordPress Multi-Site Manager
296 +
297 + Използване:
298 + ./wp-manager.sh <команда> [опции]
299 +
300 + Команди:
301 + create <име> Създаване на нов WordPress сайт
302 + start <име> Стартиране на съществуващ сайт
303 + stop <име> Спиране на работещ сайт
304 + delete <име> Изтриване на сайт (с потвърждение)
305 + list Показване на всички сайтове
306 + info <име> Информация и креденшъли за сайт
307 + help Показване на тази помощ
308 +
309 + Примери:
310 + ./wp-manager.sh create mysite
311 + ./wp-manager.sh list
312 + ./wp-manager.sh info mysite
313 + ./wp-manager.sh stop mysite
314 + ./wp-manager.sh delete mysite
315 +
316 + EOF
317 + }
318 +
319 + # Главна логика
320 + main() {
321 + mkdir -p "$SITES_DIR"
322 +
323 + case "${1:-}" in
324 + create)
325 + create_site "$2"
326 + ;;
327 + start)
328 + start_site "$2"
329 + ;;
330 + stop)
331 + stop_site "$2"
332 + ;;
333 + delete)
334 + delete_site "$2"
335 + ;;
336 + list)
337 + list_sites
338 + ;;
339 + info)
340 + info_site "$2"
341 + ;;
342 + help|--help|-h)
343 + show_help
344 + ;;
345 + *)
346 + show_help
347 + exit 1
348 + ;;
349 + esac
350 + }
351 +
352 + main "$@"

wp_readme.md(file created)

@@ -0,0 +1,328 @@
1 + # WordPress Multi-Site Manager - Инструкции
2 +
3 + Система за лесно създаване и управление на множество WordPress сайтове с Docker.
4 +
5 + ---
6 +
7 + ## 🚀 Първоначална инсталация
8 +
9 + ```bash
10 + # 1. Създай файла
11 + nano wp-manager.sh
12 +
13 + # 2. Копирай скрипта вътре
14 +
15 + # 3. Направи го изпълним
16 + chmod +x wp-manager.sh
17 +
18 + # 4. Добави Docker права (само първи път)
19 + sudo usermod -aG docker $USER
20 + newgrp docker
21 + ```
22 +
23 + ---
24 +
25 + ## 📋 Основни команди
26 +
27 + ### Създаване на нов сайт
28 + ```bash
29 + ./wp-manager.sh create mysite
30 + ```
31 + - Автоматично генерира пароли
32 + - Намира свободен порт
33 + - Стартира MySQL + WordPress
34 + - Готово за ползване след 30-60 секунди
35 +
36 + ### Списък с всички сайтове
37 + ```bash
38 + ./wp-manager.sh list
39 + ```
40 + - Показва активни (●) и спрени (○) сайтове
41 + - Показва портовете на всеки сайт
42 +
43 + ### Информация за сайт (ВАЖНО!)
44 + ```bash
45 + ./wp-manager.sh info mysite
46 + ```
47 + **ТУК СА ВСИЧКИ ПАРОЛИ И ДАННИ:**
48 + - URL на сайта
49 + - Admin потребител и парола
50 + - MySQL креденшъли
51 + - Локация на файловете
52 +
53 + ### Спиране на сайт
54 + ```bash
55 + ./wp-manager.sh stop mysite
56 + ```
57 + Спира контейнерите, но запазва данните
58 +
59 + ### Стартиране на сайт
60 + ```bash
61 + ./wp-manager.sh start mysite
62 + ```
63 + Стартира спрян сайт
64 +
65 + ### Изтриване на сайт
66 + ```bash
67 + ./wp-manager.sh delete mysite
68 + ```
69 + **ВНИМАНИЕ:** Изтрива всичко - файлове, база данни, всичко!
70 + Ще поиска потвърждение (трябва да напишеш `yes`)
71 +
72 + ### Помощ
73 + ```bash
74 + ./wp-manager.sh help
75 + ```
76 +
77 + ---
78 +
79 + ## 🌐 Как да отворя сайта
80 +
81 + ### Локално (на същата машина):
82 + ```bash
83 + http://localhost:8080
84 + ```
85 +
86 + ### От друг компютър в мрежата:
87 + ```bash
88 + http://10.20.20.79:8080
89 + ```
90 + *(Замени с твоя IP и порт)*
91 +
92 + ### WordPress Admin:
93 + ```bash
94 + http://10.20.20.79:8080/wp-admin
95 + ```
96 +
97 + **Портът зависи от сайта! Виж го с:**
98 + ```bash
99 + ./wp-manager.sh list # или
100 + ./wp-manager.sh info mysite
101 + ```
102 +
103 + ---
104 +
105 + ## 🔥 Отваряне на портове във firewall
106 +
107 + Ако не можеш да достъпиш сайта отвън:
108 +
109 + ```bash
110 + # За UFW (Ubuntu/Debian)
111 + sudo ufw allow 8080/tcp
112 + sudo ufw allow 8081/tcp
113 + sudo ufw allow 8082/tcp
114 +
115 + # За Firewalld (CentOS/RHEL)
116 + sudo firewall-cmd --add-port=8080-8090/tcp --permanent
117 + sudo firewall-cmd --reload
118 +
119 + # Провери статуса
120 + sudo ufw status
121 + # или
122 + sudo firewall-cmd --list-ports
123 + ```
124 +
125 + ---
126 +
127 + ## 📁 Структура на файловете
128 +
129 + ```
130 + .
131 + ├── wp-manager.sh # Главният скрипт
132 + ├── README.md # Този файл
133 + └── sites/ # Всички сайтове са тук
134 + ├── mysite/
135 + │ ├── docker-compose.yml
136 + │ ├── .env # ПАРОЛИ И НАСТРОЙКИ
137 + │ ├── php.ini # PHP конфигурация
138 + │ ├── wordpress/ # WordPress файлове
139 + │ └── mysql/ # MySQL база данни
140 + ├── site2/
141 + └── site3/
142 + ```
143 +
144 + ---
145 +
146 + ## 🔧 Работа с файловете на сайта
147 +
148 + ### WordPress файлове:
149 + ```bash
150 + cd sites/mysite/wordpress
151 + ```
152 + Тук са всички WordPress файлове (themes, plugins, uploads)
153 +
154 + ### Backup на сайт:
155 + ```bash
156 + # Архивирай целия сайт
157 + tar -czf mysite-backup.tar.gz sites/mysite/
158 +
159 + # Възстанови
160 + tar -xzf mysite-backup.tar.gz
161 + ./wp-manager.sh start mysite
162 + ```
163 +
164 + ### Преглед на логове:
165 + ```bash
166 + cd sites/mysite
167 + docker-compose logs -f wordpress # WordPress логове
168 + docker-compose logs -f db # MySQL логове
169 + ```
170 +
171 + ---
172 +
173 + ## 💡 Примерни сценарии
174 +
175 + ### Създаване на 3 тестови сайта наведнъж:
176 + ```bash
177 + ./wp-manager.sh create test1
178 + ./wp-manager.sh create test2
179 + ./wp-manager.sh create test3
180 + ./wp-manager.sh list
181 + ```
182 +
183 + ### Временно спиране на сайт:
184 + ```bash
185 + ./wp-manager.sh stop test2
186 + # ... работиш по друго ...
187 + ./wp-manager.sh start test2
188 + ```
189 +
190 + ### Виждане на всички пароли за сайт:
191 + ```bash
192 + ./wp-manager.sh info test1
193 + # или директно
194 + cat sites/test1/.env
195 + ```
196 +
197 + ### Production deployment:
198 + ```bash
199 + # Създай сайта
200 + ./wp-manager.sh create production
201 +
202 + # Вземи данните
203 + ./wp-manager.sh info production
204 +
205 + # Отвори порта
206 + sudo ufw allow 8080/tcp
207 +
208 + # Готово! http://your-server-ip:8080
209 + ```
210 +
211 + ---
212 +
213 + ## ⚙️ PHP настройки
214 +
215 + Всеки сайт има `php.ini` с оптимизирани настройки:
216 +
217 + - **Upload limit:** 256MB
218 + - **Memory limit:** 512MB
219 + - **Execution time:** 300 секунди
220 + - **Max vars:** 3000
221 +
222 + Можеш да ги промениш в `sites/mysite/php.ini` и рестартираш:
223 + ```bash
224 + ./wp-manager.sh stop mysite
225 + ./wp-manager.sh start mysite
226 + ```
227 +
228 + ---
229 +
230 + ## 🔒 Сигурност
231 +
232 + - **Паролите** се генерират автоматично и са 25 символа
233 + - **MySQL** не е достъпна отвън (само за WordPress)
234 + - **Всеки сайт** е изолиран в собствена Docker мрежа
235 + - **.env файловете** съдържат чувствителни данни - не ги качвай в Git!
236 +
237 + ### За production:
238 + ```bash
239 + # Променете admin паролата след първо влизане!
240 + # Инсталирайте SSL сертификат
241 + # Добавете .htaccess за сигурност
242 + ```
243 +
244 + ---
245 +
246 + ## 🐛 Проблеми и решения
247 +
248 + ### Сайтът не се отваря след създаване
249 + ```bash
250 + # Изчакай 60 секунди за MySQL инициализация
251 + # Провери дали контейнерите работят:
252 + cd sites/mysite
253 + docker-compose ps
254 + ```
255 +
256 + ### Порт е зает
257 + ```bash
258 + # Скриптът автоматично намира свободен порт
259 + # Ако има проблем, спри стария сайт:
260 + ./wp-manager.sh stop oldsite
261 + ```
262 +
263 + ### Permission denied
264 + ```bash
265 + sudo chown -R $USER:$USER sites/
266 + ```
267 +
268 + ### Docker not running
269 + ```bash
270 + sudo systemctl start docker
271 + sudo systemctl enable docker
272 + ```
273 +
274 + ### База данни не се свързва
275 + ```bash
276 + cd sites/mysite
277 + docker-compose down
278 + docker-compose up -d
279 + # Изчакай 30 секунди
280 + ```
281 +
282 + ---
283 +
284 + ## 📊 Ресурси
285 +
286 + - **Документация:** [WordPress Docker](https://hub.docker.com/_/wordpress)
287 + - **Docker Compose:** [docs.docker.com](https://docs.docker.com/compose/)
288 + - **PHP настройки:** [php.net](https://www.php.net/manual/en/ini.core.php)
289 +
290 + ---
291 +
292 + ## 🎯 Бързи команди (за копиране)
293 +
294 + ```bash
295 + # Нов сайт
296 + ./wp-manager.sh create mysite
297 +
298 + # Виж пароли
299 + ./wp-manager.sh info mysite
300 +
301 + # Списък
302 + ./wp-manager.sh list
303 +
304 + # Отвори порт
305 + sudo ufw allow 8080/tcp
306 +
307 + # Логове
308 + cd sites/mysite && docker-compose logs -f
309 +
310 + # Backup
311 + tar -czf backup.tar.gz sites/mysite/
312 + ```
313 +
314 + ---
315 +
316 + ## 📝 Бележки
317 +
318 + - Всеки сайт използва около **500MB-1GB** RAM
319 + - MySQL данните са в `sites/mysite/mysql/`
320 + - WordPress файловете са в `sites/mysite/wordpress/`
321 + - Сайтовете са **production-ready** - можеш да ги използваш направо
322 + - Не е нужен Nginx/Apache - Docker се грижи за всичко
323 +
324 + ---
325 +
326 + **Направено с ❤️ за лесна WordPress разработка**
327 +
328 + *Последна актуализация: 2026-01-14*
Newer Older