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 ###