import enum from datetime import datetime from sqlalchemy import ( Column, Integer, String, Boolean, DateTime, ForeignKey, Enum, ) from sqlalchemy.orm import relationship from .database import Base class Role(str, enum.Enum): admin = "admin" client = "client" class GuestType(str, enum.Enum): vm = "vm" lxc = "lxc" class InstanceStatus(str, enum.Enum): creating = "creating" running = "running" stopped = "stopped" error = "error" deleting = "deleting" deleted = "deleted" class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) email = Column(String, unique=True, index=True, nullable=False) password_hash = Column(String, nullable=False) role = Column(Enum(Role), default=Role.client, nullable=False) is_active = Column(Boolean, default=True) created_at = Column(DateTime, default=datetime.utcnow) instances = relationship("Instance", back_populates="owner") class Template(Base): """Шаблон VPS: связывает тарифный план с исходным Proxmox-шаблоном (VM template / CT template).""" __tablename__ = "templates" id = Column(Integer, primary_key=True, index=True) name = Column(String, nullable=False) description = Column(String, default="") guest_type = Column(Enum(GuestType), nullable=False) # VMID шаблона в Proxmox, с которого делаем клон (для VM) или CT template volid (для LXC, напр. local:vztmpl/....tar.zst) source_vmid = Column(Integer, nullable=True) # для VM-шаблонов (клонирование) source_template = Column(String, nullable=True) # для LXC (путь к .tar.zst шаблону) cores = Column(Integer, default=1) memory_mb = Column(Integer, default=1024) disk_gb = Column(Integer, default=10) is_active = Column(Boolean, default=True) instances = relationship("Instance", back_populates="template") class Instance(Base): __tablename__ = "instances" id = Column(Integer, primary_key=True, index=True) name = Column(String, nullable=False) vmid = Column(Integer, unique=True, index=True, nullable=False) node = Column(String, nullable=False) guest_type = Column(Enum(GuestType), nullable=False) status = Column(Enum(InstanceStatus), default=InstanceStatus.creating) root_password = Column(String, nullable=True) ciuser = Column(String, nullable=True) # хранится только для LXC при создании, чтобы показать один раз owner_id = Column(Integer, ForeignKey("users.id")) template_id = Column(Integer, ForeignKey("templates.id")) created_at = Column(DateTime, default=datetime.utcnow) owner = relationship("User", back_populates="instances") template = relationship("Template", back_populates="instances")