انتقل إلى المحتوى الرئيسي

ترحيلات قاعدة البيانات

يستخدم AuroraSOC أداة Alembic لترحيلات مخطط PostgreSQL، مع تكامل مع نماذج SQLAlchemy 2.0 async.

الإعداد

إعداد Alembic (alembic.ini)

[alembic]
script_location = alembic
sqlalchemy.url = postgresql+asyncpg://aurora:aurora@localhost:5432/aurorasoc

بيئة الترحيلات (alembic/env.py)

from aurorasoc.core.models import Base

target_metadata = Base.metadata

def run_migrations_online():
connectable = create_async_engine(config.get_main_option("sqlalchemy.url"))

async def do_run():
async with connectable.connect() as connection:
await connection.run_sync(do_run_migrations)

asyncio.run(do_run())

المخطط الأولي (001_initial_schema.py)

ينشئ الترحيل الأولي جميع الجداول الأحد عشر:

امتدادات PostgreSQL

CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- UUID generation
CREATE EXTENSION IF NOT EXISTS "pg_trgm"; -- Trigram similarity for IOC search

الفهارس الأساسية

الجدولالفهرسالنوعالغرض
alertsidx_alerts_severityB-treeالتصفية حسب الشدة
alertsidx_alerts_statusB-treeالتصفية حسب الحالة
alertsidx_alerts_created_atB-treeاستعلامات النطاق الزمني
alertsidx_alerts_dedup_hashB-treeبحث إزالة التكرار
casesidx_cases_statusB-treeالتصفية حسب الحالة
casesidx_cases_severityB-treeالتصفية حسب الشدة
cps_devicesidx_cps_device_idB-treeالبحث عن الجهاز
cps_devicesidx_cps_attestation_statusB-treeالتصفية حسب attestation
iocsidx_iocs_type_valueB-tree (فريد)إزالة التكرار + بحث سريع
human_approvalsidx_approvals_statusB-treeتصفية الموافقات المعلقة

مُشغّل التحديث التلقائي

CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ language 'plpgsql';

-- Applied to all tables with updated_at columns
CREATE TRIGGER update_alerts_updated_at
BEFORE UPDATE ON alerts
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();

أوامر الترحيل

# Generate auto-migration from model changes
alembic revision --autogenerate -m "Description of change"

# Apply all pending migrations
alembic upgrade head

# Rollback one migration
alembic downgrade -1

# Rollback to specific revision
alembic downgrade 001

# Show current migration state
alembic current

# Show migration history
alembic history --verbose

إنشاء ترحيلات جديدة

عند تعديل نماذج SQLAlchemy في aurorasoc/core/models.py:

  1. نفّذ التعديل على النموذج:
class AlertModel(Base):
# ... existing columns ...
priority: Mapped[int] = mapped_column(Integer, default=3) # NEW
  1. ولّد الترحيل:
alembic revision --autogenerate -m "Add priority to alerts"
  1. راجع الترحيل المُولَّد (يتم توليده في alembic/versions/):
def upgrade():
op.add_column('alerts', sa.Column('priority', sa.Integer(), nullable=True, default=3))

def downgrade():
op.drop_column('alerts', 'priority')
  1. طبّق الترحيل:
alembic upgrade head

تكامل Docker

في Docker Compose، تعمل الترحيلات تلقائيًا عند إقلاع API:

# aurorasoc/core/database.py
async def init_db():
engine = create_async_engine(settings.postgres.url)
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)

لنشر الإنتاج، استخدم أوامر Alembic الصريحة:

# docker-compose.yml
api:
command: >
sh -c "alembic upgrade head && uvicorn aurorasoc.api.main:app --host 0.0.0.0"

أنماط ترحيل JSONB

أعمدة JSONB لا تتطلب ترحيلًا لتغييرات المخطط داخل بنية JSON. إضافة مفتاح جديد إلى حقل context في IOC تعمل مباشرة:

# Before: {"source": "virustotal"}
# After: {"source": "virustotal", "confidence": 0.9}
# No migration needed — JSONB is schema-less

ولهذا يستخدم AuroraSOC النوع JSONB للحقول المرنة مثل iocs وmitre_techniques وmetadata وcontext.