setup_hosting.sh
· 10 KiB · Bash
原始檔案
#!/bin/bash
# =============================================================================
# Modular Hosting Setup with optional Cloudflare Tunnel
# Author Fedya Serafiev
# Site itpraktika.com
# =============================================================================
set -euo pipefail
# -- Colors -------------------------------------------------------------------
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
CYAN='\033[0;36m'; BOLD='\033[1m'; RESET='\033[0m'
info() { echo -e "${CYAN}[INFO] $*${RESET}"; }
success() { echo -e "${GREEN}[OK] $*${RESET}"; }
warn() { echo -e "${YELLOW}[WARN] $*${RESET}"; }
error() { echo -e "${RED}[ERROR] $*${RESET}" >&2; exit 1; }
# -- Password generator -------------------------------------------------------
gen_pass() {
openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c 24
}
# -- Input validation ---------------------------------------------------------
validate_yn() {
[[ "$1" =~ ^[yYnN]$ ]] || error "Vuvedete 'y' ili 'n'."
}
validate_count() {
[[ "$1" =~ ^[0-2]$ ]] || error "Vuvedete 0, 1 ili 2."
}
# =============================================================================
echo -e "\n${BOLD}================================================${RESET}"
echo -e "${BOLD} Modular Hosting Setup - Izberete moduli ${RESET}"
echo -e "${BOLD}================================================${RESET}\n"
# =============================================================================
# [1/4] Module selection
# =============================================================================
echo -e "${BOLD}[1/4] Izberete koi moduli da se instalират:${RESET}\n"
read -rp " Instaliraj Cloudflare Tunnel? (y/n): " install_cf
validate_yn "$install_cf"; install_cf="${install_cf,,}"
read -rp " Instaliraj Uptime Kuma? (y/n): " install_kuma
validate_yn "$install_kuma"; install_kuma="${install_kuma,,}"
read -rp " Broy WordPress sajtove? (0/1/2): " wp_count
validate_count "$wp_count"
# At least one module must be selected
if [[ "$install_cf" == "n" && "$install_kuma" == "n" && "$wp_count" == "0" ]]; then
error "Tryabva da izberete poне edin modul."
fi
# DB is needed only when WordPress is requested
need_db="n"
[[ "$wp_count" -ge 1 ]] && need_db="y"
# =============================================================================
# [2/4] Cloudflare Tunnel config (only if selected)
# =============================================================================
CLOUDFLARED_CMD=""
CF_ENV_LINE=""
CF_TOKEN_IN_ENV="# Cloudflare Tunnel not installed"
cf_method=""
if [[ "$install_cf" == "y" ]]; then
echo -e "\n${BOLD}[2/4] Cloudflare Tunnel - metod na svarzavane${RESET}"
echo " 1) Token - vuvedash gotov token ot Cloudflare Dashboard"
echo " 2) Login - cloudflared se logva sam (URL / brauzar)"
echo ""
read -rp " Izberi metod [1/2]: " cf_method
case "$cf_method" in
1)
read -rp " Vuvedete Tunnel Token: " cf_token
[[ -n "$cf_token" ]] || error "Tokenat ne mozhe da e prazen."
CLOUDFLARED_CMD='tunnel --no-autoupdate run --token ${TUNNEL_TOKEN}'
CF_ENV_LINE=" - TUNNEL_TOKEN=\${TUNNEL_TOKEN}"
CF_TOKEN_IN_ENV="TUNNEL_TOKEN=$cf_token"
;;
2)
info "cloudflared shte izvede URL za avtentikaciya pri start."
CLOUDFLARED_CMD='tunnel --no-autoupdate login'
CF_ENV_LINE=""
CF_TOKEN_IN_ENV="# TUNNEL_TOKEN= (login method - not needed)"
cf_token=""
;;
*)
error "Nevaliден izbor. Vuvedete 1 ili 2."
;;
esac
else
info "Cloudflare Tunnel - skipped."
fi
# =============================================================================
# [3/4] Generate passwords
# =============================================================================
echo -e "\n${BOLD}[3/4] Generirane na paroli...${RESET}"
DB_ROOT_PASS=$(gen_pass)
WP1_DB_PASS=$(gen_pass)
WP2_DB_PASS=$(gen_pass)
# =============================================================================
# [4/4] Generate files
# =============================================================================
echo -e "\n${BOLD}[4/4] Generirane na konfiguracionnite fajlove...${RESET}"
# -- .env ---------------------------------------------------------------------
cat > .env <<ENVEOF
# -- Cloudflare ---------------------------------------------------------------
$CF_TOKEN_IN_ENV
# -- Database -----------------------------------------------------------------
DB_ROOT_PASSWORD=$DB_ROOT_PASS
WP1_DB_PASSWORD=$WP1_DB_PASS
WP2_DB_PASSWORD=$WP2_DB_PASS
ENVEOF
chmod 600 .env
success ".env created (chmod 600)"
# -- DB init SQL (only when WP is needed) -------------------------------------
if [[ "$need_db" == "y" ]]; then
mkdir -p db-init
SQL_CONTENT=""
if [[ "$wp_count" -ge 1 ]]; then
SQL_CONTENT+="CREATE DATABASE IF NOT EXISTS wp1_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n"
SQL_CONTENT+="CREATE USER IF NOT EXISTS 'wp1_user'@'%' IDENTIFIED BY '${WP1_DB_PASS}';\n"
SQL_CONTENT+="GRANT ALL PRIVILEGES ON wp1_db.* TO 'wp1_user'@'%';\n"
fi
if [[ "$wp_count" -ge 2 ]]; then
SQL_CONTENT+="CREATE DATABASE IF NOT EXISTS wp2_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n"
SQL_CONTENT+="CREATE USER IF NOT EXISTS 'wp2_user'@'%' IDENTIFIED BY '${WP2_DB_PASS}';\n"
SQL_CONTENT+="GRANT ALL PRIVILEGES ON wp2_db.* TO 'wp2_user'@'%';\n"
fi
SQL_CONTENT+="FLUSH PRIVILEGES;\n"
printf "%b" "$SQL_CONTENT" > db-init/01-init.sql
success "db-init/01-init.sql created"
fi
# -- docker-compose.yml -------------------------------------------------------
cat > docker-compose.yml <<DCEOF
services:
DCEOF
# -- Cloudflare Tunnel --------------------------------------------------------
if [[ "$install_cf" == "y" ]]; then
cat >> docker-compose.yml <<DCEOF
# -- Cloudflare Tunnel -------------------------------------------------------
cloudflared:
image: cloudflare/cloudflared:latest
restart: always
command: $CLOUDFLARED_CMD
networks:
- internal
DCEOF
if [[ -n "$CF_ENV_LINE" ]]; then
cat >> docker-compose.yml <<DCEOF
environment:
$CF_ENV_LINE
DCEOF
fi
fi
# -- MariaDB (only when WP is needed) -----------------------------------------
if [[ "$need_db" == "y" ]]; then
cat >> docker-compose.yml <<DCEOF
# -- Database ----------------------------------------------------------------
db:
image: mariadb:10.6
restart: always
environment:
MYSQL_ROOT_PASSWORD: \${DB_ROOT_PASSWORD}
volumes:
- db_data:/var/lib/mysql
- ./db-init:/docker-entrypoint-initdb.d:ro
networks:
- internal
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 5
DCEOF
fi
# -- Uptime Kuma --------------------------------------------------------------
if [[ "$install_kuma" == "y" ]]; then
cat >> docker-compose.yml <<DCEOF
# -- Uptime Kuma -------------------------------------------------------------
uptime-kuma:
image: louislam/uptime-kuma:latest
container_name: uptime-kuma
restart: always
volumes:
- kuma_data:/app/data
networks:
- internal
DCEOF
fi
# -- WordPress 1 --------------------------------------------------------------
if [[ "$wp_count" -ge 1 ]]; then
cat >> docker-compose.yml <<DCEOF
# -- WordPress 1 -------------------------------------------------------------
wp1:
image: wordpress:latest
restart: always
depends_on:
db:
condition: service_healthy
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wp1_user
WORDPRESS_DB_PASSWORD: \${WP1_DB_PASSWORD}
WORDPRESS_DB_NAME: wp1_db
volumes:
- wp1_data:/var/www/html
networks:
- internal
DCEOF
fi
# -- WordPress 2 --------------------------------------------------------------
if [[ "$wp_count" -ge 2 ]]; then
cat >> docker-compose.yml <<DCEOF
# -- WordPress 2 -------------------------------------------------------------
wp2:
image: wordpress:latest
restart: always
depends_on:
db:
condition: service_healthy
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wp2_user
WORDPRESS_DB_PASSWORD: \${WP2_DB_PASSWORD}
WORDPRESS_DB_NAME: wp2_db
volumes:
- wp2_data:/var/www/html
networks:
- internal
DCEOF
fi
# -- Networks & Volumes -------------------------------------------------------
cat >> docker-compose.yml <<DCEOF
networks:
internal:
driver: bridge
volumes:
DCEOF
# Only add volumes that are actually used
[[ "$need_db" == "y" ]] && echo " db_data:" >> docker-compose.yml
[[ "$install_kuma" == "y" ]] && echo " kuma_data:" >> docker-compose.yml
[[ "$wp_count" -ge 1 ]] && echo " wp1_data:" >> docker-compose.yml
[[ "$wp_count" -ge 2 ]] && echo " wp2_data:" >> docker-compose.yml
success "docker-compose.yml created"
# =============================================================================
# Summary
# =============================================================================
echo ""
echo -e "${BOLD}================================================${RESET}"
echo -e "${BOLD} Summary / Rezultat ${RESET}"
echo -e "${BOLD}================================================${RESET}"
if [[ "$install_cf" == "y" ]]; then
CF_LABEL="Yes ($([ "$cf_method" == "1" ] && echo "Token" || echo "Login"))"
else
CF_LABEL="No"
fi
echo -e " Cloudflare Tunnel : ${CYAN}$CF_LABEL${RESET}"
echo -e " Uptime Kuma : ${CYAN}$([ "$install_kuma" == "y" ] && echo "Yes" || echo "No")${RESET}"
echo -e " WordPress sites : ${CYAN}$wp_count${RESET}"
echo -e " MariaDB : ${CYAN}$([ "$need_db" == "y" ] && echo "Yes" || echo "No")${RESET}"
echo ""
echo -e "${BOLD} Files created:${RESET}"
echo " .env (chmod 600)"
echo " docker-compose.yml"
[[ "$need_db" == "y" ]] && echo " db-init/01-init.sql"
echo ""
echo -e "${BOLD} Next step:${RESET}"
echo -e " ${GREEN}docker compose up -d${RESET}"
echo ""
warn "Keep .env in a safe place - it contains your passwords!"
echo -e "${BOLD}================================================${RESET}\n"
| 1 | #!/bin/bash |
| 2 | # ============================================================================= |
| 3 | # Modular Hosting Setup with optional Cloudflare Tunnel |
| 4 | # Author Fedya Serafiev |
| 5 | # Site itpraktika.com |
| 6 | # ============================================================================= |
| 7 | |
| 8 | set -euo pipefail |
| 9 | |
| 10 | # -- Colors ------------------------------------------------------------------- |
| 11 | RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m' |
| 12 | CYAN='\033[0;36m'; BOLD='\033[1m'; RESET='\033[0m' |
| 13 | |
| 14 | info() { echo -e "${CYAN}[INFO] $*${RESET}"; } |
| 15 | success() { echo -e "${GREEN}[OK] $*${RESET}"; } |
| 16 | warn() { echo -e "${YELLOW}[WARN] $*${RESET}"; } |
| 17 | error() { echo -e "${RED}[ERROR] $*${RESET}" >&2; exit 1; } |
| 18 | |
| 19 | # -- Password generator ------------------------------------------------------- |
| 20 | gen_pass() { |
| 21 | openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c 24 |
| 22 | } |
| 23 | |
| 24 | # -- Input validation --------------------------------------------------------- |
| 25 | validate_yn() { |
| 26 | [[ "$1" =~ ^[yYnN]$ ]] || error "Vuvedete 'y' ili 'n'." |
| 27 | } |
| 28 | validate_count() { |
| 29 | [[ "$1" =~ ^[0-2]$ ]] || error "Vuvedete 0, 1 ili 2." |
| 30 | } |
| 31 | |
| 32 | # ============================================================================= |
| 33 | echo -e "\n${BOLD}================================================${RESET}" |
| 34 | echo -e "${BOLD} Modular Hosting Setup - Izberete moduli ${RESET}" |
| 35 | echo -e "${BOLD}================================================${RESET}\n" |
| 36 | |
| 37 | # ============================================================================= |
| 38 | # [1/4] Module selection |
| 39 | # ============================================================================= |
| 40 | echo -e "${BOLD}[1/4] Izberete koi moduli da se instalират:${RESET}\n" |
| 41 | |
| 42 | read -rp " Instaliraj Cloudflare Tunnel? (y/n): " install_cf |
| 43 | validate_yn "$install_cf"; install_cf="${install_cf,,}" |
| 44 | |
| 45 | read -rp " Instaliraj Uptime Kuma? (y/n): " install_kuma |
| 46 | validate_yn "$install_kuma"; install_kuma="${install_kuma,,}" |
| 47 | |
| 48 | read -rp " Broy WordPress sajtove? (0/1/2): " wp_count |
| 49 | validate_count "$wp_count" |
| 50 | |
| 51 | # At least one module must be selected |
| 52 | if [[ "$install_cf" == "n" && "$install_kuma" == "n" && "$wp_count" == "0" ]]; then |
| 53 | error "Tryabva da izberete poне edin modul." |
| 54 | fi |
| 55 | |
| 56 | # DB is needed only when WordPress is requested |
| 57 | need_db="n" |
| 58 | [[ "$wp_count" -ge 1 ]] && need_db="y" |
| 59 | |
| 60 | # ============================================================================= |
| 61 | # [2/4] Cloudflare Tunnel config (only if selected) |
| 62 | # ============================================================================= |
| 63 | CLOUDFLARED_CMD="" |
| 64 | CF_ENV_LINE="" |
| 65 | CF_TOKEN_IN_ENV="# Cloudflare Tunnel not installed" |
| 66 | cf_method="" |
| 67 | |
| 68 | if [[ "$install_cf" == "y" ]]; then |
| 69 | echo -e "\n${BOLD}[2/4] Cloudflare Tunnel - metod na svarzavane${RESET}" |
| 70 | echo " 1) Token - vuvedash gotov token ot Cloudflare Dashboard" |
| 71 | echo " 2) Login - cloudflared se logva sam (URL / brauzar)" |
| 72 | echo "" |
| 73 | read -rp " Izberi metod [1/2]: " cf_method |
| 74 | |
| 75 | case "$cf_method" in |
| 76 | 1) |
| 77 | read -rp " Vuvedete Tunnel Token: " cf_token |
| 78 | [[ -n "$cf_token" ]] || error "Tokenat ne mozhe da e prazen." |
| 79 | CLOUDFLARED_CMD='tunnel --no-autoupdate run --token ${TUNNEL_TOKEN}' |
| 80 | CF_ENV_LINE=" - TUNNEL_TOKEN=\${TUNNEL_TOKEN}" |
| 81 | CF_TOKEN_IN_ENV="TUNNEL_TOKEN=$cf_token" |
| 82 | ;; |
| 83 | 2) |
| 84 | info "cloudflared shte izvede URL za avtentikaciya pri start." |
| 85 | CLOUDFLARED_CMD='tunnel --no-autoupdate login' |
| 86 | CF_ENV_LINE="" |
| 87 | CF_TOKEN_IN_ENV="# TUNNEL_TOKEN= (login method - not needed)" |
| 88 | cf_token="" |
| 89 | ;; |
| 90 | *) |
| 91 | error "Nevaliден izbor. Vuvedete 1 ili 2." |
| 92 | ;; |
| 93 | esac |
| 94 | else |
| 95 | info "Cloudflare Tunnel - skipped." |
| 96 | fi |
| 97 | |
| 98 | # ============================================================================= |
| 99 | # [3/4] Generate passwords |
| 100 | # ============================================================================= |
| 101 | echo -e "\n${BOLD}[3/4] Generirane na paroli...${RESET}" |
| 102 | DB_ROOT_PASS=$(gen_pass) |
| 103 | WP1_DB_PASS=$(gen_pass) |
| 104 | WP2_DB_PASS=$(gen_pass) |
| 105 | |
| 106 | # ============================================================================= |
| 107 | # [4/4] Generate files |
| 108 | # ============================================================================= |
| 109 | echo -e "\n${BOLD}[4/4] Generirane na konfiguracionnite fajlove...${RESET}" |
| 110 | |
| 111 | # -- .env --------------------------------------------------------------------- |
| 112 | cat > .env <<ENVEOF |
| 113 | # -- Cloudflare --------------------------------------------------------------- |
| 114 | $CF_TOKEN_IN_ENV |
| 115 | |
| 116 | # -- Database ----------------------------------------------------------------- |
| 117 | DB_ROOT_PASSWORD=$DB_ROOT_PASS |
| 118 | WP1_DB_PASSWORD=$WP1_DB_PASS |
| 119 | WP2_DB_PASSWORD=$WP2_DB_PASS |
| 120 | ENVEOF |
| 121 | chmod 600 .env |
| 122 | success ".env created (chmod 600)" |
| 123 | |
| 124 | # -- DB init SQL (only when WP is needed) ------------------------------------- |
| 125 | if [[ "$need_db" == "y" ]]; then |
| 126 | mkdir -p db-init |
| 127 | SQL_CONTENT="" |
| 128 | if [[ "$wp_count" -ge 1 ]]; then |
| 129 | SQL_CONTENT+="CREATE DATABASE IF NOT EXISTS wp1_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n" |
| 130 | SQL_CONTENT+="CREATE USER IF NOT EXISTS 'wp1_user'@'%' IDENTIFIED BY '${WP1_DB_PASS}';\n" |
| 131 | SQL_CONTENT+="GRANT ALL PRIVILEGES ON wp1_db.* TO 'wp1_user'@'%';\n" |
| 132 | fi |
| 133 | if [[ "$wp_count" -ge 2 ]]; then |
| 134 | SQL_CONTENT+="CREATE DATABASE IF NOT EXISTS wp2_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n" |
| 135 | SQL_CONTENT+="CREATE USER IF NOT EXISTS 'wp2_user'@'%' IDENTIFIED BY '${WP2_DB_PASS}';\n" |
| 136 | SQL_CONTENT+="GRANT ALL PRIVILEGES ON wp2_db.* TO 'wp2_user'@'%';\n" |
| 137 | fi |
| 138 | SQL_CONTENT+="FLUSH PRIVILEGES;\n" |
| 139 | printf "%b" "$SQL_CONTENT" > db-init/01-init.sql |
| 140 | success "db-init/01-init.sql created" |
| 141 | fi |
| 142 | |
| 143 | # -- docker-compose.yml ------------------------------------------------------- |
| 144 | cat > docker-compose.yml <<DCEOF |
| 145 | services: |
| 146 | DCEOF |
| 147 | |
| 148 | # -- Cloudflare Tunnel -------------------------------------------------------- |
| 149 | if [[ "$install_cf" == "y" ]]; then |
| 150 | cat >> docker-compose.yml <<DCEOF |
| 151 | |
| 152 | # -- Cloudflare Tunnel ------------------------------------------------------- |
| 153 | cloudflared: |
| 154 | image: cloudflare/cloudflared:latest |
| 155 | restart: always |
| 156 | command: $CLOUDFLARED_CMD |
| 157 | networks: |
| 158 | - internal |
| 159 | DCEOF |
| 160 | if [[ -n "$CF_ENV_LINE" ]]; then |
| 161 | cat >> docker-compose.yml <<DCEOF |
| 162 | environment: |
| 163 | $CF_ENV_LINE |
| 164 | DCEOF |
| 165 | fi |
| 166 | fi |
| 167 | |
| 168 | # -- MariaDB (only when WP is needed) ----------------------------------------- |
| 169 | if [[ "$need_db" == "y" ]]; then |
| 170 | cat >> docker-compose.yml <<DCEOF |
| 171 | |
| 172 | # -- Database ---------------------------------------------------------------- |
| 173 | db: |
| 174 | image: mariadb:10.6 |
| 175 | restart: always |
| 176 | environment: |
| 177 | MYSQL_ROOT_PASSWORD: \${DB_ROOT_PASSWORD} |
| 178 | volumes: |
| 179 | - db_data:/var/lib/mysql |
| 180 | - ./db-init:/docker-entrypoint-initdb.d:ro |
| 181 | networks: |
| 182 | - internal |
| 183 | healthcheck: |
| 184 | test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] |
| 185 | interval: 10s |
| 186 | timeout: 5s |
| 187 | retries: 5 |
| 188 | DCEOF |
| 189 | fi |
| 190 | |
| 191 | # -- Uptime Kuma -------------------------------------------------------------- |
| 192 | if [[ "$install_kuma" == "y" ]]; then |
| 193 | cat >> docker-compose.yml <<DCEOF |
| 194 | |
| 195 | # -- Uptime Kuma ------------------------------------------------------------- |
| 196 | uptime-kuma: |
| 197 | image: louislam/uptime-kuma:latest |
| 198 | container_name: uptime-kuma |
| 199 | restart: always |
| 200 | volumes: |
| 201 | - kuma_data:/app/data |
| 202 | networks: |
| 203 | - internal |
| 204 | DCEOF |
| 205 | fi |
| 206 | |
| 207 | # -- WordPress 1 -------------------------------------------------------------- |
| 208 | if [[ "$wp_count" -ge 1 ]]; then |
| 209 | cat >> docker-compose.yml <<DCEOF |
| 210 | |
| 211 | # -- WordPress 1 ------------------------------------------------------------- |
| 212 | wp1: |
| 213 | image: wordpress:latest |
| 214 | restart: always |
| 215 | depends_on: |
| 216 | db: |
| 217 | condition: service_healthy |
| 218 | environment: |
| 219 | WORDPRESS_DB_HOST: db |
| 220 | WORDPRESS_DB_USER: wp1_user |
| 221 | WORDPRESS_DB_PASSWORD: \${WP1_DB_PASSWORD} |
| 222 | WORDPRESS_DB_NAME: wp1_db |
| 223 | volumes: |
| 224 | - wp1_data:/var/www/html |
| 225 | networks: |
| 226 | - internal |
| 227 | DCEOF |
| 228 | fi |
| 229 | |
| 230 | # -- WordPress 2 -------------------------------------------------------------- |
| 231 | if [[ "$wp_count" -ge 2 ]]; then |
| 232 | cat >> docker-compose.yml <<DCEOF |
| 233 | |
| 234 | # -- WordPress 2 ------------------------------------------------------------- |
| 235 | wp2: |
| 236 | image: wordpress:latest |
| 237 | restart: always |
| 238 | depends_on: |
| 239 | db: |
| 240 | condition: service_healthy |
| 241 | environment: |
| 242 | WORDPRESS_DB_HOST: db |
| 243 | WORDPRESS_DB_USER: wp2_user |
| 244 | WORDPRESS_DB_PASSWORD: \${WP2_DB_PASSWORD} |
| 245 | WORDPRESS_DB_NAME: wp2_db |
| 246 | volumes: |
| 247 | - wp2_data:/var/www/html |
| 248 | networks: |
| 249 | - internal |
| 250 | DCEOF |
| 251 | fi |
| 252 | |
| 253 | # -- Networks & Volumes ------------------------------------------------------- |
| 254 | cat >> docker-compose.yml <<DCEOF |
| 255 | |
| 256 | networks: |
| 257 | internal: |
| 258 | driver: bridge |
| 259 | |
| 260 | volumes: |
| 261 | DCEOF |
| 262 | |
| 263 | # Only add volumes that are actually used |
| 264 | [[ "$need_db" == "y" ]] && echo " db_data:" >> docker-compose.yml |
| 265 | [[ "$install_kuma" == "y" ]] && echo " kuma_data:" >> docker-compose.yml |
| 266 | [[ "$wp_count" -ge 1 ]] && echo " wp1_data:" >> docker-compose.yml |
| 267 | [[ "$wp_count" -ge 2 ]] && echo " wp2_data:" >> docker-compose.yml |
| 268 | |
| 269 | success "docker-compose.yml created" |
| 270 | |
| 271 | # ============================================================================= |
| 272 | # Summary |
| 273 | # ============================================================================= |
| 274 | echo "" |
| 275 | echo -e "${BOLD}================================================${RESET}" |
| 276 | echo -e "${BOLD} Summary / Rezultat ${RESET}" |
| 277 | echo -e "${BOLD}================================================${RESET}" |
| 278 | |
| 279 | if [[ "$install_cf" == "y" ]]; then |
| 280 | CF_LABEL="Yes ($([ "$cf_method" == "1" ] && echo "Token" || echo "Login"))" |
| 281 | else |
| 282 | CF_LABEL="No" |
| 283 | fi |
| 284 | |
| 285 | echo -e " Cloudflare Tunnel : ${CYAN}$CF_LABEL${RESET}" |
| 286 | echo -e " Uptime Kuma : ${CYAN}$([ "$install_kuma" == "y" ] && echo "Yes" || echo "No")${RESET}" |
| 287 | echo -e " WordPress sites : ${CYAN}$wp_count${RESET}" |
| 288 | echo -e " MariaDB : ${CYAN}$([ "$need_db" == "y" ] && echo "Yes" || echo "No")${RESET}" |
| 289 | echo "" |
| 290 | echo -e "${BOLD} Files created:${RESET}" |
| 291 | echo " .env (chmod 600)" |
| 292 | echo " docker-compose.yml" |
| 293 | [[ "$need_db" == "y" ]] && echo " db-init/01-init.sql" |
| 294 | echo "" |
| 295 | echo -e "${BOLD} Next step:${RESET}" |
| 296 | echo -e " ${GREEN}docker compose up -d${RESET}" |
| 297 | echo "" |
| 298 | warn "Keep .env in a safe place - it contains your passwords!" |
| 299 | echo -e "${BOLD}================================================${RESET}\n" |