Files
survey/setup_server.sh
T
2026-09-12 14:34:09 +07:00

176 lines
5.2 KiB
Bash
Executable File

#!/bin/bash
# ==============================================================================
# Automated Server Setup Script for TPU Survey (survey.tapee.ac.th)
# Compatible with Ubuntu 20.04 / 22.04 / 24.04 and Debian 11 / 12
# ==============================================================================
set -e
# Configuration Variables
DOMAIN="survey.tapee.ac.th"
WEB_ROOT="/var/www/survey"
DB_NAME="tpu_survey_v2"
DB_USER="survey_user"
DB_PASS="SurveyTPU2026!Secure" # Change this if needed
GIT_REPO="https://git.tapee.ac.th/pongpon/survey.git"
echo "=========================================================="
echo " Starting Setup for ${DOMAIN} on VM 110"
echo "=========================================================="
# 1. Update system packages
echo "[1/6] Updating system packages..."
export DEBIAN_FRONTEND=noninteractive
apt-get update -y && apt-get upgrade -y
# 2. Install Web Server, PHP, and MariaDB
echo "[2/6] Installing Apache, PHP, MariaDB, and utilities..."
apt-get install -y \
apache2 \
mariadb-server \
mariadb-client \
git \
curl \
unzip \
certbot \
python3-certbot-apache \
php \
php-cli \
php-fpm \
php-mysql \
php-mbstring \
php-xml \
php-curl \
php-gd \
php-zip \
php-intl \
libapache2-mod-php
# Enable Apache Modules
a2enmod rewrite ssl headers
# 3. Setup MariaDB Database
echo "[3/6] Configuring Database (${DB_NAME})..."
systemctl start mariadb
systemctl enable mariadb
mysql -u root <<EOF
CREATE DATABASE IF NOT EXISTS \`${DB_NAME}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}';
GRANT ALL PRIVILEGES ON \`${DB_NAME}\`.* TO '${DB_USER}'@'localhost';
FLUSH PRIVILEGES;
EOF
echo "Database and User created successfully."
# 4. Deploy Project Source Code
echo "[4/6] Setting up project files at ${WEB_ROOT}..."
if [ -d "${WEB_ROOT}/.git" ]; then
echo "Updating existing repository..."
cd "${WEB_ROOT}"
git pull origin main || true
else
mkdir -p "${WEB_ROOT}"
if [ -f "./tpu_survey_v2.sql" ]; then
echo "Copying local files to ${WEB_ROOT}..."
cp -r ./* "${WEB_ROOT}/"
else
echo "Cloning from Git repository..."
git clone "${GIT_REPO}" "${WEB_ROOT}" || true
fi
fi
# Import Database Schema if SQL file exists
if [ -f "${WEB_ROOT}/tpu_survey_v2.sql" ]; then
echo "Importing database schema from tpu_survey_v2.sql..."
mysql -u root "${DB_NAME}" < "${WEB_ROOT}/tpu_survey_v2.sql" || echo "Note: Initial import completed or tables exist."
fi
# Update config/database.php with the server credentials
cat <<EOF > "${WEB_ROOT}/config/database.php"
<?php
/**
* Database Configuration
* TPU Survey System
*/
define('DB_HOST', 'localhost');
define('DB_NAME', '${DB_NAME}');
define('DB_USER', '${DB_USER}');
define('DB_PASS', '${DB_PASS}');
define('DB_CHARSET', 'utf8mb4');
function getDB() {
static \$pdo = null;
if (\$pdo === null) {
try {
\$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET;
\$pdo = new PDO(\$dsn, DB_USER, DB_PASS, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
]);
} catch (PDOException \$e) {
http_response_code(500);
echo json_encode(['error' => 'Database connection failed: ' . \$e->getMessage()]);
exit;
}
}
return \$pdo;
}
function jsonResponse(\$data, \$code = 200) {
http_response_code(\$code);
header('Content-Type: application/json; charset=utf-8');
echo json_encode(\$data, JSON_UNESCAPED_UNICODE);
exit;
}
function getInput() {
\$json = file_get_contents('php://input');
return json_decode(\$json, true) ?: [];
}
EOF
# Set proper permissions
mkdir -p "${WEB_ROOT}/uploads" "${WEB_ROOT}/temp_certificates"
chown -R www-data:www-data "${WEB_ROOT}"
chmod -R 755 "${WEB_ROOT}"
chmod -R 775 "${WEB_ROOT}/uploads" "${WEB_ROOT}/temp_certificates"
# 5. Configure Apache VirtualHost
echo "[5/6] Creating Apache VirtualHost for ${DOMAIN}..."
cat <<EOF > /etc/apache2/sites-available/${DOMAIN}.conf
<VirtualHost *:80>
ServerName ${DOMAIN}
ServerAlias www.${DOMAIN}
DocumentRoot ${WEB_ROOT}
<Directory ${WEB_ROOT}>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog \${APACHE_LOG_DIR}/${DOMAIN}_error.log
CustomLog \${APACHE_LOG_DIR}/${DOMAIN}_access.log combined
</VirtualHost>
EOF
a2dissite 000-default.conf || true
a2ensite ${DOMAIN}.conf
systemctl restart apache2
# 6. Summary & SSL Instructions
echo "=========================================================="
echo " SETUP COMPLETED SUCCESSFULLY!"
echo "=========================================================="
echo "1. Web Root: ${WEB_ROOT}"
echo "2. Database Name: ${DB_NAME}"
echo "3. Database User: ${DB_USER}"
echo "4. VirtualHost: http://${DOMAIN}"
echo ""
echo "To enable HTTPS (SSL Certificate via Let's Encrypt), run:"
echo " certbot --apache -d ${DOMAIN}"
echo "=========================================================="