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 nodestable = 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.bulk_insert(nodestable, [{"name": "local", "address": "127.0.0.1", "port": 53042, "connection_backend": "grpcio", "status": "unhealthy"}])
60 op.create_table('services',
61 sa.Column('id', sa.Integer(), nullable=False),
62 sa.Column('name', sa.String(length=64), nullable=True),
63 sa.PrimaryKeyConstraint('id')
64 )
65
66 systable = op.create_table('system',
67 sa.Column('id', sa.Integer(), nullable=False),
68 sa.Column('uplink', sa.BigInteger(), nullable=True),
69 sa.Column('downlink', sa.BigInteger(), nullable=True),
70 sa.PrimaryKeyConstraint('id')
71 )
72 op.bulk_insert(systable, [{"id": 1, "uplink": 0, "downlink": 0}])
73
74 tlstable = op.create_table('tls',
75 sa.Column('id', sa.Integer(), nullable=False),
76 sa.Column('key', sa.String(length=4096), nullable=False),
77 sa.Column('certificate', sa.String(length=2048), nullable=False),
78 sa.PrimaryKeyConstraint('id')
79 )
80 tls = generate_certificate()
81 op.bulk_insert(tlstable, [{"id": 1, "key": tls['key'], "certificate": tls['cert']}])
82
83 op.create_table('inbounds',
84 sa.Column('id', sa.Integer(), nullable=False),
85 sa.Column('protocol', sa.Enum('VMess', 'VLESS', 'Trojan', 'Shadowsocks', name='proxytypes'), nullable=True),
86 sa.Column('tag', sa.String(length=256), nullable=False),
87 sa.Column('config', sa.String(), nullable=False),
88 sa.Column('node_id', sa.Integer(), nullable=True),
89 sa.ForeignKeyConstraint(['node_id'], ['nodes.id'], ),
90 sa.PrimaryKeyConstraint('id'),
91 sa.UniqueConstraint("node_id", "tag")
92 )
93 op.create_index(op.f('ix_inbounds_node_id'), 'inbounds', ['node_id'], unique=False)
94 op.create_table('node_usages',
95 sa.Column('id', sa.Integer(), nullable=False),
96 sa.Column('created_at', sa.DateTime(), nullable=False),
97 sa.Column('node_id', sa.Integer(), nullable=True),
98 sa.Column('uplink', sa.BigInteger(), nullable=True),
99 sa.Column('downlink', sa.BigInteger(), nullable=True),
100 sa.ForeignKeyConstraint(['node_id'], ['nodes.id'], ),
101 sa.PrimaryKeyConstraint('id'),
102 sa.UniqueConstraint('created_at', 'node_id')
103 )
104 op.create_table('users',
105 sa.Column('id', sa.Integer(), nullable=False),
106 sa.Column('username', sa.String(length=32), nullable=True),
107 sa.Column('key', sa.String(length=64), nullable=True),
108 sa.Column('status', sa.Enum('active', 'disabled', 'limited', 'expired', 'on_hold', name='userstatus'), nullable=False),
109 sa.Column('used_traffic', sa.BigInteger(), nullable=True),
110 sa.Column('data_limit', sa.BigInteger(), nullable=True),
111 sa.Column('data_limit_reset_strategy', sa.Enum('no_reset', 'day', 'week', 'month', 'year', name='userdatalimitresetstrategy'), nullable=False),
112 sa.Column('ip_limit', sa.Integer(), nullable=False),
113 sa.Column('settings', sa.String(), nullable=True),
114 sa.Column('expire', sa.Integer(), nullable=True),
115 sa.Column('admin_id', sa.Integer(), nullable=True),
116 sa.Column('sub_updated_at', sa.DateTime(), nullable=True),
117 sa.Column('sub_last_user_agent', sa.String(length=512), nullable=True),
118 sa.Column('created_at', sa.DateTime(), nullable=True),
119 sa.Column('note', sa.String(length=500), nullable=True),
120 sa.Column('online_at', sa.DateTime(), nullable=True),
121 sa.Column('on_hold_expire_duration', sa.BigInteger(), nullable=True),
122 sa.Column('on_hold_timeout', sa.DateTime(), nullable=True),
123 sa.Column('edit_at', sa.DateTime(), nullable=True),
124 sa.ForeignKeyConstraint(['admin_id'], ['admins.id'], ),
125 sa.PrimaryKeyConstraint('id'),
126 sa.UniqueConstraint('key')
127 )
128 op.create_index(op.f('ix_users_username'), 'users', ['username'], unique=True)
129 op.create_table('hosts',
130 sa.Column('id', sa.Integer(), nullable=False),
131 sa.Column('remark', sa.String(length=256), nullable=False),
132 sa.Column('address', sa.String(length=256), nullable=False),
133 sa.Column('port', sa.Integer(), nullable=True),
134 sa.Column('path', sa.String(length=256), nullable=True),
135 sa.Column('sni', sa.String(length=256), nullable=True),
136 sa.Column('host', sa.String(length=256), nullable=True),
137 sa.Column('security', sa.Enum('inbound_default', 'none', 'tls', name='inboundhostsecurity'), nullable=False),
138 sa.Column('alpn', sa.Enum('none', 'h2', 'http/1.1', 'h2,http/1.1', name='proxyhostalpn'), server_default='none', nullable=False),
139 sa.Column('fingerprint', sa.Enum('none', 'chrome', 'firefox', 'safari', 'ios', 'android', 'edge', '360', 'qq', 'random', 'randomized', name='proxyhostfingerprint'), server_default='none', nullable=False),
140 sa.Column('inbound_id', sa.Integer(), nullable=False),
141 sa.Column('allowinsecure', sa.Boolean(), nullable=True),
142 sa.Column('is_disabled', sa.Boolean(), nullable=True),
143 sa.ForeignKeyConstraint(['inbound_id'], ['inbounds.id'], ),
144 sa.PrimaryKeyConstraint('id')
145 )
146 op.create_table('inbounds_services',
147 sa.Column('inbound_id', sa.Integer(), nullable=False),
148 sa.Column('service_id', sa.Integer(), nullable=False),
149 sa.ForeignKeyConstraint(['inbound_id'], ['inbounds.id'], ),
150 sa.ForeignKeyConstraint(['service_id'], ['services.id'], ),
151 sa.PrimaryKeyConstraint('inbound_id', 'service_id')
152 )
153 op.create_table('node_user_usages',
154 sa.Column('id', sa.Integer(), nullable=False),
155 sa.Column('created_at', sa.DateTime(), nullable=False),
156 sa.Column('user_id', sa.Integer(), nullable=True),
157 sa.Column('node_id', sa.Integer(), nullable=True),
158 sa.Column('used_traffic', sa.BigInteger(), nullable=True),
159 sa.ForeignKeyConstraint(['node_id'], ['nodes.id'], ),
160 sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
161 sa.PrimaryKeyConstraint('id'),
162 sa.UniqueConstraint('created_at', 'user_id', 'node_id')
163 )
164 op.create_table('notification_reminders',
165 sa.Column('id', sa.Integer(), nullable=False),
166 sa.Column('user_id', sa.Integer(), nullable=True),
167 sa.Column('type', sa.Enum('expiration_date', 'data_usage', name='remindertype'), nullable=False),
168 sa.Column('expires_at', sa.DateTime(), nullable=True),
169 sa.Column('created_at', sa.DateTime(), nullable=True),
170 sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
171 sa.PrimaryKeyConstraint('id')
172 )
173 op.create_table('user_usage_logs',
174 sa.Column('id', sa.Integer(), nullable=False),
175 sa.Column('user_id', sa.Integer(), nullable=True),
176 sa.Column('used_traffic_at_reset', sa.BigInteger(), nullable=False),
177 sa.Column('reset_at', sa.DateTime(), nullable=True),
178 sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
179 sa.PrimaryKeyConstraint('id')
180 )
181 op.create_table('users_services',
182 sa.Column('user_id', sa.Integer(), nullable=False),
183 sa.Column('service_id', sa.Integer(), nullable=False),
184 sa.ForeignKeyConstraint(['service_id'], ['services.id'], ),
185 sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
186 sa.PrimaryKeyConstraint('user_id', 'service_id')
187 )
188 # ### end Alembic commands ###
189
190
191def downgrade() -> None:
192 # ### commands auto generated by Alembic - please adjust! ###
193 op.drop_table('users_services')
194 op.drop_table('user_usage_logs')
195 op.drop_table('notification_reminders')
196 op.drop_table('node_user_usages')
197 op.drop_table('inbounds_services')
198 op.drop_table('hosts')
199 op.drop_index(op.f('ix_users_username'), table_name='users')
200 op.drop_table('users')
201 op.drop_table('node_usages')
202 op.drop_index(op.f('ix_inbounds_node_id'), table_name='inbounds')
203 op.drop_table('inbounds')
204 op.drop_table('tls')
205 op.drop_table('system')
206 op.drop_table('services')
207 op.drop_table('nodes')
208 op.drop_table('jwt')
209 op.drop_index(op.f('ix_admins_username'), table_name='admins')
210 op.drop_table('admins')
211 # ### end Alembic commands ###