#!/bin/bash set -e set -o pipefail SECRET_KEY=$(head -c 32 /dev/urandom | base64) NETWORK_NAME=medicine-network GLOBAL_ENV_FILE="/medicine-config/.env" ENV_FILE="/medicine-config/medicine/.env" POSTGRES_CONTAINER=service-postgres POSTGRES_USER=postgres DB_NAME=medicine ORGANIZATION_NAME="$1" ORGANIZATION_ID="$2" HTTP_PORT="$3" HTTPS_PORT="$4" set_global_env_var () { local key="$1" local value="$2" if grep -qE "^${key}=" "$GLOBAL_ENV_FILE"; then sed -i "s|^${key}=.*|${key}=${value}|" "$GLOBAL_ENV_FILE" else echo "${key}=${value}" >> "$GLOBAL_ENV_FILE" fi } set_env_var () { local key="$1" local value="$2" if grep -qE "^${key}=" "$ENV_FILE"; then sed -i "s|^${key}=.*|${key}=${value}|" "$ENV_FILE" else echo "${key}=${value}" >> "$ENV_FILE" fi } unset_env_var () { local key="$1" if grep -qE "^${key}=" "$ENV_FILE"; then sed -i "/^${key}=/d" "$ENV_FILE" fi } if [[ -z "$ORGANIZATION_NAME" || -z "$ORGANIZATION_ID" ]]; then echo "❌ Ошибка: оба параметра обязательны" exit 1 fi echo "Название организации: $ORGANIZATION_NAME" echo "Идентификатор организации: $ORGANIZATION_ID" echo "HTTP порт: $HTTP_PORT" echo "HTTPS порт: $HTTPS_PORT" echo "" if [ -z $(docker network ls --filter name=^${NETWORK_NAME}$ --format="{{ .Name }}") ] ; then docker network create ${NETWORK_NAME} ; echo "🌐 Сеть $NETWORK_NAME создана" else echo "🌐 Сеть $NETWORK_NAME уже существует" fi echo "" echo "📁 Создаем файлы окружения" touch "$ENV_FILE" touch "$GLOBAL_ENV_FILE" set_global_env_var "ORGANIZATION_ID" "$ORGANIZATION_ID" set_global_env_var "ORGANIZATION_NAME" "$ORGANIZATION_NAME" set_global_env_var "POSTGRES_USER" "$POSTGRES_USER" set_global_env_var "POSTGRES_HOST" "$POSTGRES_CONTAINER" set_global_env_var "REDIS_HOST" "service-redis" set_env_var "SECRET_KEY" "$SECRET_KEY" if [ -n "$HTTP_PORT" ] && [ "$HTTP_PORT" != "80" ]; then set_env_var "NGINX_HTTP_PORT" "$HTTP_PORT" else unset_env_var "NGINX_HTTP_PORT" fi if [ -n "$HTTPS_PORT" ] && [ "$HTTPS_PORT" != "443" ]; then set_env_var "NGINX_HTTPS_PORT" "$HTTPS_PORT" else unset_env_var "NGINX_HTTPS_PORT" fi echo "" echo "📦 Запускаем контейнер postgres" (cd /medicine-config/service-postgres && docker compose pull -q && docker compose up -d) echo "" echo "📦 Запускаем контейнер redis" (cd /medicine-config/service-redis && docker compose pull -q && docker compose up -d) echo "" if docker exec "$POSTGRES_CONTAINER" psql -U "$POSTGRES_USER" -tAc \ "SELECT 1 FROM pg_database WHERE datname='$DB_NAME'" | grep -q 1; then echo "✅ База данных уже существует: $DB_NAME" else echo "➕ База данных не найдена, создаём: $DB_NAME" docker exec "$POSTGRES_CONTAINER" createdb -U "$POSTGRES_USER" "$DB_NAME" echo "✅ База данных создана: $DB_NAME" fi TABLES_COUNT=$(docker exec "$POSTGRES_CONTAINER" psql -U "$POSTGRES_USER" -d "$DB_NAME" -tAc \ "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'public';") echo "" if [ "$TABLES_COUNT" -gt 0 ]; then echo "⚠️ Восстановление БД пропущено - в базе уже есть таблицы ($TABLES_COUNT)" else echo "📥 Восстанавливаем БД из бэкапа" unzip -o /medicine-config/backups/medicine.sql.zip -d /tmp docker cp /tmp/medicine.sql "$POSTGRES_CONTAINER:/tmp/medicine.sql" docker exec -i "$POSTGRES_CONTAINER" psql -U "$POSTGRES_USER" -d "$DB_NAME" -q --set ON_ERROR_STOP=on -f /tmp/medicine.sql echo "✅ Восстановление завершено" fi echo "" echo "Скачиваем образ" docker pull docker.med-logic.ru/medicine:latest -q docker tag docker.med-logic.ru/medicine:latest medicine:latest echo "" echo "Запускаем систему" (cd /medicine-config/medicine && docker compose up -d) echo "" echo "🎉 МИС \"Медицина\" успешно установлена"