Browse Source

* create stack project reorganize to separate scripts

+ pma hosts modify
master
Alexander Demidov 1 month ago
parent
commit
e57b8b9ac7
  1. 233
      create-stack-project.sh
  2. 89
      stack-project/_create-stack-www-project.sh
  3. 74
      stack-project/project/_create-configs.sh
  4. 24
      stack-project/project/_create-misc-dirs.sh
  5. 20
      stack-project/project/_create-ssh-dir.sh
  6. 41
      stack-project/stack/_make-safile-service.sh
  7. 50
      stack-project/stack/_modify-pma-hosts.sh

233
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
<?php
. ./stack-project/project/_create-configs.sh
phpinfo();
EOF
. ./stack-project/project/_create-misc-dirs.sh
chown -R $P_UID:$P_GID ${WWW_DIR}
. ./stack-project/_create-stack-www-project.sh

89
stack-project/_create-stack-www-project.sh

@ -0,0 +1,89 @@
#!/bin/bash
set -e
# Проект должен быть указан родительским скриптом
if [ ! -n "$PROJECT" ]; then
echo "❌ Проект не указан!"
exit 1
fi
mkdir ${STACKS_DIR}/${PROJECT}
cat << EOF > ${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
<?php
phpinfo();
EOF
chown -R $P_UID:$P_GID ${WWW_DIR}

74
stack-project/project/_create-configs.sh

@ -0,0 +1,74 @@
#!/bin/bash
set -e
# Проект должен быть указан родительским скриптом
if [ ! -n "$PROJECT" ]; then
echo "❌ Проект не указан!"
exit 1
fi
CONFIG_DIR=${PROJECT_DIR}/config
mkdir ${CONFIG_DIR}
mkdir ${CONFIG_DIR}/composer
mkdir ${CONFIG_DIR}/mariadb
mkdir ${CONFIG_DIR}/nginx
mkdir ${CONFIG_DIR}/nginx/conf.d
mkdir ${CONFIG_DIR}/nginx/includes.d
mkdir ${CONFIG_DIR}/nginx/ssl.d
mkdir ${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}

24
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}

20
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}

41
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

50
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"
Loading…
Cancel
Save