Yurdle/dockerserver.sh

324 lines
8.4 KiB
Bash
Executable File

#!/bin/bash
# PHP + Nginx + SQL, Docker Local Test Server Setup/Management File
# Based on nginx docker because I don't know how to use docker compose .d
# NOTE remote installation methods removed, just use for local tests
# TODO Make docker compose file for running components under different dockers
CONTAINER_PREFIX="YURDLE" # nginx docker name prefix
MOUNT_PATH="/source" # binded mount path in nginx docker
SCRIPT_NAME="dockerserver.sh" # name of the *this* file
SCRIPT_DIR="Yurdle" # containing directory of the *this* file
BUILD_DIR="." # build results of local source code (insert a dot (.) if you do not need to build your application)
# DATABASE_TYPE="postgresql" # database type, either mysql or postgresql
MAIN_NAME="yurdle" # main program name
PORT1="8000" # TODO what is the difference between 8000 and 80
PORT2="80"
WEB_ROOT_DIR="/usr/share/nginx/html/" # public web root dir
WEB_SERVER_DIR="/usr/share/nginx/server/" # private server root dir
SECRET_SERVER="false" # add secret server to $WEB_ROOT_DIR/../$SECRET_SERVER_FOLDER
SECRET_SERVER_LOCAL_RELATIONAL_PATH="../YurdleBackend" # local path
SERVER_BUILD_DIR="." # server build dir
# __DB_NAME__="localdb"
# __DB_USER__="dbuser"
# __DB_PWD__="dbpass"
PHP_VERSION="8.2"
ACTIVE_SERVICES=("nginx" "php$PHP_VERSION-fpm") # services
############################
############################
# COLORS
_RED='\033[0;31m'
_NC='\033[0m \e[0m' # No Color, No Effect
HELP="""
Usage:
dock [command] [subcommand]
COMMANDS:
${_RED}ini:${_NC} initialize dock command
install: install $MAIN_NAME
reconf : reconfigure configs
restart: restart services (nginx, $DATABASE_TYPE, php-fpm)
update: update source files with new build on /source/
status: see current webserver status
help: see this help text
root: cd to web root folder
restall: update + reconf + restart + root
"""
CONFIG_FILE_CONTENT="""
<?php
class Config
{
const DB_HOST = 'localhost';
const DB_NAME = '$__DB_NAME__';
const DB_USERNAME = '$__DB_USER__';
const DB_PASSWORD = '$__DB_PWD__';
const DATAACCESS_TOKEN = 'LOCAL';
}
"""
NGINX_CONFIG_FILE="""
server {
listen $PORT2;
server_name localhost:$PORT1;
location / {
alias $WEB_ROOT_DIR;
#root $WEB_ROOT_DIR;
index index.php;
# Common parameter to increase upload size limit in conjunction with dedicated php-fpm file
client_max_body_size 50M;
try_files \$uri \$uri/ index.php;
location ~ [^/]\.php(/|\$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)\$;
fastcgi_pass unix:/var/run/php/php$PHP_VERSION-fpm-$MAIN_NAME.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param REMOTE_USER \$remote_user;
fastcgi_param PATH_INFO \$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME \$request_filename;
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root $WEB_ROOT_DIR;
}
}
"""
PHP_FPM_CONFIG_FILE="""
[$MAIN_NAME]
user = $MAIN_NAME
group = $MAIN_NAME
chdir = /usr/share/nginx/html
listen = /var/run/php/php$PHP_VERSION-fpm-$MAIN_NAME.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
pm = ondemand
pm.max_children = 8
pm.max_requests = 500
request_terminate_timeout = 1d
pm.process_idle_timeout = 10s
; Additional php.ini defines, specific to this pool of workers.
php_admin_value[upload_max_filesize] = 50M
php_admin_value[post_max_size] = 50M
"""
# print command HEAD
_head() {
echo -e "\n\n----------------------------------"
echo -e "${_RED}$1 HEAD${_NC}"
echo -e "----------------------------------"
}
_end() {
echo -e "----------------------------------"
echo -e "${_RED}$1 END${_NC}"
echo -e "----------------------------------\n\n"
}
_exit() {
echo -e "${_RED}exiting...${_NC}"
exit
}
_status() {
_head "SYSTEM STATUS"
for var in "${ACTIVE_SERVICES[@]}"; do
service "$var" status
done
_end "SYSTEM STATUS"
}
_restart() {
_head "SYSTEM RESTART"
for var in "${ACTIVE_SERVICES[@]}"; do
service "$var" restart
sleep 2
done
_end "SYSTEM RESTART"
_status
}
_reconf() {
_head "RECONFIGURATION"
echo -e "$CONFIG_FILE_CONTENT" >"$WEB_ROOT_DIR/config.php"
echo -e "$NGINX_CONFIG_FILE" >"/etc/nginx/conf.d/default.conf"
echo -e "$PHP_FPM_CONFIG_FILE" >"/etc/php/$PHP_VERSION/fpm/pool.d/$MAIN_NAME.conf"
_end "RECONFIGURATION"
}
_update() {
_head "SOURCE UPDATE"
if [[ $SECRET_SERVER == "true" ]]; then
rsync -a --progress /source/$BUILD_DIR $WEB_ROOT_DIR
rsync -a --progress /server/$SERVER_BUILD_DIR $WEB_SERVER_DIR
else
rsync -a --progress /source/$BUILD_DIR $WEB_ROOT_DIR
fi
_end "SOURCE UPDATE"
}
_update_conf() {
if [[ $3 == "server" ]]; then
sed -i "s/\($1 * = *\).*/\1$2;/" "$WEB_SERVER_FOLDER/config.php"
else
sed -i "s/\($1 * = *\).*/\1$2;/" "$WEB_ROOT_FOLDER/config.php"
fi
}
_refresh_folders() {
rm -rf $WEB_ROOT_DIR
mkdir -p $WEB_ROOT_DIR
if [[ $SECRET_SERVER == "true" ]]; then
rm -rf $WEB_SERVER_DIR
mkdir -p $WEB_SERVER_DIR
fi
}
_setup_database() {
if [[ $DATABASE_TYPE == "mysql" ]]; then
apt install mariadb-server php-mysql -y
service mariadb start
mysql -u root -e "create database $MAIN_NAME"
mysql -u root -e "set password for root@localhost = password('root');"
elif [[ $DATABASE_TYPE == "postgresql" ]]; then
apt install postgresql php-pgsql -y
service postgresql start
su -c "createuser $__DB_USER__;createdb -h localhost -p $__DB_PWD__ -E UTF8 -O $__DB_USER__ $__DB_NAME__;" - postgres
fi
}
_folder_permissions() {
groupadd $MAIN_NAME
useradd -g $MAIN_NAME $MAIN_NAME
cd $WEB_ROOT_DIR || exit
chown $MAIN_NAME:nginx -R .
if [[ $SECRET_SERVER == "true" ]]; then
cd $WEB_SERVER_DIR || exit
chown $MAIN_NAME:nginx -R .
fi
}
if [[ $# -eq 0 ]]; then
if [[ $(pwd) != *$SCRIPT_DIR ]]; then
echo "PLEASE CHANGE DIRECTORY TO \`$SCRIPT_DIR/\` BEFORE STARTING SCRIPT"
exit
fi
# TODO silmeden önce onay iste!
# TODO extra docker oluşturma ve istenilen docker'a attach
echo -e "${_RED}CONTAINER WILL BE REMOVED !!!${_NC} (10)"
sleep 10
docker stop $CONTAINER_PREFIX
docker rm $CONTAINER_PREFIX
echo "removed"
if [[ $SECRET_SERVER == "true" ]]; then
docker run -it -d --name "$CONTAINER_PREFIX" --mount type=bind,source=".",target=/source/,readonly --mount type=bind,source="./$SECRET_SERVER_LOCAL_RELATIONAL_PATH",target=/server/,readonly --publish $PORT1:$PORT2 nginx bash
else
docker run -it -d --name "$CONTAINER_PREFIX" --mount type=bind,source=".",target=/source/,readonly --publish $PORT1:$PORT2 nginx bash
fi
echo -e "RUN SCRIPT: \`${_RED}bash $MOUNT_PATH/$SCRIPT_NAME docker ini${_NC}\`"
docker attach $CONTAINER_PREFIX --detach-keys="ctrl-k"
_exit
elif [[ $1 == "attach" ]]; then
if [ -n "$(docker ps -f "name=$CONTAINER_PREFIX" -f "status=running" -q)" ]; then
echo "the container is already running!"
else
docker start $CONTAINER_PREFIX
fi
docker attach $CONTAINER_PREFIX --detach-keys="ctrl-k"
elif [[ $1 == "docker" ]]; then
set +x
if [[ $2 == "ini" ]]; then
echo "alias dock=\"bash /source/$SCRIPT_NAME docker\"" >>/root/.bashrc
echo "alias root=\"cd $WEB_ROOT_DIR\"" >>/root/.bashrc
sleep 1
exec bash
elif [[ $2 == "restart" ]]; then
_restart
elif [[ $2 == "reconf" ]]; then
_reconf
elif [[ $2 == "restall" ]]; then
_update
sleep 1
_reconf
sleep 1
_restart
root
elif [[ $2 == "update" ]]; then
_update
elif [[ $2 == "status" ]]; then
_status
elif [[ $2 == "install" ]]; then
sleep 1
set -x
_refresh_folders
apt update
apt install nano exa tree wget unzip less rsync -y
cd $WEB_ROOT_DIR || exit
cp -r /source/$BUILD_DIR/* $WEB_ROOT_DIR/
if [[ $SECRET_SERVER == "true" ]]; then
cp -r /server/$BUILD_DIR/* $WEB_SERVER_DIR/
fi
apt install php php-fpm php-cli -y
locale-gen tr_TR
# _setup_database
_reconf
_folder_permissions
set +x
_restart
sleep 1
echo -e "${_RED}DONE! - OPEN localhost:$PORT1 TO TEST${_NC}"
elif [[ $2 == "help" ]]; then
echo -e "$HELP!"
else
echo -e "$_RED ! COMMAND NOT FOUND ! $_NC"
echo
echo -e "$HELP"
fi
else
echo -e "$_RED ! COMMAND NOT FOUND ! $_NC"
fi