CI & Build / Python lint (push) Successful in 2s
CI & Build / Plugin hooks (push) Successful in 12s
CI & Build / TypeScript typecheck (push) Successful in 32s
CI & Build / Python tests (push) Successful in 1m37s
CI & Build / integration (push) Successful in 2m7s
CI & Build / Build & push image (push) Successful in 22s
instance_identity is one row made by migration 0127 with a random id, so an instance has it before its first account. A full backup carries it in its header as instance_id (the tar manifest header and the JSON top level); BACKUP_VERSION is 28. The table rides in _NOT_INCLUDED: a restore decides from the header value rather than copying a row. Two stores with the same id number their rows the same way. That is what lets a later step roll a live instance back by original id, refuse a backup whose ids would land on unrelated rows, and have a fresh-instance restore adopt the backup's id (adopt_instance_id). Milestone 582, step 1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
"""instance identity — the id lineage a backup carries
|
|
|
|
Revision ID: 0127
|
|
Revises: 0126
|
|
Create Date: 2026-11-05
|
|
|
|
One row naming this database's id lineage. Every full backup carries it, a
|
|
restore into a fresh instance adopts it (the restore keeps the original ids),
|
|
and rolling a live instance back requires the backup's to match, so a backup's
|
|
ids never land on unrelated rows. Made here with a random value, so every
|
|
instance has one before its first account exists.
|
|
"""
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
revision = "0127"
|
|
down_revision = "0126"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.create_table(
|
|
"instance_identity",
|
|
sa.Column("id", sa.Integer(), primary_key=True),
|
|
sa.Column("instance_id", sa.Text(), nullable=False),
|
|
sa.Column(
|
|
"created_at", sa.DateTime(timezone=True), nullable=False,
|
|
server_default=sa.func.now(),
|
|
),
|
|
sa.CheckConstraint("id = 1", name="ck_instance_identity_single_row"),
|
|
)
|
|
op.execute(
|
|
"INSERT INTO instance_identity (id, instance_id) VALUES (1, gen_random_uuid()::text)"
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_table("instance_identity")
|