按显卡世代和创世编号结算回本,机房批量接入需审核网段并用硬件指纹防克隆。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-10-11 00:30:46 +08:00
parent 7d29be8b17
commit 0740016ad8
22 changed files with 1554 additions and 96 deletions
+55 -1
View File
@@ -10,6 +10,7 @@ def upgrade_schema() -> None:
tables = set(inspector.get_table_names())
statements: list[str] = []
need_username_index = False
node_columns: set[str] = set()
if "users" in tables:
columns = {column["name"] for column in inspector.get_columns("users")}
if "username" not in columns:
@@ -26,13 +27,66 @@ def upgrade_schema() -> None:
statements.append(
"CREATE UNIQUE INDEX IF NOT EXISTS uq_compute_nodes_node_token ON compute_nodes (node_token)"
)
if not statements and not need_username_index:
if "gpu_model" not in node_columns:
statements.append("ALTER TABLE compute_nodes ADD COLUMN gpu_model VARCHAR(128)")
if "vram_gb" not in node_columns:
statements.append("ALTER TABLE compute_nodes ADD COLUMN vram_gb FLOAT")
if "cpu_count" not in node_columns:
statements.append("ALTER TABLE compute_nodes ADD COLUMN cpu_count INTEGER")
if "memory_gb" not in node_columns:
statements.append("ALTER TABLE compute_nodes ADD COLUMN memory_gb FLOAT")
if "hardware_weight" not in node_columns:
statements.append(
"ALTER TABLE compute_nodes ADD COLUMN hardware_weight FLOAT DEFAULT 0.05 NOT NULL"
)
if "gpu_generation" not in node_columns:
statements.append("ALTER TABLE compute_nodes ADD COLUMN gpu_generation VARCHAR(8) DEFAULT '10' NOT NULL")
if "recovery_days" not in node_columns:
statements.append("ALTER TABLE compute_nodes ADD COLUMN recovery_days INTEGER DEFAULT 540 NOT NULL")
if "generation_locked" not in node_columns:
statements.append("ALTER TABLE compute_nodes ADD COLUMN generation_locked BOOLEAN DEFAULT 0 NOT NULL")
if "recoverable_stake_amount" not in node_columns:
statements.append("ALTER TABLE compute_nodes ADD COLUMN recoverable_stake_amount NUMERIC(24, 8)")
if "node_index" not in node_columns:
statements.append("ALTER TABLE compute_nodes ADD COLUMN node_index INTEGER")
if "is_whitelist" not in node_columns:
statements.append(
"ALTER TABLE compute_nodes ADD COLUMN is_whitelist BOOLEAN DEFAULT 0 NOT NULL"
)
if "client_ip" not in node_columns:
statements.append("ALTER TABLE compute_nodes ADD COLUMN client_ip VARCHAR(64)")
statements.append(
"CREATE INDEX IF NOT EXISTS ix_compute_nodes_client_ip ON compute_nodes (client_ip)"
)
if "hardware_fingerprint" not in node_columns:
statements.append("ALTER TABLE compute_nodes ADD COLUMN hardware_fingerprint VARCHAR(64)")
statements.append(
"CREATE UNIQUE INDEX IF NOT EXISTS uq_compute_nodes_hardware_fingerprint "
"ON compute_nodes (hardware_fingerprint)"
)
index_ready = "compute_nodes" in tables and ("node_index" in node_columns or any("node_index" in item for item in statements))
if not statements and not need_username_index and not index_ready:
return
with engine.begin() as conn:
for statement in statements:
conn.execute(text(statement))
if need_username_index:
conn.execute(text("CREATE UNIQUE INDEX IF NOT EXISTS uq_users_username ON users (username)"))
if index_ready:
_backfill_node_index(conn, "recovery_days" in node_columns or any("recovery_days" in item for item in statements))
def _backfill_node_index(conn, has_recovery: bool) -> None:
missing = conn.execute(text("SELECT id FROM compute_nodes WHERE node_index IS NULL ORDER BY id")).all()
start = conn.execute(text("SELECT COALESCE(MAX(node_index), 0) FROM compute_nodes")).scalar() or 0
for offset, (row_id,) in enumerate(missing, start=1):
conn.execute(
text("UPDATE compute_nodes SET node_index = :index WHERE id = :id"),
{"index": int(start) + offset, "id": row_id},
)
conn.execute(text("CREATE UNIQUE INDEX IF NOT EXISTS uq_compute_nodes_node_index ON compute_nodes (node_index)"))
if has_recovery:
conn.execute(text("UPDATE compute_nodes SET recovery_days = 30 WHERE node_index BETWEEN 1 AND 20"))
def _has_username_index(inspector) -> bool: