From e57b8b9ac714622fc0ac84d549dd6fd1fabf9fe9 Mon Sep 17 00:00:00 2001 From: Alexander Demidov Date: Thu, 3 Apr 2025 13:11:21 +0300 Subject: [PATCH] * create stack project reorganize to separate scripts + pma hosts modify --- create-stack-project.sh | 233 ++++------------------------ stack-project/_create-stack-www-project.sh | 89 +++++++++++ stack-project/project/_create-configs.sh | 74 +++++++++ stack-project/project/_create-misc-dirs.sh | 24 +++ stack-project/project/_create-ssh-dir.sh | 20 +++ stack-project/stack/_make-safile-service.sh | 41 +++++ stack-project/stack/_modify-pma-hosts.sh | 50 ++++++ 7 files changed, 324 insertions(+), 207 deletions(-) create mode 100644 stack-project/_create-stack-www-project.sh create mode 100644 stack-project/project/_create-configs.sh create mode 100644 stack-project/project/_create-misc-dirs.sh create mode 100644 stack-project/project/_create-ssh-dir.sh create mode 100644 stack-project/stack/_make-safile-service.sh create mode 100644 stack-project/stack/_modify-pma-hosts.sh diff --git a/create-stack-project.sh b/create-stack-project.sh index 881957d..0f785c2 100755 --- a/create-stack-project.sh +++ b/create-stack-project.sh @@ -1,223 +1,42 @@ #!/bin/bash set -e + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +cd $SCRIPT_DIR + +# Список обязательных программ +required_programs=( + "pwgen" +) + +# Проверка каждой программы +for program in "${required_programs[@]}"; do + if ! command -v "$program" &>/dev/null; then + echo "❌ Ошибка: программа '$program' не установлена!" + exit 1 + fi +done + PROJECT=$1 if [[ -z "${PROJECT}" ]]; then echo 'Usage: ./create-stack-project PROJECT [SEAFILE_DUMPS_LIB_UUID]'; exit 1; fi -test -f .env || { - echo 'No env'; - exit 1; +source .env || { + echo "❌ Ошибка: не удалось загрузить .env (файл не существует или содержит ошибки)" >&2; + exit 1; } +export $(grep -v '^#' .env | cut -d= -f1) echo -source .env - -P_UID=1000 -P_GID=1000 - -PROJECT_DIR=/opt/projects/${PROJECT} -CONFIG_DIR=${PROJECT_DIR}/config -HOSTFILES_DIR=${PROJECT_DIR}/hostfiles -LOGS_DIR=${PROJECT_DIR}/logs -MARIADB_DIR=${PROJECT_DIR}/mariadb -PROFILER_DIR=${PROJECT_DIR}/profiler -SSH_DIR=${PROJECT_DIR}/ssh -WWW_DIR=${PROJECT_DIR}/www - - -mkdir /opt/stacks/${PROJECT} - -cat << EOF > /opt/stacks/${PROJECT}/compose.yaml -services: - nginx: - extends: - file: ./../structure/compose.base.yaml - service: nginx - php: - extends: - file: ./../structure/compose.base.yaml - service: php - workspace: - extends: - file: ./../structure/compose.base.yaml - service: workspace - build: - args: - - INSTALL_NODE=false - working_dir: /var/www/\${PROJECT} - volumes: - - ConfigJetBrains:/home/laradock/.config/JetBrains - - BashHistoryLog:/home/laradock/.bash_history - - VSCodeServerInsiders:/home/laradock/.vscode-server-insiders - secrets: - - composer_auth - networks: - apihole_net: - aliases: - - workspace.${PROJECT}.saturn - mariadb: - extends: - file: ./../structure/compose.base.yaml - service: mariadb - redis: - extends: - file: ./../structure/compose.base.yaml - service: redis -secrets: - user_authorized_keys: - file: /opt/projects/\${PROJECT}/ssh/authorized_keys - user_ssh_key: - file: /opt/projects/\${PROJECT}/ssh/id_ed25519 - user_ssh_key_pub: - file: /opt/projects/\${PROJECT}/ssh/id_ed25519.pub - composer_auth: - file: /opt/projects/\${PROJECT}/config/composer/auth.json -networks: - dockge_default: - external: true - pma_default: - external: true - apihole_net: - external: true -volumes: - ConfigJetBrains: - BashHistoryLog: - VSCodeServerInsiders: -EOF - -# Possible PHP_VERSION is 7.4, 8.1, 8.2 & 8.3 -cat << EOF > /opt/stacks/${PROJECT}/.env -PROJECT=${PROJECT} -PHP_VERSION=8.3 -EOF - -SEAFILE_USER="${MACHINE}-${PROJECT}-workspace@dimti.ru" -SEAFILE_PASS=$(pwgen -s 20 1) -SEAFILE_LIB=$2 - -echo "Seafile credentionals for create new account:" -echo "SEAFILE_USER: ${SEAFILE_USER}" -echo "SEAFILE_PASS: ${SEAFILE_PASS}" - -PROJECT_UPPERCASE=$(echo ${PROJECT} | tr '[:lower:]' '[:upper:]') - -cat << EOF >> /opt/stacks/seafile/.env - -${PROJECT_UPPERCASE}_USER=${SEAFILE_USER} -${PROJECT_UPPERCASE}_PASS=${SEAFILE_PASS} -${PROJECT_UPPERCASE}_LIB=${SEAFILE_LIB} -EOF - -sed -e "s/volumes:/volumes:\n\s\sseafile-$PROJECT:/g" /opt/stacks/seafile/compose.yaml - -cat << EOF >> /opt/stacks/seafile/compose.yaml - ${PROJECT}: - extends: - file: ./compose.base.yaml - service: seafile - volumes: - - /opt/projects/${PROJECT}/hostfiles:/library - - seafile-${PROJECT}:/seafile - environment: - SEAF_USERNAME: "\${${PROJECT_UPPERCASE}_USER}" - SEAF_PASSWORD: "\${${PROJECT_UPPERCASE}_PASS}" - SEAF_LIBRARY: "\${${PROJECT_UPPERCASE}_LIB}" -EOF - -chown -R $_PUID:$P_GID /opt/stacks/${PROJECT} - -mkdir -p ${CONFIG_DIR}/composer -mkdir -p ${CONFIG_DIR}/mariadb -mkdir -p ${CONFIG_DIR}/nginx/conf.d -mkdir -p ${CONFIG_DIR}/nginx/includes.d -mkdir -p ${CONFIG_DIR}/nginx/ssl.d -mkdir -p ${CONFIG_DIR}/redis - -cat << EOF > ${CONFIG_DIR}/composer/auth.json -{ - "github-oauth": { - "github.com": "" - } -} -EOF - -cat << EOF > ${CONFIG_DIR}/mariadb/90-mysqld.cnf -[mysqld] -general_log=OFF -general_log_file=/var/log/mariadb/mariadb.log -EOF - -cat << EOF > ${CONFIG_DIR}/nginx/conf.d/vhosts.conf -upstream php { - server php:9000; -} -map \$http_host \$root { - ${PROJECT}.${DOMAIN_PLACEHOLDER} /var/www/${PROJECT}; -} -server { - listen 80 default; - root \$root; - include includes.d/octobercms.conf; - include includes.d/staticfiles.conf; - client_max_body_size 300M; - large_client_header_buffers 4 32k; - location ~ ^/index.php { - fastcgi_pass php; - include fastcgi_params; - fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; - fastcgi_param SERVER_NAME \$host; - } -} -EOF - -cp /opt/stacks/structure/config/nginx/includes.d/octobercms.conf ${CONFIG_DIR}/nginx/includes.d/ -cp /opt/stacks/structure/config/nginx/includes.d/staticfiles.conf ${CONFIG_DIR}/nginx/includes.d/ - -cat << EOF > ${CONFIG_DIR}/redis/redis-local.conf -port 6379 -tcp-backlog 128 -protected-mode no -stop-writes-on-bgsave-error no -databases 4 -always-show-logo no -syslog-enabled yes -pidfile /var/run/redis_6379.pid -loglevel notice -logfile "" -EOF - -chown $P_UID:$P_GID -R ${CONFIG_DIR} - -mkdir ${HOSTFILES_DIR} -chown $P_UID:$P_GID ${HOSTFILES_DIR} - -mkdir -p ${LOGS_DIR}/mariadb -mkdir -p ${LOGS_DIR}/nginx -mkdir -p ${LOGS_DIR}/php-fpm - -mkdir ${MARIADB_DIR} -mkdir ${PROFILER_DIR} - -mkdir ${SSH_DIR} -touch ${SSH_DIR}/authorized_keys -ssh-keygen -N "" -t ed25519 -f ${SSH_DIR}/id_ed25519 -C workspace-${PROJECT}@${MACHINE} 2>&1 > /dev/null - -echo "SSH Key:" -cat ${SSH_DIR}/id_ed25519.pub -echo - -ssh-keyscan -H github.com > ${SSH_DIR}/known_hosts 2>/dev/null -chown $P_UID:$P_GID -R ${SSH_DIR} +export PROJECT_DIR=${PROJECTS_DIR}/${PROJECT} -mkdir -p ${WWW_DIR}/${PROJECT} +. ./stack-project/stack/_make-seafile-service.sh -cat << EOF > ${WWW_DIR}/${PROJECT}/index.php - ${STACKS_DIR}/${PROJECT}/compose.yaml +services: + nginx: + extends: + file: ./../structure/compose.base.yaml + service: nginx + php: + extends: + file: ./../structure/compose.base.yaml + service: php + workspace: + extends: + file: ./../structure/compose.base.yaml + service: workspace + build: + args: + - INSTALL_NODE=false + working_dir: /var/www/\${PROJECT} + volumes: + - ConfigJetBrains:/home/laradock/.config/JetBrains + - BashHistoryLog:/home/laradock/.bash_history + - VSCodeServerInsiders:/home/laradock/.vscode-server-insiders + secrets: + - composer_auth + networks: + apihole_net: + aliases: + - workspace.${PROJECT}.saturn + mariadb: + extends: + file: ./../structure/compose.base.yaml + service: mariadb + redis: + extends: + file: ./../structure/compose.base.yaml + service: redis +secrets: + user_authorized_keys: + file: /opt/projects/\${PROJECT}/ssh/authorized_keys + user_ssh_key: + file: /opt/projects/\${PROJECT}/ssh/id_ed25519 + user_ssh_key_pub: + file: /opt/projects/\${PROJECT}/ssh/id_ed25519.pub + composer_auth: + file: /opt/projects/\${PROJECT}/config/composer/auth.json +networks: + dockge_default: + external: true + pma_default: + external: true + apihole_net: + external: true +volumes: + ConfigJetBrains: + BashHistoryLog: + VSCodeServerInsiders: +EOF + +# Possible PHP_VERSION is 7.4, 8.1, 8.2 & 8.3 +cat << EOF > ${STACKS_DIR}/${PROJECT}/.env +PROJECT=${PROJECT} +PHP_VERSION=8.3 +EOF + +chown -R $_PUID:$P_GID /opt/stacks/${PROJECT} + + +WWW_DIR=${PROJECT_DIR}/www + +mkdir -p ${WWW_DIR}/${PROJECT} + +cat << EOF > ${WWW_DIR}/${PROJECT}/index.php + ${CONFIG_DIR}/composer/auth.json +{ + "github-oauth": { + "github.com": "" + } +} +EOF + +cat << EOF > ${CONFIG_DIR}/mariadb/90-mysqld.cnf +[mysqld] +general_log=OFF +general_log_file=/var/log/mariadb/mariadb.log +EOF + +cat << EOF > ${CONFIG_DIR}/nginx/conf.d/vhosts.conf +upstream php { + server php:9000; +} +map \$http_host \$root { + ${PROJECT}.${DOMAIN_PLACEHOLDER} /var/www/${PROJECT}; +} +server { + listen 80 default; + root \$root; + include includes.d/octobercms.conf; + include includes.d/staticfiles.conf; + client_max_body_size 300M; + large_client_header_buffers 4 32k; + location ~ ^/index.php { + fastcgi_pass php; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; + fastcgi_param SERVER_NAME \$host; + } +} +EOF + +cp /opt/stacks/structure/config/nginx/includes.d/octobercms.conf ${CONFIG_DIR}/nginx/includes.d/ +cp /opt/stacks/structure/config/nginx/includes.d/staticfiles.conf ${CONFIG_DIR}/nginx/includes.d/ + +cat << EOF > ${CONFIG_DIR}/redis/redis-local.conf +port 6379 +tcp-backlog 128 +protected-mode no +stop-writes-on-bgsave-error no +databases 4 +always-show-logo no +syslog-enabled yes +pidfile /var/run/redis_6379.pid +loglevel notice +logfile "" +EOF + +chown $P_UID:$P_GID -R ${CONFIG_DIR} \ No newline at end of file diff --git a/stack-project/project/_create-misc-dirs.sh b/stack-project/project/_create-misc-dirs.sh new file mode 100644 index 0000000..1ec2938 --- /dev/null +++ b/stack-project/project/_create-misc-dirs.sh @@ -0,0 +1,24 @@ +#!/bin/bash +set -e + +# Проект должен быть указан родительским скриптом +if [ ! -n "$PROJECT" ]; then + echo "❌ Проект не указан!" + exit 1 +fi + +HOSTFILES_DIR=${PROJECT_DIR}/hostfiles +mkdir ${HOSTFILES_DIR} +chown $P_UID:$P_GID ${HOSTFILES_DIR} + +LOGS_DIR=${PROJECT_DIR}/logs +mkdir ${LOGS_DIR} +mkdir ${LOGS_DIR}/mariadb +mkdir ${LOGS_DIR}/nginx +mkdir ${LOGS_DIR}/php-fpm + +MARIADB_DIR=${PROJECT_DIR}/mariadb +mkdir ${MARIADB_DIR} + +PROFILER_DIR=${PROJECT_DIR}/profiler +mkdir ${PROFILER_DIR} \ No newline at end of file diff --git a/stack-project/project/_create-ssh-dir.sh b/stack-project/project/_create-ssh-dir.sh new file mode 100644 index 0000000..c9a9447 --- /dev/null +++ b/stack-project/project/_create-ssh-dir.sh @@ -0,0 +1,20 @@ +#!/bin/bash +set -e + +# Проект должен быть указан родительским скриптом +if [ ! -n "$PROJECT" ]; then + echo "❌ Проект не указан!" + exit 1 +fi + +SSH_DIR=${PROJECT_DIR}/ssh +mkdir ${SSH_DIR} +touch ${SSH_DIR}/authorized_keys +ssh-keygen -N "" -t ed25519 -f ${SSH_DIR}/id_ed25519 -C workspace-${PROJECT}@${MACHINE} 2>&1 > /dev/null + +echo "SSH Key:" +cat ${SSH_DIR}/id_ed25519.pub +echo + +ssh-keyscan -H github.com > ${SSH_DIR}/known_hosts 2>/dev/null +chown $P_UID:$P_GID -R ${SSH_DIR} \ No newline at end of file diff --git a/stack-project/stack/_make-safile-service.sh b/stack-project/stack/_make-safile-service.sh new file mode 100644 index 0000000..9446147 --- /dev/null +++ b/stack-project/stack/_make-safile-service.sh @@ -0,0 +1,41 @@ +#!/bin/bash +set -e + +# Проект должен быть указан родительским скриптом +if [ ! -n "$PROJECT" ]; then + echo "❌ Проект не указан!" + exit 1 +fi + +SEAFILE_USER="${MACHINE}-${PROJECT}-workspace@dimti.ru" +SEAFILE_PASS=$(pwgen -s 20 1) +SEAFILE_LIB=$2 + +echo "Seafile credentionals for create new account:" +echo "SEAFILE_USER: ${SEAFILE_USER}" +echo "SEAFILE_PASS: ${SEAFILE_PASS}" + +PROJECT_UPPERCASE=$(echo ${PROJECT} | tr '[:lower:]' '[:upper:]') + +cat << EOF >> ${STACKS_DIR}/seafile/.env + +${PROJECT_UPPERCASE}_USER=${SEAFILE_USER} +${PROJECT_UPPERCASE}_PASS=${SEAFILE_PASS} +${PROJECT_UPPERCASE}_LIB=${SEAFILE_LIB} +EOF + +sed -e "s/volumes:/volumes:\n\s\sseafile-$PROJECT:/g" /opt/stacks/seafile/compose.yaml + +cat << EOF >> /opt/stacks/seafile/compose.yaml + ${PROJECT}: + extends: + file: ./compose.base.yaml + service: seafile + volumes: + - /opt/projects/${PROJECT}/hostfiles:/library + - seafile-${PROJECT}:/seafile + environment: + SEAF_USERNAME: "\${${PROJECT_UPPERCASE}_USER}" + SEAF_PASSWORD: "\${${PROJECT_UPPERCASE}_PASS}" + SEAF_LIBRARY: "\${${PROJECT_UPPERCASE}_LIB}" +EOF \ No newline at end of file diff --git a/stack-project/stack/_modify-pma-hosts.sh b/stack-project/stack/_modify-pma-hosts.sh new file mode 100644 index 0000000..0c1bc28 --- /dev/null +++ b/stack-project/stack/_modify-pma-hosts.sh @@ -0,0 +1,50 @@ +#!/bin/bash +set -e + +# Проект должен быть указан родительским скриптом +if [ ! -n "$PROJECT" ]; then + echo "❌ Проект не указан!" + exit 1 +fi + +PMA_ENV_FILE="${STACKS_DIR}/pma/.env" + +# Проверяем, существует ли файл .env +if [ ! -f "$PMA_ENV_FILE" ]; then + echo "❌ Файл $PMA_ENV_FILE не найден!" + exit 1 +fi + +# Временный файл для изменений +TMP_FILE=$(mktemp) + +# Обрабатываем каждую строку +while IFS= read -r line; do + case "$line" in + HOSTS=*) + current_hosts=${line#HOSTS=} + if [[ ! "$current_hosts" =~ "$PROJECT-mariadb-1" ]]; then + echo "HOSTS=$current_hosts,$PROJECT-mariadb-1" >> "$TMP_FILE" + else + echo "$line" >> "$TMP_FILE" + fi + ;; + VERBOSES=*) + current_verboses=${line#VERBOSES=} + if [[ ! "$current_verboses" =~ "$PROJECT" ]]; then + echo "VERBOSES=$current_verboses,$PROJECT" >> "$TMP_FILE" + else + echo "$line" >> "$TMP_FILE" + fi + ;; + *) + echo "$line" >> "$TMP_FILE" + ;; + esac +done < "$PMA_ENV_FILE" + +# Перемещаем временный файл на место оригинального +mv "$TMP_FILE" "$PMA_ENV_FILE" + +echo "✅ Файл $PMA_ENV_FILE обновлён:" +cat "$PMA_ENV_FILE" \ No newline at end of file