You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
3.2 KiB
107 lines
3.2 KiB
#!/usr/bin/env bash
|
|
# MySQL + Redis inside WSL (no Docker Desktop). Idempotent.
|
|
set -euo pipefail
|
|
|
|
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
MYSQL_PORT="${MYSQL_HOST_PORT:-3307}"
|
|
MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD:-changeme}"
|
|
MYSQL_DB="chajia"
|
|
ACTION="${1:-status}"
|
|
|
|
log() { echo "[wsl-infra] $*"; }
|
|
|
|
need_sudo() {
|
|
if ! sudo -n true 2>/dev/null; then
|
|
log "sudo required for first-time setup (install mysql/redis)"
|
|
fi
|
|
}
|
|
|
|
install_deps() {
|
|
need_sudo
|
|
if ! command -v mysql >/dev/null 2>&1; then
|
|
log "installing mysql-server..."
|
|
sudo DEBIAN_FRONTEND=noninteractive apt-get update -qq
|
|
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq mysql-server redis-server
|
|
elif ! command -v redis-cli >/dev/null 2>&1; then
|
|
log "installing redis-server..."
|
|
sudo DEBIAN_FRONTEND=noninteractive apt-get update -qq
|
|
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq redis-server
|
|
fi
|
|
}
|
|
|
|
configure_mysql() {
|
|
need_sudo
|
|
local cnf="/etc/mysql/mysql.conf.d/mysqld.cnf"
|
|
if [ -f "$cnf" ] && ! grep -q "chajia-dev-port" "$cnf" 2>/dev/null; then
|
|
sudo tee -a "$cnf" >/dev/null <<EOF
|
|
|
|
# chajia-dev-port
|
|
port = ${MYSQL_PORT}
|
|
bind-address = 0.0.0.0
|
|
EOF
|
|
fi
|
|
sudo service mysql restart || sudo systemctl restart mysql || true
|
|
}
|
|
|
|
configure_redis() {
|
|
need_sudo
|
|
local cnf="/etc/redis/redis.conf"
|
|
if [ -f "$cnf" ]; then
|
|
if grep -q '^bind ' "$cnf"; then
|
|
sudo sed -i 's/^bind .*/bind 0.0.0.0 ::1/' "$cnf"
|
|
else
|
|
echo "bind 0.0.0.0 ::1" | sudo tee -a "$cnf" >/dev/null
|
|
fi
|
|
if grep -q '^protected-mode ' "$cnf"; then
|
|
sudo sed -i 's/^protected-mode yes/protected-mode no/' "$cnf"
|
|
fi
|
|
fi
|
|
sudo service redis-server restart || sudo systemctl restart redis-server || true
|
|
}
|
|
|
|
init_db() {
|
|
need_sudo
|
|
sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '${MYSQL_ROOT_PASSWORD}'; CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED WITH mysql_native_password BY '${MYSQL_ROOT_PASSWORD}'; GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;" 2>/dev/null || true
|
|
mysql -h127.0.0.1 -P"${MYSQL_PORT}" -uroot -p"${MYSQL_ROOT_PASSWORD}" -e "CREATE DATABASE IF NOT EXISTS ${MYSQL_DB};" 2>/dev/null \
|
|
|| sudo mysql -h127.0.0.1 -P"${MYSQL_PORT}" -e "CREATE DATABASE IF NOT EXISTS ${MYSQL_DB};" 2>/dev/null \
|
|
|| true
|
|
}
|
|
|
|
wait_ports() {
|
|
local i
|
|
for i in $(seq 1 30); do
|
|
if (echo >/dev/tcp/127.0.0.1/"${MYSQL_PORT}") 2>/dev/null && redis-cli ping 2>/dev/null | grep -q PONG; then
|
|
return 0
|
|
fi
|
|
sleep 1
|
|
done
|
|
return 1
|
|
}
|
|
|
|
case "$ACTION" in
|
|
install)
|
|
install_deps
|
|
configure_mysql
|
|
configure_redis
|
|
init_db
|
|
wait_ports && log "install ok" || { log "install finished but ports not ready"; exit 1; }
|
|
;;
|
|
start)
|
|
configure_mysql
|
|
configure_redis
|
|
wait_ports && log "start ok" || { log "start failed"; exit 1; }
|
|
;;
|
|
status)
|
|
mysql_ok=0
|
|
redis_ok=0
|
|
(echo >/dev/tcp/127.0.0.1/"${MYSQL_PORT}") 2>/dev/null && mysql_ok=1
|
|
redis-cli ping 2>/dev/null | grep -q PONG && redis_ok=1
|
|
log "mysql:${MYSQL_PORT}=$mysql_ok redis:6379=$redis_ok"
|
|
[ "$mysql_ok" -eq 1 ] && [ "$redis_ok" -eq 1 ]
|
|
;;
|
|
*)
|
|
echo "usage: $0 {install|start|status}"
|
|
exit 2
|
|
;;
|
|
esac
|