ترحيلات قاعدة البيانات
يستخدم 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
الفهارس الأساسية
| الجدول | الفهرس | النوع | الغرض |
|---|---|---|---|
alerts | idx_alerts_severity | B-tree | التصفية حسب الشدة |
alerts | idx_alerts_status | B-tree | التصفية حسب الحالة |
alerts | idx_alerts_created_at | B-tree | استعلامات النطاق الزمني |
alerts | idx_alerts_dedup_hash | B-tree | بحث إزالة التكرار |
cases | idx_cases_status | B-tree | التصفية حسب الحالة |
cases | idx_cases_severity | B-tree | التصفية حسب الشدة |
cps_devices | idx_cps_device_id | B-tree | البحث عن الجهاز |
cps_devices | idx_cps_attestation_status | B-tree | التصفية حسب attestation |
iocs | idx_iocs_type_value | B-tree (فريد) | إزالة التكرار + بحث سريع |
human_approvals | idx_approvals_status | B-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:
- نفّذ التعديل على النموذج:
class AlertModel(Base):
# ... existing columns ...
priority: Mapped[int] = mapped_column(Integer, default=3) # NEW
- ولّد الترحيل:
alembic revision --autogenerate -m "Add priority to alerts"
- راجع الترحيل المُولَّد (يتم توليده في
alembic/versions/):
def upgrade():
op.add_column('alerts', sa.Column('priority', sa.Integer(), nullable=True, default=3))
def downgrade():
op.drop_column('alerts', 'priority')
- طبّق الترحيل:
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.