7 changed files with 324 additions and 207 deletions
-
233create-stack-project.sh
-
89stack-project/_create-stack-www-project.sh
-
74stack-project/project/_create-configs.sh
-
24stack-project/project/_create-misc-dirs.sh
-
20stack-project/project/_create-ssh-dir.sh
-
41stack-project/stack/_make-safile-service.sh
-
50stack-project/stack/_modify-pma-hosts.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 |
@ -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} |
@ -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} |
@ -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} |
@ -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} |
@ -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 |
@ -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" |
Write
Preview
Loading…
Cancel
Save
Reference in new issue