gitscope
← marzneshin / v0.2.0 / app/db/migrations/versions/20faa9f18c0a_init.py
https://dev.kronoz.win/r/marzneshin.git
app/db/migrations/versions/20faa9f18c0a_init.py · Python
Blame Raw
  1"""Initiate Marzneshin database
  2
  3Revision ID: 20faa9f18c0a
  4Revises:
  5Create Date: 2024-01-15 09:48:24.808505
  6
  7"""
  8
  9import os
 10from alembic import op
 11import sqlalchemy as sa
 12from app.utils.crypto import generate_certificate
 13
 14# revision identifiers, used by Alembic.
 15revision = '20faa9f18c0a'
 16down_revision = None
 17branch_labels = None
 18depends_on = None
 19
 20
 21def upgrade() -> None:
 22    # ### commands auto generated by Alembic - please adjust! ###
 23    op.create_table('admins',
 24    sa.Column('id', sa.Integer(), nullable=False),
 25    sa.Column('username', sa.String(length=32), nullable=True),
 26    sa.Column('hashed_password', sa.String(length=128), nullable=True),
 27    sa.Column('created_at', sa.DateTime(), nullable=True),
 28    sa.Column('is_sudo', sa.Boolean(), nullable=True),
 29    sa.Column('password_reset_at', sa.DateTime(), nullable=True),
 30    sa.PrimaryKeyConstraint('id')
 31    )
 32    op.create_index(op.f('ix_admins_username'), 'admins', ['username'], unique=True)
 33    
 34    jwttable = op.create_table('jwt',
 35    sa.Column('id', sa.Integer(), nullable=False),
 36    sa.Column('secret_key', sa.String(length=64), nullable=False),
 37    sa.PrimaryKeyConstraint('id')
 38    )
 39    op.bulk_insert(jwttable, [{"id": 1, "secret_key": os.urandom(32).hex()}])
 40
 41    op.create_table('nodes',
 42    sa.Column('id', sa.Integer(), nullable=False),
 43    sa.Column('name', sa.String(length=256), nullable=True),
 44    sa.Column('address', sa.String(length=256), nullable=True),
 45    sa.Column('port', sa.Integer(), nullable=True),
 46    sa.Column('connection_backend', sa.String(), nullable=True),
 47    sa.Column('xray_version', sa.String(length=32), nullable=True),
 48    sa.Column('status', sa.Enum('healthy', 'unhealthy', 'disabled', name='nodestatus'), nullable=False),
 49    sa.Column('last_status_change', sa.DateTime(), nullable=True),
 50    sa.Column('message', sa.String(length=1024), nullable=True),
 51    sa.Column('created_at', sa.DateTime(), nullable=True),
 52    sa.Column('uplink', sa.BigInteger(), nullable=True),
 53    sa.Column('downlink', sa.BigInteger(), nullable=True),
 54    sa.Column('usage_coefficient', sa.Float(), server_default=sa.text('(1.0)'), nullable=False),
 55    sa.PrimaryKeyConstraint('id'),
 56    sa.UniqueConstraint('name'),
 57    sa.UniqueConstraint('address', 'port')
 58    )
 59    op.create_table('services',
 60    sa.Column('id', sa.Integer(), nullable=False),
 61    sa.Column('name', sa.String(length=64), nullable=True),
 62    sa.PrimaryKeyConstraint('id')
 63    )
 64
 65    systable = op.create_table('system',
 66    sa.Column('id', sa.Integer(), nullable=False),
 67    sa.Column('uplink', sa.BigInteger(), nullable=True),
 68    sa.Column('downlink', sa.BigInteger(), nullable=True),
 69    sa.PrimaryKeyConstraint('id')
 70    )
 71    op.bulk_insert(systable, [{"id": 1, "uplink": 0, "downlink": 0}])
 72
 73    tlstable = op.create_table('tls',
 74    sa.Column('id', sa.Integer(), nullable=False),
 75    sa.Column('key', sa.String(length=4096), nullable=False),
 76    sa.Column('certificate', sa.String(length=2048), nullable=False),
 77    sa.PrimaryKeyConstraint('id')
 78    )
 79    tls = generate_certificate()
 80    op.bulk_insert(tlstable, [{"id": 1, "key": tls['key'], "certificate": tls['cert']}])
 81
 82    op.create_table('inbounds',
 83    sa.Column('id', sa.Integer(), nullable=False),
 84    sa.Column('protocol', sa.Enum('VMess', 'VLESS', 'Trojan', 'Shadowsocks', name='proxytypes'), nullable=True),
 85    sa.Column('tag', sa.String(length=256), nullable=False),
 86    sa.Column('config', sa.String(), nullable=False),
 87    sa.Column('node_id', sa.Integer(), nullable=True),
 88    sa.ForeignKeyConstraint(['node_id'], ['nodes.id'], ),
 89    sa.PrimaryKeyConstraint('id'),
 90    sa.UniqueConstraint("node_id", "tag")
 91    )
 92    op.create_index(op.f('ix_inbounds_node_id'), 'inbounds', ['node_id'], unique=False)
 93    op.create_table('node_usages',
 94    sa.Column('id', sa.Integer(), nullable=False),
 95    sa.Column('created_at', sa.DateTime(), nullable=False),
 96    sa.Column('node_id', sa.Integer(), nullable=True),
 97    sa.Column('uplink', sa.BigInteger(), nullable=True),
 98    sa.Column('downlink', sa.BigInteger(), nullable=True),
 99    sa.ForeignKeyConstraint(['node_id'], ['nodes.id'], ),
100    sa.PrimaryKeyConstraint('id'),
101    sa.UniqueConstraint('created_at', 'node_id')
102    )
103    op.create_table('users',
104    sa.Column('id', sa.Integer(), nullable=False),
105    sa.Column('username', sa.String(length=32), nullable=True),
106    sa.Column('key', sa.String(length=64), nullable=True),
107    sa.Column('status', sa.Enum('active', 'disabled', 'limited', 'expired', 'on_hold', name='userstatus'), nullable=False),
108    sa.Column('used_traffic', sa.BigInteger(), nullable=True),
109    sa.Column('data_limit', sa.BigInteger(), nullable=True),
110    sa.Column('data_limit_reset_strategy', sa.Enum('no_reset', 'day', 'week', 'month', 'year', name='userdatalimitresetstrategy'), nullable=False),
111    sa.Column('ip_limit', sa.Integer(), nullable=False),
112    sa.Column('settings', sa.String(), nullable=True),
113    sa.Column('expire', sa.Integer(), nullable=True),
114    sa.Column('admin_id', sa.Integer(), nullable=True),
115    sa.Column('sub_updated_at', sa.DateTime(), nullable=True),
116    sa.Column('sub_last_user_agent', sa.String(length=512), nullable=True),
117    sa.Column('created_at', sa.DateTime(), nullable=True),
118    sa.Column('note', sa.String(length=500), nullable=True),
119    sa.Column('online_at', sa.DateTime(), nullable=True),
120    sa.Column('on_hold_expire_duration', sa.BigInteger(), nullable=True),
121    sa.Column('on_hold_timeout', sa.DateTime(), nullable=True),
122    sa.Column('edit_at', sa.DateTime(), nullable=True),
123    sa.ForeignKeyConstraint(['admin_id'], ['admins.id'], ),
124    sa.PrimaryKeyConstraint('id'),
125    sa.UniqueConstraint('key')
126    )
127    op.create_index(op.f('ix_users_username'), 'users', ['username'], unique=True)
128    op.create_table('hosts',
129    sa.Column('id', sa.Integer(), nullable=False),
130    sa.Column('remark', sa.String(length=256), nullable=False),
131    sa.Column('address', sa.String(length=256), nullable=False),
132    sa.Column('port', sa.Integer(), nullable=True),
133    sa.Column('path', sa.String(length=256), nullable=True),
134    sa.Column('sni', sa.String(length=256), nullable=True),
135    sa.Column('host', sa.String(length=256), nullable=True),
136    sa.Column('security', sa.Enum('inbound_default', 'none', 'tls', name='inboundhostsecurity'), nullable=False),
137    sa.Column('alpn', sa.Enum('none', 'h2', 'http/1.1', 'h2,http/1.1', name='proxyhostalpn'), server_default='none', nullable=False),
138    sa.Column('fingerprint', sa.Enum('none', 'chrome', 'firefox', 'safari', 'ios', 'android', 'edge', '360', 'qq', 'random', 'randomized', name='proxyhostfingerprint'), server_default='none', nullable=False),
139    sa.Column('inbound_id', sa.Integer(), nullable=False),
140    sa.Column('allowinsecure', sa.Boolean(), nullable=True),
141    sa.Column('is_disabled', sa.Boolean(), nullable=True),
142    sa.ForeignKeyConstraint(['inbound_id'], ['inbounds.id'], ),
143    sa.PrimaryKeyConstraint('id')
144    )
145    op.create_table('inbounds_services',
146    sa.Column('inbound_id', sa.Integer(), nullable=False),
147    sa.Column('service_id', sa.Integer(), nullable=False),
148    sa.ForeignKeyConstraint(['inbound_id'], ['inbounds.id'], ),
149    sa.ForeignKeyConstraint(['service_id'], ['services.id'], ),
150    sa.PrimaryKeyConstraint('inbound_id', 'service_id')
151    )
152    op.create_table('node_user_usages',
153    sa.Column('id', sa.Integer(), nullable=False),
154    sa.Column('created_at', sa.DateTime(), nullable=False),
155    sa.Column('user_id', sa.Integer(), nullable=True),
156    sa.Column('node_id', sa.Integer(), nullable=True),
157    sa.Column('used_traffic', sa.BigInteger(), nullable=True),
158    sa.ForeignKeyConstraint(['node_id'], ['nodes.id'], ),
159    sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
160    sa.PrimaryKeyConstraint('id'),
161    sa.UniqueConstraint('created_at', 'user_id', 'node_id')
162    )
163    op.create_table('notification_reminders',
164    sa.Column('id', sa.Integer(), nullable=False),
165    sa.Column('user_id', sa.Integer(), nullable=True),
166    sa.Column('type', sa.Enum('expiration_date', 'data_usage', name='remindertype'), nullable=False),
167    sa.Column('expires_at', sa.DateTime(), nullable=True),
168    sa.Column('created_at', sa.DateTime(), nullable=True),
169    sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
170    sa.PrimaryKeyConstraint('id')
171    )
172    op.create_table('user_usage_logs',
173    sa.Column('id', sa.Integer(), nullable=False),
174    sa.Column('user_id', sa.Integer(), nullable=True),
175    sa.Column('used_traffic_at_reset', sa.BigInteger(), nullable=False),
176    sa.Column('reset_at', sa.DateTime(), nullable=True),
177    sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
178    sa.PrimaryKeyConstraint('id')
179    )
180    op.create_table('users_services',
181    sa.Column('user_id', sa.Integer(), nullable=False),
182    sa.Column('service_id', sa.Integer(), nullable=False),
183    sa.ForeignKeyConstraint(['service_id'], ['services.id'], ),
184    sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
185    sa.PrimaryKeyConstraint('user_id', 'service_id')
186    )
187    # ### end Alembic commands ###
188
189
190def downgrade() -> None:
191    # ### commands auto generated by Alembic - please adjust! ###
192    op.drop_table('users_services')
193    op.drop_table('user_usage_logs')
194    op.drop_table('notification_reminders')
195    op.drop_table('node_user_usages')
196    op.drop_table('inbounds_services')
197    op.drop_table('hosts')
198    op.drop_index(op.f('ix_users_username'), table_name='users')
199    op.drop_table('users')
200    op.drop_table('node_usages')
201    op.drop_index(op.f('ix_inbounds_node_id'), table_name='inbounds')
202    op.drop_table('inbounds')
203    op.drop_table('tls')
204    op.drop_table('system')
205    op.drop_table('services')
206    op.drop_table('nodes')
207    op.drop_table('jwt')
208    op.drop_index(op.f('ix_admins_username'), table_name='admins')
209    op.drop_table('admins')
210    # ### end Alembic commands ###