@stacksjs/ts-cloud 0.1.3 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -13
- package/dist/aws/acm.d.ts +129 -0
- package/dist/aws/application-autoscaling.d.ts +282 -0
- package/dist/aws/bedrock.d.ts +2292 -0
- package/dist/aws/client.d.ts +79 -0
- package/dist/aws/cloudformation.d.ts +105 -0
- package/dist/aws/cloudfront.d.ts +265 -0
- package/dist/aws/cloudwatch-logs.d.ts +48 -0
- package/dist/aws/comprehend.d.ts +505 -0
- package/dist/aws/connect.d.ts +377 -0
- package/dist/aws/deploy-imap.d.ts +14 -0
- package/dist/aws/dynamodb.d.ts +176 -0
- package/dist/aws/ec2.d.ts +272 -0
- package/dist/aws/ecr.d.ts +149 -0
- package/dist/aws/ecs.d.ts +162 -0
- package/dist/aws/elasticache.d.ts +71 -0
- package/dist/aws/elbv2.d.ts +248 -0
- package/dist/aws/email.d.ts +175 -0
- package/dist/aws/eventbridge.d.ts +142 -0
- package/dist/aws/iam.d.ts +638 -0
- package/dist/aws/imap-server.d.ts +119 -0
- package/{src/aws/index.ts → dist/aws/index.d.ts} +62 -83
- package/{src/aws/kendra.ts → dist/aws/kendra.d.ts} +71 -386
- package/dist/aws/lambda.d.ts +232 -0
- package/dist/aws/opensearch.d.ts +87 -0
- package/dist/aws/personalize.d.ts +516 -0
- package/dist/aws/polly.d.ts +214 -0
- package/dist/aws/rds.d.ts +240 -0
- package/dist/aws/rekognition.d.ts +543 -0
- package/dist/aws/route53-domains.d.ts +113 -0
- package/dist/aws/route53.d.ts +215 -0
- package/dist/aws/s3.d.ts +212 -0
- package/dist/aws/scheduler.d.ts +140 -0
- package/dist/aws/secrets-manager.d.ts +170 -0
- package/dist/aws/ses.d.ts +288 -0
- package/dist/aws/setup-phone.d.ts +0 -0
- package/dist/aws/setup-sms.d.ts +115 -0
- package/dist/aws/sms.d.ts +304 -0
- package/dist/aws/smtp-server.d.ts +61 -0
- package/dist/aws/sns.d.ts +117 -0
- package/dist/aws/sqs.d.ts +65 -0
- package/dist/aws/ssm.d.ts +179 -0
- package/dist/aws/sts.d.ts +15 -0
- package/dist/aws/support.d.ts +104 -0
- package/dist/aws/test-imap.d.ts +0 -0
- package/dist/aws/textract.d.ts +403 -0
- package/dist/aws/transcribe.d.ts +60 -0
- package/dist/aws/translate.d.ts +358 -0
- package/dist/aws/voice.d.ts +219 -0
- package/dist/bin/cli.js +1724 -0
- package/dist/config.d.ts +7 -0
- package/dist/deploy/index.d.ts +2 -0
- package/dist/deploy/static-site-external-dns.d.ts +51 -0
- package/dist/deploy/static-site.d.ts +71 -0
- package/dist/dns/cloudflare.d.ts +52 -0
- package/dist/dns/godaddy.d.ts +38 -0
- package/dist/dns/index.d.ts +45 -0
- package/dist/dns/porkbun.d.ts +18 -0
- package/dist/dns/route53-adapter.d.ts +38 -0
- package/{src/dns/types.ts → dist/dns/types.d.ts} +26 -63
- package/dist/dns/validator.d.ts +78 -0
- package/dist/generators/index.d.ts +1 -0
- package/dist/generators/infrastructure.d.ts +30 -0
- package/{src/index.ts → dist/index.d.ts} +70 -93
- package/dist/index.js +7881 -0
- package/dist/push/apns.d.ts +60 -0
- package/dist/push/fcm.d.ts +117 -0
- package/dist/push/index.d.ts +14 -0
- package/dist/security/pre-deploy-scanner.d.ts +69 -0
- package/dist/ssl/acme-client.d.ts +67 -0
- package/dist/ssl/index.d.ts +2 -0
- package/dist/ssl/letsencrypt.d.ts +48 -0
- package/dist/types.d.ts +1 -0
- package/dist/utils/cli.d.ts +123 -0
- package/dist/validation/index.d.ts +1 -0
- package/dist/validation/template.d.ts +23 -0
- package/package.json +8 -8
- package/bin/cli.ts +0 -133
- package/bin/commands/analytics.ts +0 -328
- package/bin/commands/api.ts +0 -379
- package/bin/commands/assets.ts +0 -221
- package/bin/commands/audit.ts +0 -501
- package/bin/commands/backup.ts +0 -682
- package/bin/commands/cache.ts +0 -294
- package/bin/commands/cdn.ts +0 -281
- package/bin/commands/config.ts +0 -202
- package/bin/commands/container.ts +0 -105
- package/bin/commands/cost.ts +0 -208
- package/bin/commands/database.ts +0 -401
- package/bin/commands/deploy.ts +0 -674
- package/bin/commands/domain.ts +0 -397
- package/bin/commands/email.ts +0 -423
- package/bin/commands/environment.ts +0 -285
- package/bin/commands/events.ts +0 -424
- package/bin/commands/firewall.ts +0 -145
- package/bin/commands/function.ts +0 -116
- package/bin/commands/generate.ts +0 -280
- package/bin/commands/git.ts +0 -139
- package/bin/commands/iam.ts +0 -464
- package/bin/commands/index.ts +0 -48
- package/bin/commands/init.ts +0 -120
- package/bin/commands/logs.ts +0 -148
- package/bin/commands/network.ts +0 -579
- package/bin/commands/notify.ts +0 -489
- package/bin/commands/queue.ts +0 -407
- package/bin/commands/scheduler.ts +0 -370
- package/bin/commands/secrets.ts +0 -54
- package/bin/commands/server.ts +0 -629
- package/bin/commands/shared.ts +0 -97
- package/bin/commands/ssl.ts +0 -138
- package/bin/commands/stack.ts +0 -325
- package/bin/commands/status.ts +0 -385
- package/bin/commands/storage.ts +0 -450
- package/bin/commands/team.ts +0 -96
- package/bin/commands/tunnel.ts +0 -489
- package/bin/commands/utils.ts +0 -202
- package/build.ts +0 -15
- package/cloud +0 -2
- package/src/aws/acm.ts +0 -768
- package/src/aws/application-autoscaling.ts +0 -845
- package/src/aws/bedrock.ts +0 -4074
- package/src/aws/client.ts +0 -878
- package/src/aws/cloudformation.ts +0 -896
- package/src/aws/cloudfront.ts +0 -1531
- package/src/aws/cloudwatch-logs.ts +0 -154
- package/src/aws/comprehend.ts +0 -839
- package/src/aws/connect.ts +0 -1056
- package/src/aws/deploy-imap.ts +0 -384
- package/src/aws/dynamodb.ts +0 -340
- package/src/aws/ec2.ts +0 -1385
- package/src/aws/ecr.ts +0 -621
- package/src/aws/ecs.ts +0 -615
- package/src/aws/elasticache.ts +0 -301
- package/src/aws/elbv2.ts +0 -942
- package/src/aws/email.ts +0 -928
- package/src/aws/eventbridge.ts +0 -248
- package/src/aws/iam.ts +0 -1689
- package/src/aws/imap-server.ts +0 -2100
- package/src/aws/lambda.ts +0 -786
- package/src/aws/opensearch.ts +0 -158
- package/src/aws/personalize.ts +0 -977
- package/src/aws/polly.ts +0 -559
- package/src/aws/rds.ts +0 -888
- package/src/aws/rekognition.ts +0 -846
- package/src/aws/route53-domains.ts +0 -359
- package/src/aws/route53.ts +0 -1046
- package/src/aws/s3.ts +0 -2318
- package/src/aws/scheduler.ts +0 -571
- package/src/aws/secrets-manager.ts +0 -769
- package/src/aws/ses.ts +0 -1081
- package/src/aws/setup-phone.ts +0 -104
- package/src/aws/setup-sms.ts +0 -580
- package/src/aws/sms.ts +0 -1735
- package/src/aws/smtp-server.ts +0 -531
- package/src/aws/sns.ts +0 -758
- package/src/aws/sqs.ts +0 -382
- package/src/aws/ssm.ts +0 -807
- package/src/aws/sts.ts +0 -92
- package/src/aws/support.ts +0 -391
- package/src/aws/test-imap.ts +0 -86
- package/src/aws/textract.ts +0 -780
- package/src/aws/transcribe.ts +0 -108
- package/src/aws/translate.ts +0 -641
- package/src/aws/voice.ts +0 -1379
- package/src/config.ts +0 -35
- package/src/deploy/index.ts +0 -7
- package/src/deploy/static-site-external-dns.ts +0 -906
- package/src/deploy/static-site.ts +0 -1125
- package/src/dns/godaddy.ts +0 -412
- package/src/dns/index.ts +0 -183
- package/src/dns/porkbun.ts +0 -362
- package/src/dns/route53-adapter.ts +0 -414
- package/src/dns/validator.ts +0 -369
- package/src/generators/index.ts +0 -5
- package/src/generators/infrastructure.ts +0 -1660
- package/src/push/apns.ts +0 -452
- package/src/push/fcm.ts +0 -506
- package/src/push/index.ts +0 -58
- package/src/ssl/acme-client.ts +0 -478
- package/src/ssl/index.ts +0 -7
- package/src/ssl/letsencrypt.ts +0 -747
- package/src/types.ts +0 -2
- package/src/utils/cli.ts +0 -398
- package/src/validation/index.ts +0 -5
- package/src/validation/template.ts +0 -405
- package/test/index.test.ts +0 -128
- package/tsconfig.json +0 -18
package/bin/commands/server.ts
DELETED
|
@@ -1,629 +0,0 @@
|
|
|
1
|
-
import type { CLI } from '@stacksjs/clapp'
|
|
2
|
-
import * as cli from '../../src/utils/cli'
|
|
3
|
-
|
|
4
|
-
export function registerServerCommands(app: CLI): void {
|
|
5
|
-
app
|
|
6
|
-
.command('server:list', 'List all servers')
|
|
7
|
-
.action(async () => {
|
|
8
|
-
cli.header('Listing Servers')
|
|
9
|
-
|
|
10
|
-
// TODO: Fetch from AWS
|
|
11
|
-
const servers = [
|
|
12
|
-
['web-1', 'i-1234567890abcdef0', 't3.micro', 'running', 'us-east-1a'],
|
|
13
|
-
['web-2', 'i-0987654321fedcba0', 't3.micro', 'running', 'us-east-1b'],
|
|
14
|
-
]
|
|
15
|
-
|
|
16
|
-
cli.table(
|
|
17
|
-
['Name', 'Instance ID', 'Type', 'Status', 'AZ'],
|
|
18
|
-
servers,
|
|
19
|
-
)
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
app
|
|
23
|
-
.command('server:create <name>', 'Create a new server')
|
|
24
|
-
.option('--type <type>', 'Instance type (e.g., t3.micro)', { default: 't3.micro' })
|
|
25
|
-
.option('--ami <ami>', 'AMI ID')
|
|
26
|
-
.action(async (name: string, options?: { type?: string, ami?: string }) => {
|
|
27
|
-
cli.header(`Creating Server: ${name}`)
|
|
28
|
-
|
|
29
|
-
const spinner = new cli.Spinner(`Creating server ${name}...`)
|
|
30
|
-
spinner.start()
|
|
31
|
-
|
|
32
|
-
// TODO: Implement server creation
|
|
33
|
-
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
34
|
-
|
|
35
|
-
spinner.succeed(`Server ${name} created successfully`)
|
|
36
|
-
cli.info(`Instance type: ${options?.type || 't3.micro'}`)
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
app
|
|
40
|
-
.command('server:ssh <name>', 'SSH into a server')
|
|
41
|
-
.action(async (name: string) => {
|
|
42
|
-
cli.step(`Connecting to ${name}...`)
|
|
43
|
-
// TODO: Implement SSH connection
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
app
|
|
47
|
-
.command('server:logs <name>', 'View server logs')
|
|
48
|
-
.option('--tail', 'Tail logs in real-time')
|
|
49
|
-
.action(async (name: string) => {
|
|
50
|
-
cli.header(`Logs for ${name}`)
|
|
51
|
-
// TODO: Implement log viewing
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
app
|
|
55
|
-
.command('server:deploy <name>', 'Deploy app to server')
|
|
56
|
-
.option('--strategy <strategy>', 'Deployment strategy: git, rsync, or scp')
|
|
57
|
-
.action(async (name: string) => {
|
|
58
|
-
cli.header(`Deploying to ${name}`)
|
|
59
|
-
// TODO: Implement deployment
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
app
|
|
63
|
-
.command('server:resize <name> <type>', 'Change server instance type')
|
|
64
|
-
.action(async (name: string, type: string) => {
|
|
65
|
-
cli.header(`Resizing Server: ${name}`)
|
|
66
|
-
|
|
67
|
-
const confirm = await cli.confirm(
|
|
68
|
-
`This will stop and restart ${name}. Continue?`,
|
|
69
|
-
false,
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
if (!confirm) {
|
|
73
|
-
cli.info('Resize cancelled')
|
|
74
|
-
return
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const spinner = new cli.Spinner(`Resizing ${name} to ${type}...`)
|
|
78
|
-
spinner.start()
|
|
79
|
-
|
|
80
|
-
try {
|
|
81
|
-
// TODO: Implement EC2 instance type change
|
|
82
|
-
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
83
|
-
|
|
84
|
-
spinner.succeed(`Server ${name} resized to ${type}`)
|
|
85
|
-
cli.success(`Instance type changed from t3.micro to ${type}`)
|
|
86
|
-
}
|
|
87
|
-
catch (error: any) {
|
|
88
|
-
spinner.fail('Resize failed')
|
|
89
|
-
cli.error(error.message)
|
|
90
|
-
}
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
app
|
|
94
|
-
.command('server:reboot <name>', 'Reboot a server')
|
|
95
|
-
.option('--force', 'Force reboot without confirmation')
|
|
96
|
-
.action(async (name: string, options?: { force?: boolean }) => {
|
|
97
|
-
cli.header(`Rebooting Server: ${name}`)
|
|
98
|
-
|
|
99
|
-
if (!options?.force) {
|
|
100
|
-
const confirm = await cli.confirm(
|
|
101
|
-
`Are you sure you want to reboot ${name}?`,
|
|
102
|
-
false,
|
|
103
|
-
)
|
|
104
|
-
|
|
105
|
-
if (!confirm) {
|
|
106
|
-
cli.info('Reboot cancelled')
|
|
107
|
-
return
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
const spinner = new cli.Spinner(`Rebooting ${name}...`)
|
|
112
|
-
spinner.start()
|
|
113
|
-
|
|
114
|
-
try {
|
|
115
|
-
// TODO: Implement EC2 reboot
|
|
116
|
-
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
117
|
-
|
|
118
|
-
spinner.succeed(`Server ${name} rebooted successfully`)
|
|
119
|
-
cli.info('Server will be available in a few moments')
|
|
120
|
-
}
|
|
121
|
-
catch (error: any) {
|
|
122
|
-
spinner.fail('Reboot failed')
|
|
123
|
-
cli.error(error.message)
|
|
124
|
-
}
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
app
|
|
128
|
-
.command('server:destroy <name>', 'Terminate a server')
|
|
129
|
-
.option('--force', 'Skip confirmation prompt')
|
|
130
|
-
.action(async (name: string, options?: { force?: boolean }) => {
|
|
131
|
-
cli.header(`Destroying Server: ${name}`)
|
|
132
|
-
|
|
133
|
-
cli.warning('This action is irreversible!')
|
|
134
|
-
|
|
135
|
-
if (!options?.force) {
|
|
136
|
-
const confirm = await cli.confirm(
|
|
137
|
-
`Are you absolutely sure you want to terminate ${name}?`,
|
|
138
|
-
false,
|
|
139
|
-
)
|
|
140
|
-
|
|
141
|
-
if (!confirm) {
|
|
142
|
-
cli.info('Termination cancelled')
|
|
143
|
-
return
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// Double confirmation for safety
|
|
147
|
-
const doubleConfirm = await cli.confirm(
|
|
148
|
-
`Type the server name to confirm: ${name}`,
|
|
149
|
-
false,
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
if (!doubleConfirm) {
|
|
153
|
-
cli.info('Termination cancelled')
|
|
154
|
-
return
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
const spinner = new cli.Spinner(`Terminating ${name}...`)
|
|
159
|
-
spinner.start()
|
|
160
|
-
|
|
161
|
-
try {
|
|
162
|
-
// TODO: Implement EC2 termination
|
|
163
|
-
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
164
|
-
|
|
165
|
-
spinner.succeed(`Server ${name} terminated successfully`)
|
|
166
|
-
cli.success('All resources have been cleaned up')
|
|
167
|
-
}
|
|
168
|
-
catch (error: any) {
|
|
169
|
-
spinner.fail('Termination failed')
|
|
170
|
-
cli.error(error.message)
|
|
171
|
-
}
|
|
172
|
-
})
|
|
173
|
-
|
|
174
|
-
app
|
|
175
|
-
.command('server:recipe <name> <recipe>', 'Install software recipe')
|
|
176
|
-
.action(async (name: string, recipe: string) => {
|
|
177
|
-
cli.header(`Installing Recipe: ${recipe}`)
|
|
178
|
-
|
|
179
|
-
const validRecipes = ['lamp', 'lemp', 'nodejs', 'python', 'ruby', 'docker']
|
|
180
|
-
if (!validRecipes.includes(recipe.toLowerCase())) {
|
|
181
|
-
cli.warn(`Unknown recipe. Common recipes: ${validRecipes.join(', ')}`)
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
cli.info(`Server: ${name}`)
|
|
185
|
-
cli.info(`Recipe: ${recipe}`)
|
|
186
|
-
|
|
187
|
-
const confirm = await cli.confirm('\nInstall this recipe?', true)
|
|
188
|
-
if (!confirm) {
|
|
189
|
-
cli.info('Operation cancelled')
|
|
190
|
-
return
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const spinner = new cli.Spinner(`Installing ${recipe} stack...`)
|
|
194
|
-
spinner.start()
|
|
195
|
-
|
|
196
|
-
// TODO: Run installation script via SSM or user data
|
|
197
|
-
await new Promise(resolve => setTimeout(resolve, 5000))
|
|
198
|
-
|
|
199
|
-
spinner.succeed('Recipe installed successfully')
|
|
200
|
-
|
|
201
|
-
cli.success('\nSoftware stack installed!')
|
|
202
|
-
cli.info(`Server ${name} is now running ${recipe}`)
|
|
203
|
-
})
|
|
204
|
-
|
|
205
|
-
app
|
|
206
|
-
.command('server:cron:add <name> <schedule> <command>', 'Add cron job to server')
|
|
207
|
-
.action(async (name: string, schedule: string, command: string) => {
|
|
208
|
-
cli.header('Adding Cron Job')
|
|
209
|
-
|
|
210
|
-
cli.info(`Server: ${name}`)
|
|
211
|
-
cli.info(`Schedule: ${schedule}`)
|
|
212
|
-
cli.info(`Command: ${command}`)
|
|
213
|
-
|
|
214
|
-
const confirm = await cli.confirm('\nAdd this cron job?', true)
|
|
215
|
-
if (!confirm) {
|
|
216
|
-
cli.info('Operation cancelled')
|
|
217
|
-
return
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
const spinner = new cli.Spinner('Adding cron job...')
|
|
221
|
-
spinner.start()
|
|
222
|
-
|
|
223
|
-
// TODO: Add cron job via SSM
|
|
224
|
-
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
225
|
-
|
|
226
|
-
spinner.succeed('Cron job added')
|
|
227
|
-
|
|
228
|
-
cli.success('\nCron job created!')
|
|
229
|
-
cli.info('Job ID: cron-abc123')
|
|
230
|
-
})
|
|
231
|
-
|
|
232
|
-
app
|
|
233
|
-
.command('server:cron:list <name>', 'List cron jobs on server')
|
|
234
|
-
.action(async (name: string) => {
|
|
235
|
-
cli.header(`Cron Jobs on ${name}`)
|
|
236
|
-
|
|
237
|
-
const spinner = new cli.Spinner('Fetching cron jobs...')
|
|
238
|
-
spinner.start()
|
|
239
|
-
|
|
240
|
-
// TODO: Fetch cron jobs via SSM
|
|
241
|
-
await new Promise(resolve => setTimeout(resolve, 1500))
|
|
242
|
-
|
|
243
|
-
spinner.stop()
|
|
244
|
-
|
|
245
|
-
cli.table(
|
|
246
|
-
['ID', 'Schedule', 'Command', 'Last Run', 'Status'],
|
|
247
|
-
[
|
|
248
|
-
['cron-1', '0 2 * * *', 'backup-db.sh', '2h ago', 'Success'],
|
|
249
|
-
['cron-2', '*/15 * * * *', 'sync-files.sh', '10m ago', 'Success'],
|
|
250
|
-
['cron-3', '0 0 * * 0', 'weekly-report.sh', '2d ago', 'Success'],
|
|
251
|
-
],
|
|
252
|
-
)
|
|
253
|
-
})
|
|
254
|
-
|
|
255
|
-
app
|
|
256
|
-
.command('server:cron:remove <name> <id>', 'Remove cron job')
|
|
257
|
-
.action(async (name: string, id: string) => {
|
|
258
|
-
cli.header('Removing Cron Job')
|
|
259
|
-
|
|
260
|
-
cli.info(`Server: ${name}`)
|
|
261
|
-
cli.info(`Job ID: ${id}`)
|
|
262
|
-
|
|
263
|
-
const confirm = await cli.confirm('\nRemove this cron job?', true)
|
|
264
|
-
if (!confirm) {
|
|
265
|
-
cli.info('Operation cancelled')
|
|
266
|
-
return
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
const spinner = new cli.Spinner('Removing cron job...')
|
|
270
|
-
spinner.start()
|
|
271
|
-
|
|
272
|
-
// TODO: Remove cron job via SSM
|
|
273
|
-
await new Promise(resolve => setTimeout(resolve, 1500))
|
|
274
|
-
|
|
275
|
-
spinner.succeed('Cron job removed')
|
|
276
|
-
|
|
277
|
-
cli.success('\nCron job deleted!')
|
|
278
|
-
})
|
|
279
|
-
|
|
280
|
-
app
|
|
281
|
-
.command('server:worker:add <name> <queue>', 'Add background worker')
|
|
282
|
-
.option('--processes <count>', 'Number of worker processes', { default: '1' })
|
|
283
|
-
.action(async (name: string, queue: string, options?: { processes?: string }) => {
|
|
284
|
-
const processes = options?.processes || '1'
|
|
285
|
-
|
|
286
|
-
cli.header('Adding Background Worker')
|
|
287
|
-
|
|
288
|
-
cli.info(`Server: ${name}`)
|
|
289
|
-
cli.info(`Queue: ${queue}`)
|
|
290
|
-
cli.info(`Processes: ${processes}`)
|
|
291
|
-
|
|
292
|
-
const confirm = await cli.confirm('\nAdd this worker?', true)
|
|
293
|
-
if (!confirm) {
|
|
294
|
-
cli.info('Operation cancelled')
|
|
295
|
-
return
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
const spinner = new cli.Spinner('Configuring worker process...')
|
|
299
|
-
spinner.start()
|
|
300
|
-
|
|
301
|
-
// TODO: Configure supervisor/systemd worker
|
|
302
|
-
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
303
|
-
|
|
304
|
-
spinner.succeed('Worker configured')
|
|
305
|
-
|
|
306
|
-
cli.success('\nBackground worker added!')
|
|
307
|
-
cli.info('Worker ID: worker-abc123')
|
|
308
|
-
})
|
|
309
|
-
|
|
310
|
-
app
|
|
311
|
-
.command('server:worker:list <name>', 'List workers on server')
|
|
312
|
-
.action(async (name: string) => {
|
|
313
|
-
cli.header(`Workers on ${name}`)
|
|
314
|
-
|
|
315
|
-
const spinner = new cli.Spinner('Fetching workers...')
|
|
316
|
-
spinner.start()
|
|
317
|
-
|
|
318
|
-
// TODO: Fetch workers from supervisor/systemd
|
|
319
|
-
await new Promise(resolve => setTimeout(resolve, 1500))
|
|
320
|
-
|
|
321
|
-
spinner.stop()
|
|
322
|
-
|
|
323
|
-
cli.table(
|
|
324
|
-
['ID', 'Queue', 'Processes', 'Status', 'Uptime'],
|
|
325
|
-
[
|
|
326
|
-
['worker-1', 'emails', '2', 'Running', '5d 3h'],
|
|
327
|
-
['worker-2', 'images', '4', 'Running', '2d 8h'],
|
|
328
|
-
['worker-3', 'reports', '1', 'Stopped', '-'],
|
|
329
|
-
],
|
|
330
|
-
)
|
|
331
|
-
})
|
|
332
|
-
|
|
333
|
-
app
|
|
334
|
-
.command('server:worker:restart <name> <id>', 'Restart worker')
|
|
335
|
-
.action(async (name: string, id: string) => {
|
|
336
|
-
cli.header('Restarting Worker')
|
|
337
|
-
|
|
338
|
-
cli.info(`Server: ${name}`)
|
|
339
|
-
cli.info(`Worker ID: ${id}`)
|
|
340
|
-
|
|
341
|
-
const spinner = new cli.Spinner('Restarting worker process...')
|
|
342
|
-
spinner.start()
|
|
343
|
-
|
|
344
|
-
// TODO: Restart via supervisor/systemd
|
|
345
|
-
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
346
|
-
|
|
347
|
-
spinner.succeed('Worker restarted')
|
|
348
|
-
|
|
349
|
-
cli.success('\nWorker restarted successfully!')
|
|
350
|
-
})
|
|
351
|
-
|
|
352
|
-
app
|
|
353
|
-
.command('server:worker:remove <name> <id>', 'Remove worker')
|
|
354
|
-
.action(async (name: string, id: string) => {
|
|
355
|
-
cli.header('Removing Worker')
|
|
356
|
-
|
|
357
|
-
cli.info(`Server: ${name}`)
|
|
358
|
-
cli.info(`Worker ID: ${id}`)
|
|
359
|
-
|
|
360
|
-
const confirm = await cli.confirm('\nRemove this worker?', true)
|
|
361
|
-
if (!confirm) {
|
|
362
|
-
cli.info('Operation cancelled')
|
|
363
|
-
return
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
const spinner = new cli.Spinner('Removing worker...')
|
|
367
|
-
spinner.start()
|
|
368
|
-
|
|
369
|
-
// TODO: Remove from supervisor/systemd
|
|
370
|
-
await new Promise(resolve => setTimeout(resolve, 1500))
|
|
371
|
-
|
|
372
|
-
spinner.succeed('Worker removed')
|
|
373
|
-
|
|
374
|
-
cli.success('\nWorker deleted!')
|
|
375
|
-
})
|
|
376
|
-
|
|
377
|
-
app
|
|
378
|
-
.command('server:firewall:add <name> <rule>', 'Add firewall rule')
|
|
379
|
-
.action(async (name: string, rule: string) => {
|
|
380
|
-
cli.header('Adding Firewall Rule')
|
|
381
|
-
|
|
382
|
-
cli.info(`Server: ${name}`)
|
|
383
|
-
cli.info(`Rule: ${rule}`)
|
|
384
|
-
|
|
385
|
-
const confirm = await cli.confirm('\nAdd this firewall rule?', true)
|
|
386
|
-
if (!confirm) {
|
|
387
|
-
cli.info('Operation cancelled')
|
|
388
|
-
return
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
const spinner = new cli.Spinner('Updating firewall rules (ufw)...')
|
|
392
|
-
spinner.start()
|
|
393
|
-
|
|
394
|
-
// TODO: Update security group and/or ufw via SSM
|
|
395
|
-
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
396
|
-
|
|
397
|
-
spinner.succeed('Firewall rule added')
|
|
398
|
-
|
|
399
|
-
cli.success('\nFirewall rule configured!')
|
|
400
|
-
})
|
|
401
|
-
|
|
402
|
-
app
|
|
403
|
-
.command('server:firewall:list <name>', 'List firewall rules')
|
|
404
|
-
.action(async (name: string) => {
|
|
405
|
-
cli.header(`Firewall Rules on ${name}`)
|
|
406
|
-
|
|
407
|
-
const spinner = new cli.Spinner('Fetching firewall rules...')
|
|
408
|
-
spinner.start()
|
|
409
|
-
|
|
410
|
-
// TODO: Fetch from security group + ufw
|
|
411
|
-
await new Promise(resolve => setTimeout(resolve, 1500))
|
|
412
|
-
|
|
413
|
-
spinner.stop()
|
|
414
|
-
|
|
415
|
-
cli.table(
|
|
416
|
-
['#', 'Action', 'From', 'To', 'Port', 'Protocol'],
|
|
417
|
-
[
|
|
418
|
-
['1', 'ALLOW', 'Anywhere', '22/tcp', '22', 'TCP'],
|
|
419
|
-
['2', 'ALLOW', 'Anywhere', '80/tcp', '80', 'TCP'],
|
|
420
|
-
['3', 'ALLOW', 'Anywhere', '443/tcp', '443', 'TCP'],
|
|
421
|
-
['4', 'DENY', '192.168.1.0/24', 'Any', 'Any', 'Any'],
|
|
422
|
-
],
|
|
423
|
-
)
|
|
424
|
-
})
|
|
425
|
-
|
|
426
|
-
app
|
|
427
|
-
.command('server:firewall:remove <name> <rule>', 'Remove firewall rule')
|
|
428
|
-
.action(async (name: string, rule: string) => {
|
|
429
|
-
cli.header('Removing Firewall Rule')
|
|
430
|
-
|
|
431
|
-
cli.info(`Server: ${name}`)
|
|
432
|
-
cli.info(`Rule: ${rule}`)
|
|
433
|
-
|
|
434
|
-
const confirm = await cli.confirm('\nRemove this firewall rule?', true)
|
|
435
|
-
if (!confirm) {
|
|
436
|
-
cli.info('Operation cancelled')
|
|
437
|
-
return
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
const spinner = new cli.Spinner('Updating firewall rules...')
|
|
441
|
-
spinner.start()
|
|
442
|
-
|
|
443
|
-
// TODO: Update security group and/or ufw
|
|
444
|
-
await new Promise(resolve => setTimeout(resolve, 1500))
|
|
445
|
-
|
|
446
|
-
spinner.succeed('Firewall rule removed')
|
|
447
|
-
|
|
448
|
-
cli.success('\nFirewall rule deleted!')
|
|
449
|
-
})
|
|
450
|
-
|
|
451
|
-
app
|
|
452
|
-
.command('server:ssl:install <domain>', 'Install Let\'s Encrypt certificate')
|
|
453
|
-
.action(async (domain: string) => {
|
|
454
|
-
cli.header(`Installing SSL Certificate for ${domain}`)
|
|
455
|
-
|
|
456
|
-
const confirm = await cli.confirm('\nInstall Let\'s Encrypt certificate?', true)
|
|
457
|
-
if (!confirm) {
|
|
458
|
-
cli.info('Operation cancelled')
|
|
459
|
-
return
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
const spinner = new cli.Spinner('Installing certbot and obtaining certificate...')
|
|
463
|
-
spinner.start()
|
|
464
|
-
|
|
465
|
-
// TODO: Run certbot via SSM
|
|
466
|
-
await new Promise(resolve => setTimeout(resolve, 3000))
|
|
467
|
-
|
|
468
|
-
spinner.succeed('SSL certificate installed')
|
|
469
|
-
|
|
470
|
-
cli.success('\nSSL certificate active!')
|
|
471
|
-
cli.info(`HTTPS enabled for ${domain}`)
|
|
472
|
-
cli.info('Auto-renewal configured via cron')
|
|
473
|
-
})
|
|
474
|
-
|
|
475
|
-
app
|
|
476
|
-
.command('server:ssl:renew <domain>', 'Renew SSL certificate')
|
|
477
|
-
.action(async (domain: string) => {
|
|
478
|
-
cli.header(`Renewing SSL Certificate for ${domain}`)
|
|
479
|
-
|
|
480
|
-
const spinner = new cli.Spinner('Renewing certificate...')
|
|
481
|
-
spinner.start()
|
|
482
|
-
|
|
483
|
-
// TODO: Run certbot renew via SSM
|
|
484
|
-
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
485
|
-
|
|
486
|
-
spinner.succeed('Certificate renewed')
|
|
487
|
-
|
|
488
|
-
cli.success('\nSSL certificate renewed!')
|
|
489
|
-
cli.info(`Valid until: ${new Date(Date.now() + 90 * 24 * 60 * 60 * 1000).toLocaleDateString()}`)
|
|
490
|
-
})
|
|
491
|
-
|
|
492
|
-
app
|
|
493
|
-
.command('server:monitoring <name>', 'Show server metrics')
|
|
494
|
-
.action(async (name: string) => {
|
|
495
|
-
cli.header(`Server Metrics: ${name}`)
|
|
496
|
-
|
|
497
|
-
const spinner = new cli.Spinner('Fetching metrics from CloudWatch...')
|
|
498
|
-
spinner.start()
|
|
499
|
-
|
|
500
|
-
// TODO: Fetch from CloudWatch
|
|
501
|
-
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
502
|
-
|
|
503
|
-
spinner.stop()
|
|
504
|
-
|
|
505
|
-
cli.info('\nCurrent Metrics:\n')
|
|
506
|
-
|
|
507
|
-
cli.info('CPU Usage:')
|
|
508
|
-
cli.info(' - Current: 23.5%')
|
|
509
|
-
cli.info(' - Average (1h): 18.2%')
|
|
510
|
-
cli.info(' - Peak (24h): 67.3%')
|
|
511
|
-
|
|
512
|
-
cli.info('\nMemory Usage:')
|
|
513
|
-
cli.info(' - Used: 2.1 GB / 4 GB (52.5%)')
|
|
514
|
-
cli.info(' - Available: 1.9 GB')
|
|
515
|
-
cli.info(' - Swap: 0 GB')
|
|
516
|
-
|
|
517
|
-
cli.info('\nDisk Usage:')
|
|
518
|
-
cli.info(' - /: 15.2 GB / 30 GB (50.7%)')
|
|
519
|
-
cli.info(' - /data: 45.8 GB / 100 GB (45.8%)')
|
|
520
|
-
|
|
521
|
-
cli.info('\nNetwork:')
|
|
522
|
-
cli.info(' - In: 125 MB/s')
|
|
523
|
-
cli.info(' - Out: 87 MB/s')
|
|
524
|
-
})
|
|
525
|
-
|
|
526
|
-
app
|
|
527
|
-
.command('server:snapshot <name>', 'Create server snapshot')
|
|
528
|
-
.action(async (name: string) => {
|
|
529
|
-
cli.header(`Creating Snapshot of ${name}`)
|
|
530
|
-
|
|
531
|
-
const confirm = await cli.confirm('\nCreate snapshot? This may take several minutes.', true)
|
|
532
|
-
if (!confirm) {
|
|
533
|
-
cli.info('Operation cancelled')
|
|
534
|
-
return
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
const spinner = new cli.Spinner('Creating EBS snapshot...')
|
|
538
|
-
spinner.start()
|
|
539
|
-
|
|
540
|
-
// TODO: Create EC2 snapshot
|
|
541
|
-
await new Promise(resolve => setTimeout(resolve, 3000))
|
|
542
|
-
|
|
543
|
-
spinner.succeed('Snapshot created')
|
|
544
|
-
|
|
545
|
-
cli.success('\nServer snapshot created!')
|
|
546
|
-
cli.info('Snapshot ID: snap-abc123')
|
|
547
|
-
cli.info('Use `cloud server:snapshot:restore` to restore from this snapshot')
|
|
548
|
-
})
|
|
549
|
-
|
|
550
|
-
app
|
|
551
|
-
.command('server:snapshot:restore <name> <snapshot-id>', 'Restore from snapshot')
|
|
552
|
-
.action(async (name: string, snapshotId: string) => {
|
|
553
|
-
cli.header('Restoring from Snapshot')
|
|
554
|
-
|
|
555
|
-
cli.info(`Server: ${name}`)
|
|
556
|
-
cli.info(`Snapshot: ${snapshotId}`)
|
|
557
|
-
|
|
558
|
-
cli.warn('\nThis will replace the current server data')
|
|
559
|
-
|
|
560
|
-
const confirm = await cli.confirm('Proceed with restore?', false)
|
|
561
|
-
if (!confirm) {
|
|
562
|
-
cli.info('Operation cancelled')
|
|
563
|
-
return
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
const spinner = new cli.Spinner('Restoring from snapshot...')
|
|
567
|
-
spinner.start()
|
|
568
|
-
|
|
569
|
-
// TODO: Create volume from snapshot and attach
|
|
570
|
-
await new Promise(resolve => setTimeout(resolve, 4000))
|
|
571
|
-
|
|
572
|
-
spinner.succeed('Restore complete')
|
|
573
|
-
|
|
574
|
-
cli.success('\nServer restored from snapshot!')
|
|
575
|
-
cli.warn('Reboot required to complete restoration')
|
|
576
|
-
})
|
|
577
|
-
|
|
578
|
-
app
|
|
579
|
-
.command('server:update <name>', 'Update server packages')
|
|
580
|
-
.action(async (name: string) => {
|
|
581
|
-
cli.header(`Updating Packages on ${name}`)
|
|
582
|
-
|
|
583
|
-
const confirm = await cli.confirm('\nUpdate all packages?', true)
|
|
584
|
-
if (!confirm) {
|
|
585
|
-
cli.info('Operation cancelled')
|
|
586
|
-
return
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
const spinner = new cli.Spinner('Running apt update && apt upgrade...')
|
|
590
|
-
spinner.start()
|
|
591
|
-
|
|
592
|
-
// TODO: Run update via SSM
|
|
593
|
-
await new Promise(resolve => setTimeout(resolve, 5000))
|
|
594
|
-
|
|
595
|
-
spinner.succeed('Packages updated')
|
|
596
|
-
|
|
597
|
-
cli.success('\nServer packages updated!')
|
|
598
|
-
cli.info('Updated: 45 packages')
|
|
599
|
-
cli.warn('Reboot recommended')
|
|
600
|
-
})
|
|
601
|
-
|
|
602
|
-
app
|
|
603
|
-
.command('server:secure <name>', 'Run security hardening script')
|
|
604
|
-
.action(async (name: string) => {
|
|
605
|
-
cli.header(`Securing Server: ${name}`)
|
|
606
|
-
|
|
607
|
-
const confirm = await cli.confirm('\nRun security hardening? This will:\n- Configure firewall\n- Disable root login\n- Setup fail2ban\n- Configure SSH keys only\n- Install security updates', true)
|
|
608
|
-
if (!confirm) {
|
|
609
|
-
cli.info('Operation cancelled')
|
|
610
|
-
return
|
|
611
|
-
}
|
|
612
|
-
|
|
613
|
-
const spinner = new cli.Spinner('Running security hardening script...')
|
|
614
|
-
spinner.start()
|
|
615
|
-
|
|
616
|
-
// TODO: Run hardening script via SSM
|
|
617
|
-
await new Promise(resolve => setTimeout(resolve, 6000))
|
|
618
|
-
|
|
619
|
-
spinner.succeed('Security hardening complete')
|
|
620
|
-
|
|
621
|
-
cli.success('\nServer secured!')
|
|
622
|
-
cli.info('\nSecurity measures applied:')
|
|
623
|
-
cli.info(' - Firewall configured (ufw)')
|
|
624
|
-
cli.info(' - Root login disabled')
|
|
625
|
-
cli.info(' - fail2ban installed and configured')
|
|
626
|
-
cli.info(' - SSH keys-only authentication')
|
|
627
|
-
cli.info(' - Security updates installed')
|
|
628
|
-
})
|
|
629
|
-
}
|