#!/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="true" # 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" "postgresql") # 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=""" "$WEB_SERVER_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 rm -rf $WEB_SERVER_DIR mkdir -p $WEB_SERVER_DIR } _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 . cd $WEB_SERVER_DIR || exit chown $MAIN_NAME:nginx -R . } 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 _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