setup_hosting.sh
ยท 12 KiB ยท Bash
Raw
#!/bin/bash
# =============================================================================
# ะะฐัััะพะนะบะฐ ะฝะฐ ะฅะพััะธะฝะณ ัััะฒัั ั Cloudflare Tunnel
# ะะฒัะพั: ะคะตะดั ะกะตัะฐัะธะตะฒ | itpraktika.com
# =============================================================================
set -euo pipefail
# โโ ะฆะฒะตัะพะฒะต โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
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}โน๏ธ $*${RESET}"; }
success() { echo -e "${GREEN}โ
$*${RESET}"; }
warn() { echo -e "${YELLOW}โ ๏ธ $*${RESET}"; }
error() { echo -e "${RED}โ $*${RESET}" >&2; exit 1; }
# โโ ะะตะฝะตัะธัะฐะฝะต ะฝะฐ ะฟะฐัะพะปะฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
gen_pass() {
openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c 24
}
# โโ ะะฐะปะธะดะฐัะธั โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
validate_yn() {
local val="$1"
[[ "$val" =~ ^[yYnN]$ ]] || error "ะัะฒะตะดะธ 'y' ะธะปะธ 'n'."
}
validate_count() {
local val="$1"
[[ "$val" =~ ^[0-2]$ ]] || error "ะัะฒะตะดะธ 0, 1 ะธะปะธ 2."
}
# =============================================================================
echo -e "\n${BOLD}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${RESET}"
echo -e "${BOLD} ๐ ะะฐัััะพะนะบะฐ ะฝะฐ ะฅะพััะธะฝะณ ั Cloudflare Tunnel ${RESET}"
echo -e "${BOLD}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${RESET}\n"
# โโ 1. ะะทะฑะพั ะฝะฐ ะผะตัะพะด ะทะฐ Cloudflare Tunnel โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
echo -e "${BOLD}[1/4] Cloudflare Tunnel โ ะผะตัะพะด ะฝะฐ ัะฒััะทะฒะฐะฝะต${RESET}"
echo " 1) Token โ ะฒัะฒะตะถะดะฐั ะณะพัะพะฒ ัะพะบะตะฝ ะพั Cloudflare Dashboard"
echo " 2) Login โ cloudflared ัะต ะปะพะณะฒะฐ ัะฐะผ (ัะต ะพัะฒะพัะธ ะฑัะฐัะทัั / URL)"
echo ""
read -rp "ะะทะฑะตัะธ ะผะตัะพะด [1/2]: " cf_method
case "$cf_method" in
1)
read -rp " ะัะฒะตะดะธ Tunnel Token: " cf_token
[[ -n "$cf_token" ]] || error "ะขะพะบะตะฝัั ะฝะต ะผะพะถะต ะดะฐ ะต ะฟัะฐะทะตะฝ."
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 ัะต ะธะทะฒะตะดะต URL ะทะฐ ะฐะฒัะตะฝัะธะบะฐัะธั."
CLOUDFLARED_CMD='tunnel --no-autoupdate login'
CF_ENV_LINE=""
CF_TOKEN_IN_ENV="# TUNNEL_TOKEN= (ะธะทะฟะพะปะทะฒะฐ ัะต login ะผะตัะพะด)"
cf_token=""
;;
*)
error "ะะตะฒะฐะปะธะดะตะฝ ะธะทะฑะพั. ะัะฒะตะดะธ 1 ะธะปะธ 2."
;;
esac
# โโ 2. Uptime Kuma โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
echo -e "\n${BOLD}[2/4] Uptime Kuma${RESET}"
read -rp "ะะฝััะฐะปะธัะฐะน Uptime Kuma? (y/n): " install_kuma
validate_yn "$install_kuma"
install_kuma="${install_kuma,,}" # lowercase
# โโ 3. WordPress ัะฐะนัะพะฒะต โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
echo -e "\n${BOLD}[3/4] WordPress ัะฐะนัะพะฒะต${RESET}"
read -rp "ะัะพะน WordPress ัะฐะนัะพะฒะต? (0/1/2): " wp_count
validate_count "$wp_count"
# โโ 4. ะะตะฝะตัะธัะฐะฝะต ะฝะฐ ะฟะฐัะพะปะธ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
echo -e "\n${BOLD}[4/4] ะะตะฝะตัะธัะฐะฝะต ะฝะฐ ะฟะฐัะพะปะธ...${RESET}"
DB_ROOT_PASS=$(gen_pass)
WP1_DB_PASS=$(gen_pass)
WP2_DB_PASS=$(gen_pass)
# =============================================================================
# .env ัะฐะนะป
# =============================================================================
cat > .env <<EOF
# โโ Cloudflare โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
$CF_TOKEN_IN_ENV
# โโ ะะฐะทะฐ ะดะฐะฝะฝะธ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
DB_ROOT_PASSWORD=$DB_ROOT_PASS
WP1_DB_PASSWORD=$WP1_DB_PASS
WP2_DB_PASSWORD=$WP2_DB_PASS
EOF
chmod 600 .env
success ".env ััะทะดะฐะดะตะฝ (ะฟัะฐะฒะฐ: 600)"
# =============================================================================
# ะะตะฝะตัะธัะฐะฝะต ะฝะฐ init SQL ะทะฐ ะฑะฐะทะธัะต ะดะฐะฝะฝะธ
# =============================================================================
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 ััะทะดะฐะดะตะฝ"
# =============================================================================
# docker-compose.yml
# =============================================================================
cat > docker-compose.yml <<EOF
services:
# โโ Cloudflare Tunnel โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
cloudflared:
image: cloudflare/cloudflared:latest
restart: always
command: $CLOUDFLARED_CMD
networks:
- internal
EOF
# ะะพะฑะฐะฒัะฝะต ะฝะฐ environment ัะฐะผะพ ะฟัะธ token ะผะตัะพะด
if [[ -n "$CF_ENV_LINE" ]]; then
cat >> docker-compose.yml <<EOF
environment:
$CF_ENV_LINE
EOF
fi
# โโ MariaDB โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
cat >> docker-compose.yml <<EOF
# โโ ะะฐะทะฐ ะดะฐะฝะฝะธ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
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
EOF
# โโ Uptime Kuma โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
if [[ "$install_kuma" == "y" ]]; then
cat >> docker-compose.yml <<EOF
# โโ Uptime Kuma โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
uptime-kuma:
image: louislam/uptime-kuma:latest
container_name: uptime-kuma
restart: always
volumes:
- kuma_data:/app/data
networks:
- internal
EOF
fi
# โโ WordPress 1 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
if [[ "$wp_count" -ge 1 ]]; then
cat >> docker-compose.yml <<EOF
# โโ 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
EOF
fi
# โโ WordPress 2 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
if [[ "$wp_count" -ge 2 ]]; then
cat >> docker-compose.yml <<EOF
# โโ 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
EOF
fi
# โโ Networks & Volumes โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
cat >> docker-compose.yml <<EOF
networks:
internal:
driver: bridge
volumes:
db_data:
EOF
[[ "$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 ััะทะดะฐะดะตะฝ"
# =============================================================================
# ะ ะตะทัะผะต
# =============================================================================
echo ""
echo -e "${BOLD}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${RESET}"
echo -e "${BOLD} ๐ ะ ะตะทัะผะต ะฝะฐ ะบะพะฝัะธะณััะฐัะธััะฐ ${RESET}"
echo -e "${BOLD}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${RESET}"
echo -e " Cloudflare ะผะตัะพะด : ${CYAN}$([ "$cf_method" == "1" ] && echo "Token" || echo "Login")${RESET}"
echo -e " Uptime Kuma : ${CYAN}$([ "$install_kuma" == "y" ] && echo "ะะฐ" || echo "ะะต")${RESET}"
echo -e " WordPress ัะฐะนัะพะฒะต: ${CYAN}$wp_count${RESET}"
echo ""
echo -e "${BOLD} ะคะฐะนะปะพะฒะต:${RESET}"
echo " ๐ .env (chmod 600)"
echo " ๐ docker-compose.yml"
echo " ๐ db-init/01-init.sql"
echo ""
echo -e "${BOLD} ะกะปะตะดะฒะฐัะฐ ัััะฟะบะฐ:${RESET}"
echo -e " ${GREEN}docker compose up -d${RESET}"
echo ""
warn "ะะฐะฟะฐะทะธ .env ัะฐะนะปะฐ ะฝะฐ ัะธะณััะฝะพ ะผัััะพ โ ััะดััะถะฐ ะฟะฐัะพะปะธัะต!"
echo -e "${BOLD}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${RESET}\n"
| 1 | #!/bin/bash |
| 2 | # ============================================================================= |
| 3 | # ะะฐัััะพะนะบะฐ ะฝะฐ ะฅะพััะธะฝะณ ัััะฒัั ั Cloudflare Tunnel |
| 4 | # ะะฒัะพั: ะคะตะดั ะกะตัะฐัะธะตะฒ | itpraktika.com |
| 5 | # ============================================================================= |
| 6 | |
| 7 | set -euo pipefail |
| 8 | |
| 9 | # โโ ะฆะฒะตัะพะฒะต โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 10 | RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m' |
| 11 | CYAN='\033[0;36m'; BOLD='\033[1m'; RESET='\033[0m' |
| 12 | |
| 13 | info() { echo -e "${CYAN}โน๏ธ $*${RESET}"; } |
| 14 | success() { echo -e "${GREEN}โ $*${RESET}"; } |
| 15 | warn() { echo -e "${YELLOW}โ ๏ธ $*${RESET}"; } |
| 16 | error() { echo -e "${RED}โ $*${RESET}" >&2; exit 1; } |
| 17 | |
| 18 | # โโ ะะตะฝะตัะธัะฐะฝะต ะฝะฐ ะฟะฐัะพะปะฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 19 | gen_pass() { |
| 20 | openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c 24 |
| 21 | } |
| 22 | |
| 23 | # โโ ะะฐะปะธะดะฐัะธั โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 24 | validate_yn() { |
| 25 | local val="$1" |
| 26 | [[ "$val" =~ ^[yYnN]$ ]] || error "ะัะฒะตะดะธ 'y' ะธะปะธ 'n'." |
| 27 | } |
| 28 | |
| 29 | validate_count() { |
| 30 | local val="$1" |
| 31 | [[ "$val" =~ ^[0-2]$ ]] || error "ะัะฒะตะดะธ 0, 1 ะธะปะธ 2." |
| 32 | } |
| 33 | |
| 34 | # ============================================================================= |
| 35 | echo -e "\n${BOLD}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${RESET}" |
| 36 | echo -e "${BOLD} ๐ ะะฐัััะพะนะบะฐ ะฝะฐ ะฅะพััะธะฝะณ ั Cloudflare Tunnel ${RESET}" |
| 37 | echo -e "${BOLD}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${RESET}\n" |
| 38 | |
| 39 | # โโ 1. ะะทะฑะพั ะฝะฐ ะผะตัะพะด ะทะฐ Cloudflare Tunnel โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 40 | echo -e "${BOLD}[1/4] Cloudflare Tunnel โ ะผะตัะพะด ะฝะฐ ัะฒััะทะฒะฐะฝะต${RESET}" |
| 41 | echo " 1) Token โ ะฒัะฒะตะถะดะฐั ะณะพัะพะฒ ัะพะบะตะฝ ะพั Cloudflare Dashboard" |
| 42 | echo " 2) Login โ cloudflared ัะต ะปะพะณะฒะฐ ัะฐะผ (ัะต ะพัะฒะพัะธ ะฑัะฐัะทัั / URL)" |
| 43 | echo "" |
| 44 | read -rp "ะะทะฑะตัะธ ะผะตัะพะด [1/2]: " cf_method |
| 45 | |
| 46 | case "$cf_method" in |
| 47 | 1) |
| 48 | read -rp " ะัะฒะตะดะธ Tunnel Token: " cf_token |
| 49 | [[ -n "$cf_token" ]] || error "ะขะพะบะตะฝัั ะฝะต ะผะพะถะต ะดะฐ ะต ะฟัะฐะทะตะฝ." |
| 50 | CLOUDFLARED_CMD='tunnel --no-autoupdate run --token ${TUNNEL_TOKEN}' |
| 51 | CF_ENV_LINE=" - TUNNEL_TOKEN=\${TUNNEL_TOKEN}" |
| 52 | CF_TOKEN_IN_ENV="TUNNEL_TOKEN=$cf_token" |
| 53 | ;; |
| 54 | 2) |
| 55 | info "ะัะธ ััะฐััะธัะฐะฝะต cloudflared ัะต ะธะทะฒะตะดะต URL ะทะฐ ะฐะฒัะตะฝัะธะบะฐัะธั." |
| 56 | CLOUDFLARED_CMD='tunnel --no-autoupdate login' |
| 57 | CF_ENV_LINE="" |
| 58 | CF_TOKEN_IN_ENV="# TUNNEL_TOKEN= (ะธะทะฟะพะปะทะฒะฐ ัะต login ะผะตัะพะด)" |
| 59 | cf_token="" |
| 60 | ;; |
| 61 | *) |
| 62 | error "ะะตะฒะฐะปะธะดะตะฝ ะธะทะฑะพั. ะัะฒะตะดะธ 1 ะธะปะธ 2." |
| 63 | ;; |
| 64 | esac |
| 65 | |
| 66 | # โโ 2. Uptime Kuma โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 67 | echo -e "\n${BOLD}[2/4] Uptime Kuma${RESET}" |
| 68 | read -rp "ะะฝััะฐะปะธัะฐะน Uptime Kuma? (y/n): " install_kuma |
| 69 | validate_yn "$install_kuma" |
| 70 | install_kuma="${install_kuma,,}" # lowercase |
| 71 | |
| 72 | # โโ 3. WordPress ัะฐะนัะพะฒะต โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 73 | echo -e "\n${BOLD}[3/4] WordPress ัะฐะนัะพะฒะต${RESET}" |
| 74 | read -rp "ะัะพะน WordPress ัะฐะนัะพะฒะต? (0/1/2): " wp_count |
| 75 | validate_count "$wp_count" |
| 76 | |
| 77 | # โโ 4. ะะตะฝะตัะธัะฐะฝะต ะฝะฐ ะฟะฐัะพะปะธ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 78 | echo -e "\n${BOLD}[4/4] ะะตะฝะตัะธัะฐะฝะต ะฝะฐ ะฟะฐัะพะปะธ...${RESET}" |
| 79 | DB_ROOT_PASS=$(gen_pass) |
| 80 | WP1_DB_PASS=$(gen_pass) |
| 81 | WP2_DB_PASS=$(gen_pass) |
| 82 | |
| 83 | # ============================================================================= |
| 84 | # .env ัะฐะนะป |
| 85 | # ============================================================================= |
| 86 | cat > .env <<EOF |
| 87 | # โโ Cloudflare โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 88 | $CF_TOKEN_IN_ENV |
| 89 | |
| 90 | # โโ ะะฐะทะฐ ะดะฐะฝะฝะธ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 91 | DB_ROOT_PASSWORD=$DB_ROOT_PASS |
| 92 | WP1_DB_PASSWORD=$WP1_DB_PASS |
| 93 | WP2_DB_PASSWORD=$WP2_DB_PASS |
| 94 | EOF |
| 95 | chmod 600 .env |
| 96 | success ".env ััะทะดะฐะดะตะฝ (ะฟัะฐะฒะฐ: 600)" |
| 97 | |
| 98 | # ============================================================================= |
| 99 | # ะะตะฝะตัะธัะฐะฝะต ะฝะฐ init SQL ะทะฐ ะฑะฐะทะธัะต ะดะฐะฝะฝะธ |
| 100 | # ============================================================================= |
| 101 | mkdir -p db-init |
| 102 | |
| 103 | SQL_CONTENT="" |
| 104 | if [[ "$wp_count" -ge 1 ]]; then |
| 105 | SQL_CONTENT+="CREATE DATABASE IF NOT EXISTS wp1_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n" |
| 106 | SQL_CONTENT+="CREATE USER IF NOT EXISTS 'wp1_user'@'%' IDENTIFIED BY '${WP1_DB_PASS}';\n" |
| 107 | SQL_CONTENT+="GRANT ALL PRIVILEGES ON wp1_db.* TO 'wp1_user'@'%';\n" |
| 108 | fi |
| 109 | if [[ "$wp_count" -ge 2 ]]; then |
| 110 | SQL_CONTENT+="CREATE DATABASE IF NOT EXISTS wp2_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n" |
| 111 | SQL_CONTENT+="CREATE USER IF NOT EXISTS 'wp2_user'@'%' IDENTIFIED BY '${WP2_DB_PASS}';\n" |
| 112 | SQL_CONTENT+="GRANT ALL PRIVILEGES ON wp2_db.* TO 'wp2_user'@'%';\n" |
| 113 | fi |
| 114 | SQL_CONTENT+="FLUSH PRIVILEGES;\n" |
| 115 | |
| 116 | printf "%b" "$SQL_CONTENT" > db-init/01-init.sql |
| 117 | success "db-init/01-init.sql ััะทะดะฐะดะตะฝ" |
| 118 | |
| 119 | # ============================================================================= |
| 120 | # docker-compose.yml |
| 121 | # ============================================================================= |
| 122 | cat > docker-compose.yml <<EOF |
| 123 | services: |
| 124 | |
| 125 | # โโ Cloudflare Tunnel โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 126 | cloudflared: |
| 127 | image: cloudflare/cloudflared:latest |
| 128 | restart: always |
| 129 | command: $CLOUDFLARED_CMD |
| 130 | networks: |
| 131 | - internal |
| 132 | EOF |
| 133 | |
| 134 | # ะะพะฑะฐะฒัะฝะต ะฝะฐ environment ัะฐะผะพ ะฟัะธ token ะผะตัะพะด |
| 135 | if [[ -n "$CF_ENV_LINE" ]]; then |
| 136 | cat >> docker-compose.yml <<EOF |
| 137 | environment: |
| 138 | $CF_ENV_LINE |
| 139 | EOF |
| 140 | fi |
| 141 | |
| 142 | # โโ MariaDB โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 143 | cat >> docker-compose.yml <<EOF |
| 144 | |
| 145 | # โโ ะะฐะทะฐ ะดะฐะฝะฝะธ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 146 | db: |
| 147 | image: mariadb:10.6 |
| 148 | restart: always |
| 149 | environment: |
| 150 | MYSQL_ROOT_PASSWORD: \${DB_ROOT_PASSWORD} |
| 151 | volumes: |
| 152 | - db_data:/var/lib/mysql |
| 153 | - ./db-init:/docker-entrypoint-initdb.d:ro |
| 154 | networks: |
| 155 | - internal |
| 156 | healthcheck: |
| 157 | test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] |
| 158 | interval: 10s |
| 159 | timeout: 5s |
| 160 | retries: 5 |
| 161 | EOF |
| 162 | |
| 163 | # โโ Uptime Kuma โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 164 | if [[ "$install_kuma" == "y" ]]; then |
| 165 | cat >> docker-compose.yml <<EOF |
| 166 | |
| 167 | # โโ Uptime Kuma โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 168 | uptime-kuma: |
| 169 | image: louislam/uptime-kuma:latest |
| 170 | container_name: uptime-kuma |
| 171 | restart: always |
| 172 | volumes: |
| 173 | - kuma_data:/app/data |
| 174 | networks: |
| 175 | - internal |
| 176 | EOF |
| 177 | fi |
| 178 | |
| 179 | # โโ WordPress 1 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 180 | if [[ "$wp_count" -ge 1 ]]; then |
| 181 | cat >> docker-compose.yml <<EOF |
| 182 | |
| 183 | # โโ WordPress 1 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 184 | wp1: |
| 185 | image: wordpress:latest |
| 186 | restart: always |
| 187 | depends_on: |
| 188 | db: |
| 189 | condition: service_healthy |
| 190 | environment: |
| 191 | WORDPRESS_DB_HOST: db |
| 192 | WORDPRESS_DB_USER: wp1_user |
| 193 | WORDPRESS_DB_PASSWORD: \${WP1_DB_PASSWORD} |
| 194 | WORDPRESS_DB_NAME: wp1_db |
| 195 | volumes: |
| 196 | - wp1_data:/var/www/html |
| 197 | networks: |
| 198 | - internal |
| 199 | EOF |
| 200 | fi |
| 201 | |
| 202 | # โโ WordPress 2 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 203 | if [[ "$wp_count" -ge 2 ]]; then |
| 204 | cat >> docker-compose.yml <<EOF |
| 205 | |
| 206 | # โโ WordPress 2 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 207 | wp2: |
| 208 | image: wordpress:latest |
| 209 | restart: always |
| 210 | depends_on: |
| 211 | db: |
| 212 | condition: service_healthy |
| 213 | environment: |
| 214 | WORDPRESS_DB_HOST: db |
| 215 | WORDPRESS_DB_USER: wp2_user |
| 216 | WORDPRESS_DB_PASSWORD: \${WP2_DB_PASSWORD} |
| 217 | WORDPRESS_DB_NAME: wp2_db |
| 218 | volumes: |
| 219 | - wp2_data:/var/www/html |
| 220 | networks: |
| 221 | - internal |
| 222 | EOF |
| 223 | fi |
| 224 | |
| 225 | # โโ Networks & Volumes โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ |
| 226 | cat >> docker-compose.yml <<EOF |
| 227 | |
| 228 | networks: |
| 229 | internal: |
| 230 | driver: bridge |
| 231 | |
| 232 | volumes: |
| 233 | db_data: |
| 234 | EOF |
| 235 | |
| 236 | [[ "$install_kuma" == "y" ]] && echo " kuma_data:" >> docker-compose.yml |
| 237 | [[ "$wp_count" -ge 1 ]] && echo " wp1_data:" >> docker-compose.yml |
| 238 | [[ "$wp_count" -ge 2 ]] && echo " wp2_data:" >> docker-compose.yml |
| 239 | |
| 240 | success "docker-compose.yml ััะทะดะฐะดะตะฝ" |
| 241 | |
| 242 | # ============================================================================= |
| 243 | # ะ ะตะทัะผะต |
| 244 | # ============================================================================= |
| 245 | echo "" |
| 246 | echo -e "${BOLD}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${RESET}" |
| 247 | echo -e "${BOLD} ๐ ะ ะตะทัะผะต ะฝะฐ ะบะพะฝัะธะณััะฐัะธััะฐ ${RESET}" |
| 248 | echo -e "${BOLD}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${RESET}" |
| 249 | echo -e " Cloudflare ะผะตัะพะด : ${CYAN}$([ "$cf_method" == "1" ] && echo "Token" || echo "Login")${RESET}" |
| 250 | echo -e " Uptime Kuma : ${CYAN}$([ "$install_kuma" == "y" ] && echo "ะะฐ" || echo "ะะต")${RESET}" |
| 251 | echo -e " WordPress ัะฐะนัะพะฒะต: ${CYAN}$wp_count${RESET}" |
| 252 | echo "" |
| 253 | echo -e "${BOLD} ะคะฐะนะปะพะฒะต:${RESET}" |
| 254 | echo " ๐ .env (chmod 600)" |
| 255 | echo " ๐ docker-compose.yml" |
| 256 | echo " ๐ db-init/01-init.sql" |
| 257 | echo "" |
| 258 | echo -e "${BOLD} ะกะปะตะดะฒะฐัะฐ ัััะฟะบะฐ:${RESET}" |
| 259 | echo -e " ${GREEN}docker compose up -d${RESET}" |
| 260 | echo "" |
| 261 | warn "ะะฐะฟะฐะทะธ .env ัะฐะนะปะฐ ะฝะฐ ัะธะณััะฝะพ ะผัััะพ โ ััะดััะถะฐ ะฟะฐัะพะปะธัะต!" |
| 262 | echo -e "${BOLD}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${RESET}\n" |
| 263 |