image: postgres:16-alpine workflow: rules: - if: $CI_PIPELINE_SOURCE == "push" when: never - when: always variables: GIT_CLEAN_FLAGS: -ffdx POSTGRES_HOST: value: "" description: 'postgresql remote host' POSTGRES_PORT: value: "5432" description: 'port for postgresql remote host' POSTGRES_DB: value: "" description: 'db for restore"' POSTGRES_USER: value: "" description: 'user for postgresql remote host' POSTGRES_PASSWORD: value: "" description: 'passwd for postgresql user remote host' # URL дампов в Nexus SCHEMA_SQL_URL: value: "" description: 'https://nexus.example.com/repository/raw/db/schema.sql' DATA_DUMP_TAR_GZ_URL: value: "" description: 'https://nexus.example.com/repository/raw/db/data.tar.gz' # Локальные пути SCHEMA_SQL_PATH: "/tmp/schema.sql" DATA_DUMP_TAR_GZ_PATH: "/tmp/data.tar.gz" DATA_DUMP_DIR: "/tmp/dump_data" .create_dump_dir: &create_dump_dir - mkdir -p "$DATA_DUMP_DIR" .download_schema: &download_schema - | echo "Скачивание схемы: $SCHEMA_SQL_URL" curl -f -u $NEXUS_USER:$NEXUS_PASS -o "$SCHEMA_SQL_PATH" "$SCHEMA_SQL_URL" if [ $? -ne 0 ]; then echo "Ошибк при скачивании схемы" exit 1 fi echo "Схема успешно загружена: $SCHEMA_SQL_PATH" .download_data: &download_data - | echo "Скачиывание дампа данных: $DATA_DUMP_TAR_GZ_URL" curl -f -u $NEXUS_USER:$NEXUS_PASS -o "$DATA_DUMP_TAR_GZ_PATH" "$DATA_DUMP_TAR_GZ_URL" if [ $? -ne 0 ]; then echo "Ошибка при скачивании дампа данных" exit 1 fi echo "Дамп данных успешно загружен: $DATA_DUMP_TAR_GZ_PATH" .wait_for_postgres: &wait_for_postgres - | echo "Ожидание готовности PostgreSQL ($POSTGRES_HOST:$POSTGRES_PORT)..." for i in {1..30}; do if pg_isready -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" -U "$POSTGRES_USER"; then echo "PostgreSQL доступен." break fi echo "PostgreSQL не готов, ожидание... ($i/30)" sleep 5 done if [ $i -eq 30 ]; then echo "PostgreSQL не стал доступен за отведённое время." exit 1 fi .create_database: &create_database - | echo "Создание базы данных $POSTGRES_DB, если не существует..." PGPASSWORD=$POSTGRES_PASSWORD psql -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" -U "$POSTGRES_USER" \ -c "CREATE DATABASE \"$POSTGRES_DB\";" || echo "База данных $POSTGRES_DB уже существует." .apply_schema: &apply_schema - | echo "Применение схемы из $SCHEMA_SQL_PATH..." PGPASSWORD=$POSTGRES_PASSWORD psql -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" -U "$POSTGRES_USER" -d "$POSTGRES_DB" -f "$SCHEMA_SQL_PATH" echo "Схема успешно применена." .restore_data: &restore_data - | echo "Распаковка архива $DATA_DUMP_TAR_GZ_PATH в $DATA_DUMP_DIR..." tar -xzf "$DATA_DUMP_TAR_GZ_PATH" -C "$DATA_DUMP_DIR" DUMP_FILE=$(find "$DATA_DUMP_DIR" -type f -name "*.dump" -o -name "backup" | head -n1) if [ ! -f "$DUMP_FILE" ]; then echo "No найден файл дампа после распаковки." exit 1 fi echo "Найден дамп: $DUMP_FILE" echo "Восстановление данных из $DUMP_FILE в БД $POSTGRES_DB..." pg_restore -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" -U "$POSTGRES_USER" -d "$POSTGRES_DB" -v "$DUMP_FILE" echo "Данные успешно восстановлены." stages: - init_db init_db: stage: init_db before_script: - export PGPASSWORD=$POSTGRES_PASSWORD - export POSTGRES_HOST=$POSTGRES_HOST - export POSTGRES_PORT=$POSTGRES_PORT - export POSTGRES_USER=$POSTGRES_USER - export POSTGRES_DB=$POSTGRES_DB - export SCHEMA_SQL_URL=$SCHEMA_SQL_URL - export SCHEMA_SQL_PATH=$SCHEMA_SQL_PATH - export DATA_DUMP_TAR_GZ_URL=$DATA_DUMP_TAR_GZ_URL - export DATA_DUMP_TAR_GZ_PATH=$DATA_DUMP_TAR_GZ_PATH - export DATA_DUMP_DIR="/tmp/dump_data" - apk add --no-cache curl tar script: - *create_dump_dir - *download_schema # - *download_data - *wait_for_postgres - *create_database - *apply_schema # - *restore_data tags: - mmedo