indraq_cli 1.5.8 → 1.9.1
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/LICENSE +21 -21
- package/README.md +1517 -1686
- package/cloud-api/.dockerignore +18 -0
- package/cloud-api/.env.example +14 -0
- package/cloud-api/Dockerfile +19 -0
- package/cloud-api/README.md +141 -0
- package/cloud-api/package-lock.json +2250 -0
- package/cloud-api/package.json +29 -0
- package/cloud-api/sql/001_init.sql +8 -0
- package/cloud-api/sql/002_user_providers_and_project_resources.sql +40 -0
- package/cloud-api/sql/003_environment_infrastructure.sql +19 -0
- package/cloud-api/sql/004_managed_aws_credentials.sql +20 -0
- package/cloud-api/sql/005_project_members_and_resource_grants.sql +22 -0
- package/cloud-api/sql/006_catalog_identity_password_security.sql +96 -0
- package/cloud-api/sql/007_aws_access_key_rotation.sql +16 -0
- package/cloud-api/src/index.ts +1254 -0
- package/cloud-api/tsconfig.json +18 -0
- package/dist/cli/create-program.d.ts.map +1 -1
- package/dist/cli/create-program.js +21 -3
- package/dist/cli/create-program.js.map +1 -1
- package/dist/cli/doctor.command.d.ts +1 -1
- package/dist/cli/doctor.command.d.ts.map +1 -1
- package/dist/cli/doctor.command.js +70 -12
- package/dist/cli/doctor.command.js.map +1 -1
- package/dist/cli/help-content.d.ts +1 -1
- package/dist/cli/help-content.d.ts.map +1 -1
- package/dist/cli/help-content.js +256 -177
- package/dist/cli/help-content.js.map +1 -1
- package/dist/modules/access/commands/access.command.d.ts +3 -0
- package/dist/modules/access/commands/access.command.d.ts.map +1 -0
- package/dist/modules/access/commands/access.command.js +226 -0
- package/dist/modules/access/commands/access.command.js.map +1 -0
- package/dist/modules/access/index.d.ts +3 -0
- package/dist/modules/access/index.d.ts.map +1 -0
- package/dist/modules/access/index.js +11 -0
- package/dist/modules/access/index.js.map +1 -0
- package/dist/modules/aws/commands/configure-aws.command.d.ts +2 -0
- package/dist/modules/aws/commands/configure-aws.command.d.ts.map +1 -0
- package/dist/modules/aws/commands/configure-aws.command.js +7 -0
- package/dist/modules/aws/commands/configure-aws.command.js.map +1 -0
- package/dist/modules/aws/commands/dns.command.d.ts +22 -0
- package/dist/modules/aws/commands/dns.command.d.ts.map +1 -0
- package/dist/modules/aws/commands/dns.command.js +229 -0
- package/dist/modules/aws/commands/dns.command.js.map +1 -0
- package/dist/modules/aws/commands/healthcheck.command.d.ts +22 -0
- package/dist/modules/aws/commands/healthcheck.command.d.ts.map +1 -0
- package/dist/modules/aws/commands/healthcheck.command.js +125 -0
- package/dist/modules/aws/commands/healthcheck.command.js.map +1 -0
- package/dist/modules/aws/commands/iam.command.d.ts +24 -0
- package/dist/modules/aws/commands/iam.command.d.ts.map +1 -0
- package/dist/modules/aws/commands/iam.command.js +219 -0
- package/dist/modules/aws/commands/iam.command.js.map +1 -0
- package/dist/modules/aws/config/aws-config.d.ts +23 -0
- package/dist/modules/aws/config/aws-config.d.ts.map +1 -0
- package/dist/modules/aws/config/aws-config.js +72 -0
- package/dist/modules/aws/config/aws-config.js.map +1 -0
- package/dist/modules/aws/index.d.ts +3 -0
- package/dist/modules/aws/index.d.ts.map +1 -0
- package/dist/modules/aws/index.js +54 -0
- package/dist/modules/aws/index.js.map +1 -0
- package/dist/modules/aws/services/aws-clients.d.ts +9 -0
- package/dist/modules/aws/services/aws-clients.d.ts.map +1 -0
- package/dist/modules/aws/services/aws-clients.js +43 -0
- package/dist/modules/aws/services/aws-clients.js.map +1 -0
- package/dist/modules/aws/services/route53-lookup.service.d.ts +9 -0
- package/dist/modules/aws/services/route53-lookup.service.d.ts.map +1 -0
- package/dist/modules/aws/services/route53-lookup.service.js +57 -0
- package/dist/modules/aws/services/route53-lookup.service.js.map +1 -0
- package/dist/modules/cloud/commands/cloud.command.d.ts +38 -0
- package/dist/modules/cloud/commands/cloud.command.d.ts.map +1 -0
- package/dist/modules/cloud/commands/cloud.command.js +443 -0
- package/dist/modules/cloud/commands/cloud.command.js.map +1 -0
- package/dist/modules/cloud/commands/credentials.command.d.ts +5 -0
- package/dist/modules/cloud/commands/credentials.command.d.ts.map +1 -0
- package/dist/modules/cloud/commands/credentials.command.js +25 -0
- package/dist/modules/cloud/commands/credentials.command.js.map +1 -0
- package/dist/modules/cloud/commands/environment.command.d.ts +6 -0
- package/dist/modules/cloud/commands/environment.command.d.ts.map +1 -0
- package/dist/modules/cloud/commands/environment.command.js +75 -0
- package/dist/modules/cloud/commands/environment.command.js.map +1 -0
- package/dist/modules/cloud/commands/provider.command.d.ts +3 -0
- package/dist/modules/cloud/commands/provider.command.d.ts.map +1 -0
- package/dist/modules/cloud/commands/provider.command.js +193 -0
- package/dist/modules/cloud/commands/provider.command.js.map +1 -0
- package/dist/modules/cloud/config/cloud-config.d.ts +19 -0
- package/dist/modules/cloud/config/cloud-config.d.ts.map +1 -0
- package/dist/modules/cloud/config/cloud-config.js +53 -0
- package/dist/modules/cloud/config/cloud-config.js.map +1 -0
- package/dist/modules/cloud/index.d.ts +3 -0
- package/dist/modules/cloud/index.d.ts.map +1 -0
- package/dist/modules/cloud/index.js +62 -0
- package/dist/modules/cloud/index.js.map +1 -0
- package/dist/modules/cloud/services/cloud-api.service.d.ts +17 -0
- package/dist/modules/cloud/services/cloud-api.service.d.ts.map +1 -0
- package/dist/modules/cloud/services/cloud-api.service.js +61 -0
- package/dist/modules/cloud/services/cloud-api.service.js.map +1 -0
- package/dist/modules/cloud/services/cloud-aws.service.d.ts +23 -0
- package/dist/modules/cloud/services/cloud-aws.service.d.ts.map +1 -0
- package/dist/modules/cloud/services/cloud-aws.service.js +26 -0
- package/dist/modules/cloud/services/cloud-aws.service.js.map +1 -0
- package/dist/modules/cloud/services/cloud-ghcr.service.d.ts +12 -0
- package/dist/modules/cloud/services/cloud-ghcr.service.d.ts.map +1 -0
- package/dist/modules/cloud/services/cloud-ghcr.service.js +31 -0
- package/dist/modules/cloud/services/cloud-ghcr.service.js.map +1 -0
- package/dist/modules/cloud/services/cloud-jenkins.service.d.ts +29 -0
- package/dist/modules/cloud/services/cloud-jenkins.service.d.ts.map +1 -0
- package/dist/modules/cloud/services/cloud-jenkins.service.js +236 -0
- package/dist/modules/cloud/services/cloud-jenkins.service.js.map +1 -0
- package/dist/modules/cloud/services/cloud-npm.service.d.ts +3 -0
- package/dist/modules/cloud/services/cloud-npm.service.d.ts.map +1 -0
- package/dist/modules/cloud/services/cloud-npm.service.js +13 -0
- package/dist/modules/cloud/services/cloud-npm.service.js.map +1 -0
- package/dist/modules/cloud/services/environment.service.d.ts +25 -0
- package/dist/modules/cloud/services/environment.service.d.ts.map +1 -0
- package/dist/modules/cloud/services/environment.service.js +21 -0
- package/dist/modules/cloud/services/environment.service.js.map +1 -0
- package/dist/modules/cloud/services/managed-aws-credential.service.d.ts +36 -0
- package/dist/modules/cloud/services/managed-aws-credential.service.d.ts.map +1 -0
- package/dist/modules/cloud/services/managed-aws-credential.service.js +35 -0
- package/dist/modules/cloud/services/managed-aws-credential.service.js.map +1 -0
- package/dist/modules/cloud/services/project-cloud.service.d.ts +28 -0
- package/dist/modules/cloud/services/project-cloud.service.d.ts.map +1 -0
- package/dist/modules/cloud/services/project-cloud.service.js +50 -0
- package/dist/modules/cloud/services/project-cloud.service.js.map +1 -0
- package/dist/modules/cloud/services/user-provider.service.d.ts +17 -0
- package/dist/modules/cloud/services/user-provider.service.d.ts.map +1 -0
- package/dist/modules/cloud/services/user-provider.service.js +25 -0
- package/dist/modules/cloud/services/user-provider.service.js.map +1 -0
- package/dist/modules/configure/configure.command.d.ts.map +1 -1
- package/dist/modules/configure/configure.command.js +17 -94
- package/dist/modules/configure/configure.command.js.map +1 -1
- package/dist/modules/deploy/commands/build.command.d.ts +1 -2
- package/dist/modules/deploy/commands/build.command.d.ts.map +1 -1
- package/dist/modules/deploy/commands/build.command.js +82 -124
- package/dist/modules/deploy/commands/build.command.js.map +1 -1
- package/dist/modules/deploy/index.d.ts.map +1 -1
- package/dist/modules/deploy/index.js +10 -30
- package/dist/modules/deploy/index.js.map +1 -1
- package/dist/modules/deploy/services/docker.service.d.ts +6 -3
- package/dist/modules/deploy/services/docker.service.d.ts.map +1 -1
- package/dist/modules/deploy/services/docker.service.js +8 -11
- package/dist/modules/deploy/services/docker.service.js.map +1 -1
- package/dist/modules/dockerfile/commands/create-dockerfile.command.d.ts +13 -0
- package/dist/modules/dockerfile/commands/create-dockerfile.command.d.ts.map +1 -0
- package/dist/modules/dockerfile/commands/create-dockerfile.command.js +39 -0
- package/dist/modules/dockerfile/commands/create-dockerfile.command.js.map +1 -0
- package/dist/modules/dockerfile/index.d.ts +3 -0
- package/dist/modules/dockerfile/index.d.ts.map +1 -0
- package/dist/modules/dockerfile/index.js +7 -0
- package/dist/modules/dockerfile/index.js.map +1 -0
- package/dist/modules/jenkins/commands/admin.command.d.ts +22 -0
- package/dist/modules/jenkins/commands/admin.command.d.ts.map +1 -0
- package/dist/modules/jenkins/commands/admin.command.js +128 -0
- package/dist/modules/jenkins/commands/admin.command.js.map +1 -0
- package/dist/modules/jenkins/commands/create-deployment.command.d.ts +13 -0
- package/dist/modules/jenkins/commands/create-deployment.command.d.ts.map +1 -0
- package/dist/modules/jenkins/commands/create-deployment.command.js +115 -0
- package/dist/modules/jenkins/commands/create-deployment.command.js.map +1 -0
- package/dist/modules/jenkins/index.d.ts +3 -0
- package/dist/modules/jenkins/index.d.ts.map +1 -0
- package/dist/modules/jenkins/index.js +28 -0
- package/dist/modules/jenkins/index.js.map +1 -0
- package/dist/modules/mobile/commands/build-mobile.command.d.ts.map +1 -1
- package/dist/modules/mobile/commands/build-mobile.command.js +4 -22
- package/dist/modules/mobile/commands/build-mobile.command.js.map +1 -1
- package/dist/modules/mobile/commands/configure-mobile.command.d.ts +1 -1
- package/dist/modules/mobile/commands/configure-mobile.command.d.ts.map +1 -1
- package/dist/modules/mobile/commands/configure-mobile.command.js +11 -9
- package/dist/modules/mobile/commands/configure-mobile.command.js.map +1 -1
- package/dist/modules/mobile/services/jenkins-mobile.service.d.ts +2 -2
- package/dist/modules/mobile/services/jenkins-mobile.service.d.ts.map +1 -1
- package/dist/modules/mobile/services/jenkins-mobile.service.js +1 -2
- package/dist/modules/mobile/services/jenkins-mobile.service.js.map +1 -1
- package/dist/modules/mobile/services/project.service.d.ts +2 -2
- package/dist/modules/mobile/services/project.service.d.ts.map +1 -1
- package/dist/modules/prebuild/commands/prebuild.command.d.ts +13 -0
- package/dist/modules/prebuild/commands/prebuild.command.d.ts.map +1 -0
- package/dist/modules/prebuild/commands/prebuild.command.js +507 -0
- package/dist/modules/prebuild/commands/prebuild.command.js.map +1 -0
- package/dist/modules/prebuild/index.d.ts +3 -0
- package/dist/modules/prebuild/index.d.ts.map +1 -0
- package/dist/modules/prebuild/index.js +19 -0
- package/dist/modules/prebuild/index.js.map +1 -0
- package/dist/modules/proxy/commands/configure-proxy.command.d.ts +2 -0
- package/dist/modules/proxy/commands/configure-proxy.command.d.ts.map +1 -0
- package/dist/modules/proxy/commands/configure-proxy.command.js +7 -0
- package/dist/modules/proxy/commands/configure-proxy.command.js.map +1 -0
- package/dist/modules/proxy/commands/npm-user.command.d.ts +28 -0
- package/dist/modules/proxy/commands/npm-user.command.d.ts.map +1 -0
- package/dist/modules/proxy/commands/npm-user.command.js +77 -0
- package/dist/modules/proxy/commands/npm-user.command.js.map +1 -0
- package/dist/modules/proxy/commands/proxy.command.d.ts +22 -0
- package/dist/modules/proxy/commands/proxy.command.d.ts.map +1 -0
- package/dist/modules/proxy/commands/proxy.command.js +173 -0
- package/dist/modules/proxy/commands/proxy.command.js.map +1 -0
- package/dist/modules/proxy/config/npm-config.d.ts +17 -0
- package/dist/modules/proxy/config/npm-config.d.ts.map +1 -0
- package/dist/modules/proxy/config/npm-config.js +50 -0
- package/dist/modules/proxy/config/npm-config.js.map +1 -0
- package/dist/modules/proxy/index.d.ts +3 -0
- package/dist/modules/proxy/index.d.ts.map +1 -0
- package/dist/modules/proxy/index.js +21 -0
- package/dist/modules/proxy/index.js.map +1 -0
- package/dist/modules/proxy/services/npm-api.service.d.ts +76 -0
- package/dist/modules/proxy/services/npm-api.service.d.ts.map +1 -0
- package/dist/modules/proxy/services/npm-api.service.js +82 -0
- package/dist/modules/proxy/services/npm-api.service.js.map +1 -0
- package/dist/modules/scaffold/commands/init.command.d.ts +6 -0
- package/dist/modules/scaffold/commands/init.command.d.ts.map +1 -0
- package/dist/modules/scaffold/commands/init.command.js +193 -0
- package/dist/modules/scaffold/commands/init.command.js.map +1 -0
- package/dist/modules/scaffold/config/project-metadata.d.ts +9 -0
- package/dist/modules/scaffold/config/project-metadata.d.ts.map +1 -0
- package/dist/modules/scaffold/config/project-metadata.js +75 -0
- package/dist/modules/scaffold/config/project-metadata.js.map +1 -0
- package/dist/modules/scaffold/index.d.ts +3 -0
- package/dist/modules/scaffold/index.d.ts.map +1 -0
- package/dist/modules/scaffold/index.js +7 -0
- package/dist/modules/scaffold/index.js.map +1 -0
- package/dist/modules/scaffold/services/docker-template.service.d.ts +3 -0
- package/dist/modules/scaffold/services/docker-template.service.d.ts.map +1 -0
- package/dist/modules/scaffold/services/docker-template.service.js +131 -0
- package/dist/modules/scaffold/services/docker-template.service.js.map +1 -0
- package/dist/modules/scaffold/services/filesystem.service.d.ts +7 -0
- package/dist/modules/scaffold/services/filesystem.service.d.ts.map +1 -0
- package/dist/modules/scaffold/services/filesystem.service.js +97 -0
- package/dist/modules/scaffold/services/filesystem.service.js.map +1 -0
- package/dist/modules/scaffold/services/project-template.service.d.ts +4 -0
- package/dist/modules/scaffold/services/project-template.service.d.ts.map +1 -0
- package/dist/modules/scaffold/services/project-template.service.js +82 -0
- package/dist/modules/scaffold/services/project-template.service.js.map +1 -0
- package/dist/modules/scaffold/types.d.ts +65 -0
- package/dist/modules/scaffold/types.d.ts.map +1 -0
- package/dist/modules/scaffold/types.js +3 -0
- package/dist/modules/scaffold/types.js.map +1 -0
- package/dist/modules/users/commands/user.command.d.ts +22 -0
- package/dist/modules/users/commands/user.command.d.ts.map +1 -0
- package/dist/modules/users/commands/user.command.js +350 -0
- package/dist/modules/users/commands/user.command.js.map +1 -0
- package/dist/modules/users/index.d.ts +3 -0
- package/dist/modules/users/index.d.ts.map +1 -0
- package/dist/modules/users/index.js +34 -0
- package/dist/modules/users/index.js.map +1 -0
- package/dist/modules/users/providers/aws-user.provider.d.ts +11 -0
- package/dist/modules/users/providers/aws-user.provider.d.ts.map +1 -0
- package/dist/modules/users/providers/aws-user.provider.js +129 -0
- package/dist/modules/users/providers/aws-user.provider.js.map +1 -0
- package/dist/modules/users/providers/jenkins-user.provider.d.ts +6 -0
- package/dist/modules/users/providers/jenkins-user.provider.d.ts.map +1 -0
- package/dist/modules/users/providers/jenkins-user.provider.js +97 -0
- package/dist/modules/users/providers/jenkins-user.provider.js.map +1 -0
- package/dist/modules/users/providers/npm-user.provider.d.ts +4 -0
- package/dist/modules/users/providers/npm-user.provider.d.ts.map +1 -0
- package/dist/modules/users/providers/npm-user.provider.js +47 -0
- package/dist/modules/users/providers/npm-user.provider.js.map +1 -0
- package/dist/shared/config/config-files.d.ts.map +1 -1
- package/dist/shared/config/config-files.js +14 -10
- package/dist/shared/config/config-files.js.map +1 -1
- package/dist/shared/github/github-api.service.d.ts.map +1 -1
- package/dist/shared/github/github-api.service.js +25 -37
- package/dist/shared/github/github-api.service.js.map +1 -1
- package/dist/shared/jenkins/jenkins.service.d.ts +2 -0
- package/dist/shared/jenkins/jenkins.service.d.ts.map +1 -1
- package/dist/shared/jenkins/jenkins.service.js +30 -1
- package/dist/shared/jenkins/jenkins.service.js.map +1 -1
- package/dist/shared/listing.d.ts +9 -0
- package/dist/shared/listing.d.ts.map +1 -0
- package/dist/shared/listing.js +29 -0
- package/dist/shared/listing.js.map +1 -0
- package/docs/ARCHITECTURE.md +29 -0
- package/docs/CREATE-DEPLOYMENT-reference.groovy +1105 -0
- package/package.json +76 -59
- package/templates/jenkins/CREATE-DEPLOYMENT.groovy +1105 -0
- package/templates/jenkins/Jenkinsfile-Mobile-App +759 -759
package/README.md
CHANGED
|
@@ -1,1686 +1,1517 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
-
|
|
180
|
-
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
-
|
|
306
|
-
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
```powershell
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
```
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
```
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
IndraQ
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
```
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
```
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
```
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
```
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
```
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
```
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
```
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
indraq
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
```
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
```
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
```
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
```
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
.
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
.
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
```text
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
```
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
```
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
```
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
```
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
```
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
```
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
indraq
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
indraq
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
indraq
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
```
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
### Can Staging and Production have different mobile outputs?
|
|
1519
|
-
|
|
1520
|
-
Yes. Example:
|
|
1521
|
-
|
|
1522
|
-
```text
|
|
1523
|
-
Staging: Release APK / FAST
|
|
1524
|
-
Production: Release AAB / CLEAN
|
|
1525
|
-
```
|
|
1526
|
-
|
|
1527
|
-
### Can I build an APK once without changing my saved Production AAB default?
|
|
1528
|
-
|
|
1529
|
-
Yes:
|
|
1530
|
-
|
|
1531
|
-
```bash
|
|
1532
|
-
indraq build mobile:prod --output apk
|
|
1533
|
-
```
|
|
1534
|
-
|
|
1535
|
-
The saved default remains unchanged.
|
|
1536
|
-
|
|
1537
|
-
### Does IndraQ save `.env`?
|
|
1538
|
-
|
|
1539
|
-
No. It reads the root `.env` at build time and uploads it separately when required.
|
|
1540
|
-
|
|
1541
|
-
### When does Version/versionCode increment?
|
|
1542
|
-
|
|
1543
|
-
After a **successful** Jenkins mobile build. The build uses the currently saved values first, then enabled counters advance for the next build. Failed/cancelled builds do not consume values.
|
|
1544
|
-
|
|
1545
|
-
### Can I turn auto-increment off?
|
|
1546
|
-
|
|
1547
|
-
Yes:
|
|
1548
|
-
|
|
1549
|
-
```text
|
|
1550
|
-
indraq configure
|
|
1551
|
-
→ Mobile App
|
|
1552
|
-
→ Version & versionCode
|
|
1553
|
-
```
|
|
1554
|
-
|
|
1555
|
-
Version and versionCode have separate switches. When either is OFF, the build continues but IndraQ prints a reminder warning.
|
|
1556
|
-
|
|
1557
|
-
### What timezone is used in APK/AAB filenames?
|
|
1558
|
-
|
|
1559
|
-
Always `Asia/Kolkata` (IST), using `YYYY-MM-DD_HHmm`.
|
|
1560
|
-
|
|
1561
|
-
### Which Jenkins does Mobile use?
|
|
1562
|
-
|
|
1563
|
-
**Production Jenkins only.** This is intentional.
|
|
1564
|
-
|
|
1565
|
-
```text
|
|
1566
|
-
mobile:dev → Production Jenkins
|
|
1567
|
-
mobile:staging → Production Jenkins
|
|
1568
|
-
mobile:prod → Production Jenkins
|
|
1569
|
-
```
|
|
1570
|
-
|
|
1571
|
-
The mobile Development/Staging/Production selection controls the app build environment and allowed output. It does not select a Jenkins controller.
|
|
1572
|
-
|
|
1573
|
-
### Why can Docker use Development and Production Jenkins?
|
|
1574
|
-
|
|
1575
|
-
Docker deployments represent infrastructure environments. `indraq deploy:dev` can deploy through Development Jenkins while `indraq deploy:prod` can use Production Jenkins. Mobile builds are build jobs rather than Docker environment deployments, so they always use the single Production Jenkins path.
|
|
1576
|
-
|
|
1577
|
-
---
|
|
1578
|
-
|
|
1579
|
-
## Project architecture
|
|
1580
|
-
|
|
1581
|
-
```text
|
|
1582
|
-
src/
|
|
1583
|
-
├── cli/
|
|
1584
|
-
│ ├── create-program.ts
|
|
1585
|
-
│ └── doctor.command.ts
|
|
1586
|
-
│
|
|
1587
|
-
├── modules/
|
|
1588
|
-
│ ├── configure/
|
|
1589
|
-
│ │ └── configure.command.ts
|
|
1590
|
-
│ │
|
|
1591
|
-
│ ├── deploy/
|
|
1592
|
-
│ │ ├── commands/
|
|
1593
|
-
│ │ ├── config/
|
|
1594
|
-
│ │ └── services/
|
|
1595
|
-
│ │
|
|
1596
|
-
│ └── mobile/
|
|
1597
|
-
│ ├── commands/
|
|
1598
|
-
│ │ ├── configure-mobile.command.ts
|
|
1599
|
-
│ │ └── build-mobile.command.ts
|
|
1600
|
-
│ ├── config/
|
|
1601
|
-
│ │ └── mobile-config.ts
|
|
1602
|
-
│ └── services/
|
|
1603
|
-
│ ├── project.service.ts
|
|
1604
|
-
│ ├── source-bundle.service.ts
|
|
1605
|
-
│ └── jenkins-mobile.service.ts
|
|
1606
|
-
│
|
|
1607
|
-
└── shared/
|
|
1608
|
-
├── config/
|
|
1609
|
-
├── git/
|
|
1610
|
-
├── github/
|
|
1611
|
-
├── jenkins/
|
|
1612
|
-
└── runtime/
|
|
1613
|
-
|
|
1614
|
-
templates/
|
|
1615
|
-
└── jenkins/
|
|
1616
|
-
└── Jenkinsfile-Mobile-App
|
|
1617
|
-
```
|
|
1618
|
-
|
|
1619
|
-
This is intentional. Future modules can be added without dumping unrelated logic into the deployment module.
|
|
1620
|
-
|
|
1621
|
-
Possible future commands:
|
|
1622
|
-
|
|
1623
|
-
```text
|
|
1624
|
-
indraq database ...
|
|
1625
|
-
indraq backup ...
|
|
1626
|
-
indraq server ...
|
|
1627
|
-
indraq secrets ...
|
|
1628
|
-
indraq diagnostics ...
|
|
1629
|
-
```
|
|
1630
|
-
|
|
1631
|
-
---
|
|
1632
|
-
|
|
1633
|
-
## Final checklist
|
|
1634
|
-
|
|
1635
|
-
### Developer machine
|
|
1636
|
-
|
|
1637
|
-
- [ ] Node.js 22+ installed
|
|
1638
|
-
- [ ] npm installed
|
|
1639
|
-
- [ ] Java available with `java -version`
|
|
1640
|
-
- [ ] Git installed
|
|
1641
|
-
- [ ] `tar` available
|
|
1642
|
-
- [ ] Docker installed if using Docker deployment
|
|
1643
|
-
- [ ] `npm install -g indraq_cli` completed
|
|
1644
|
-
- [ ] `indraq doctor` passes
|
|
1645
|
-
|
|
1646
|
-
### Docker deployment project
|
|
1647
|
-
|
|
1648
|
-
- [ ] `indraq configure → Jenkins → Development/Production`
|
|
1649
|
-
- [ ] `indraq configure → Docker / GHCR`
|
|
1650
|
-
- [ ] Dockerfile exists
|
|
1651
|
-
- [ ] GitHub/GHCR authentication works
|
|
1652
|
-
- [ ] Jenkins deployment job names match image names
|
|
1653
|
-
|
|
1654
|
-
### Mobile project
|
|
1655
|
-
|
|
1656
|
-
- [ ] command is run from package.json root
|
|
1657
|
-
- [ ] Production Jenkins connection configured (`indraq configure → Jenkins → Production`)
|
|
1658
|
-
- [ ] Jenkins File Parameter plugin installed
|
|
1659
|
-
- [ ] Jenkins job uses the v1.5.8 mobile Jenkinsfile
|
|
1660
|
-
- [ ] Mobile project type configured
|
|
1661
|
-
- [ ] Jenkins job is named exactly `Mobile app Cli build` and exists on Production Jenkins
|
|
1662
|
-
- [ ] Development / Staging / Production defaults configured as needed
|
|
1663
|
-
- [ ] root `.env` exists for APK/AAB/debug builds
|
|
1664
|
-
- [ ] Expo Development Client has `expo-dev-client`
|
|
1665
|
-
- [ ] `.indraq/mobile.json` is not ignored and is committed so Version/versionCode survive across developers
|
|
1666
|
-
|
|
1667
|
-
---
|
|
1668
|
-
|
|
1669
|
-
## License
|
|
1670
|
-
|
|
1671
|
-
MIT License. See [`LICENSE`](LICENSE).
|
|
1672
|
-
|
|
1673
|
-
<p align="center">
|
|
1674
|
-
<img src="docs/assets/indraq-mark.png" alt="IndraQ" width="72" />
|
|
1675
|
-
</p>
|
|
1676
|
-
|
|
1677
|
-
<p align="center">
|
|
1678
|
-
<strong>Built and maintained by IndraQ Innovations.</strong>
|
|
1679
|
-
</p>
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
### Jenkins mobile upload returns HTTP 403
|
|
1683
|
-
|
|
1684
|
-
IndraQ CLI v1.5.8 preserves the Jenkins web-session cookie together with the CSRF crumb when a Jenkins username/password is used. Jenkins ties crumbs to the session that created them, so both values must travel together. API-token authentication is exempt from the crumb requirement.
|
|
1685
|
-
|
|
1686
|
-
If a mobile build still returns HTTP 403, v1.5.8 prints Jenkins' own response message. A permission error means the configured Jenkins user needs **Job/Read** and **Job/Build** on the `Mobile app Cli build` job. A CSRF error means the Jenkins controller or reverse proxy is rejecting the crumb/session and the printed Jenkins message should be used for diagnosis.
|
|
1
|
+
# IndraQ CLI
|
|
2
|
+
|
|
3
|
+
IndraQ CLI is a cloud-first developer and DevOps command-line platform for creating projects, configuring reusable infrastructure credentials, managing users, and reconciling deployments across GHCR, Jenkins, AWS Route53, and Nginx Proxy Manager.
|
|
4
|
+
|
|
5
|
+
The goal is simple: developers should work with understandable names such as `production`, `staging`, `api.example.com`, and `order-service` instead of remembering server IP addresses, Jenkins details, registry paths, or provider credentials for every project.
|
|
6
|
+
|
|
7
|
+
## What IndraQ manages
|
|
8
|
+
|
|
9
|
+
IndraQ has two kinds of configuration:
|
|
10
|
+
|
|
11
|
+
### User-level reusable credentials
|
|
12
|
+
|
|
13
|
+
Each IndraQ user owns their own provider credentials. They can reuse the same credentials across all projects they can access.
|
|
14
|
+
|
|
15
|
+
Supported reusable providers:
|
|
16
|
+
|
|
17
|
+
- AWS
|
|
18
|
+
- Nginx Proxy Manager (NPM)
|
|
19
|
+
- Jenkins Development
|
|
20
|
+
- Jenkins Production
|
|
21
|
+
- GitHub Container Registry (GHCR)
|
|
22
|
+
|
|
23
|
+
Credentials are stored in IndraQ Cloud. They are not copied into every project.
|
|
24
|
+
|
|
25
|
+
### Project-level infrastructure
|
|
26
|
+
|
|
27
|
+
Each project stores only the infrastructure associated with that project, for example:
|
|
28
|
+
|
|
29
|
+
- GHCR image repository
|
|
30
|
+
- Jenkins deployment job
|
|
31
|
+
- Route53 record
|
|
32
|
+
- Route53 routing policy
|
|
33
|
+
- Route53 health checks
|
|
34
|
+
- NPM proxy host
|
|
35
|
+
- selected shared environment
|
|
36
|
+
- host/container ports
|
|
37
|
+
|
|
38
|
+
A local IndraQ project keeps the Cloud project ID in `.indraq/project.json`. Provider secrets are not stored in the project folder.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
# 1. Roles and permissions
|
|
43
|
+
|
|
44
|
+
IndraQ Cloud supports three roles.
|
|
45
|
+
|
|
46
|
+
| Role | Main access |
|
|
47
|
+
| --- | --- |
|
|
48
|
+
| `user` | View the organization project catalog, create projects, configure their own provider credentials, use shared environments, run prebuild/deploy only on projects where they have WRITE access, retrieve/rotate their own managed AWS IAM credential |
|
|
49
|
+
| `manager` | Everything a user can do, plus create/manage normal users, rotate managed users' AWS keys, update/delete Cloud projects with a reason, manage project membership/resource access, and view audit logs |
|
|
50
|
+
| `admin` | Full access, including create managers/admins, change roles, rotate any managed AWS key, manage projects/members/resource access, manage shared environments and Route53 health checks, configure AWS policy mappings, and view audit logs |
|
|
51
|
+
|
|
52
|
+
Important rules:
|
|
53
|
+
|
|
54
|
+
- Managers can create normal users only.
|
|
55
|
+
- Only admins can create another manager or admin.
|
|
56
|
+
- Only admins can change a user's IndraQ role.
|
|
57
|
+
- Only admins can create/update/delete shared environments.
|
|
58
|
+
- Every user has their own AWS/NPM/Jenkins/GHCR provider credentials.
|
|
59
|
+
- Shared environments are visible to authenticated users, but only admins manage them.
|
|
60
|
+
- Route53 health checks can be listed/selected by users and managers, but only admins create/delete them.
|
|
61
|
+
- Organization projects are visible to every authenticated user; VIEW vs WRITE controls whether infrastructure can be changed.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
# 2. System architecture
|
|
66
|
+
|
|
67
|
+
A typical installation looks like this:
|
|
68
|
+
|
|
69
|
+
```text
|
|
70
|
+
Developer workstation
|
|
71
|
+
|
|
|
72
|
+
| indraq CLI
|
|
73
|
+
v
|
|
74
|
+
IndraQ Cloud API
|
|
75
|
+
|
|
|
76
|
+
+-- PostgreSQL
|
|
77
|
+
|
|
|
78
|
+
+-- user credentials
|
|
79
|
+
| +-- AWS
|
|
80
|
+
| +-- NPM
|
|
81
|
+
| +-- Jenkins DEV
|
|
82
|
+
| +-- Jenkins PROD
|
|
83
|
+
| +-- GHCR
|
|
84
|
+
|
|
|
85
|
+
+-- shared environments
|
|
86
|
+
|
|
|
87
|
+
+-- projects
|
|
88
|
+
+-- GHCR image
|
|
89
|
+
+-- Jenkins job
|
|
90
|
+
+-- Route53 record / health checks
|
|
91
|
+
+-- NPM proxy
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Example shared environments:
|
|
95
|
+
|
|
96
|
+
```text
|
|
97
|
+
production-api -> 10.0.0.10
|
|
98
|
+
production-backup -> 10.0.0.11
|
|
99
|
+
staging -> 10.0.1.10
|
|
100
|
+
qa -> 10.0.2.20
|
|
101
|
+
client-a -> 192.0.2.25
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Environment names are completely arbitrary. There is no fixed `PRIMARY` or `SECONDARY` environment type.
|
|
105
|
+
|
|
106
|
+
For a Route53 FAILOVER record, the user chooses which environment acts as PRIMARY and which acts as SECONDARY for that particular DNS record.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
# 3. Requirements
|
|
111
|
+
|
|
112
|
+
## CLI workstation
|
|
113
|
+
|
|
114
|
+
Required:
|
|
115
|
+
|
|
116
|
+
- Node.js 22 or newer
|
|
117
|
+
- npm
|
|
118
|
+
- Git
|
|
119
|
+
|
|
120
|
+
Recommended/required depending on the workflow:
|
|
121
|
+
|
|
122
|
+
- Docker, for GHCR image login/build/push
|
|
123
|
+
- network access to IndraQ Cloud API
|
|
124
|
+
- network access to Jenkins/NPM/AWS/GitHub used by that user
|
|
125
|
+
|
|
126
|
+
## Cloud server
|
|
127
|
+
|
|
128
|
+
Required:
|
|
129
|
+
|
|
130
|
+
- Node.js 22 or newer
|
|
131
|
+
- PostgreSQL
|
|
132
|
+
- a persistent `MASTER_KEY`
|
|
133
|
+
- a strong `JWT_SECRET`
|
|
134
|
+
|
|
135
|
+
## Jenkins
|
|
136
|
+
|
|
137
|
+
For deployment creation and unified Jenkins user management, Jenkins must allow the account configured in IndraQ to perform the required administrative operations.
|
|
138
|
+
|
|
139
|
+
The included reference pipeline is:
|
|
140
|
+
|
|
141
|
+
```text
|
|
142
|
+
docs/CREATE-DEPLOYMENT-reference.groovy
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
For its live parameter UI, Jenkins Active Choices is required. Role assignment for Jenkins users requires the Jenkins Role Strategy setup expected by your Jenkins instance.
|
|
146
|
+
|
|
147
|
+
IndraQ handles Jenkins CSRF crumbs together with the Jenkins web session when `/scriptText` administration is required.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
# 4. Install and start IndraQ Cloud API
|
|
152
|
+
|
|
153
|
+
Open the Cloud API folder:
|
|
154
|
+
|
|
155
|
+
```powershell
|
|
156
|
+
cd cloud-api
|
|
157
|
+
npm install
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Copy the example environment file:
|
|
161
|
+
|
|
162
|
+
```powershell
|
|
163
|
+
Copy-Item .env.example .env
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Edit `.env`:
|
|
167
|
+
|
|
168
|
+
```env
|
|
169
|
+
PORT=4010
|
|
170
|
+
DATABASE_URL=postgresql://indraq:change-me@127.0.0.1:5432/indraq_cloud
|
|
171
|
+
JWT_SECRET=replace-with-at-least-32-random-characters
|
|
172
|
+
MASTER_KEY=replace-with-exactly-64-hex-characters
|
|
173
|
+
BOOTSTRAP_ADMIN_EMAIL=admin@example.com
|
|
174
|
+
BOOTSTRAP_ADMIN_PASSWORD=use-a-strong-password
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Requirements:
|
|
178
|
+
|
|
179
|
+
- `JWT_SECRET`: at least 32 characters
|
|
180
|
+
- `MASTER_KEY`: exactly 64 hexadecimal characters (32 bytes)
|
|
181
|
+
- `BOOTSTRAP_ADMIN_PASSWORD`: at least 12 characters
|
|
182
|
+
|
|
183
|
+
Generate a valid master key with Node:
|
|
184
|
+
|
|
185
|
+
```powershell
|
|
186
|
+
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Generate a JWT secret:
|
|
190
|
+
|
|
191
|
+
```powershell
|
|
192
|
+
node -e "console.log(require('crypto').randomBytes(48).toString('hex'))"
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Build and start:
|
|
196
|
+
|
|
197
|
+
```powershell
|
|
198
|
+
npm run build
|
|
199
|
+
npm run dev
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Production start:
|
|
203
|
+
|
|
204
|
+
```powershell
|
|
205
|
+
npm run build
|
|
206
|
+
npm start
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Expected startup message:
|
|
210
|
+
|
|
211
|
+
```text
|
|
212
|
+
IndraQ Cloud API listening on 4010
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Database migrations
|
|
216
|
+
|
|
217
|
+
SQL migrations in `cloud-api/sql/` are applied automatically when the Cloud API starts.
|
|
218
|
+
|
|
219
|
+
You do not normally need to run migration files manually.
|
|
220
|
+
|
|
221
|
+
## Bootstrap administrator
|
|
222
|
+
|
|
223
|
+
If no admin exists, the Cloud API creates the first administrator from:
|
|
224
|
+
|
|
225
|
+
```env
|
|
226
|
+
BOOTSTRAP_ADMIN_EMAIL=...
|
|
227
|
+
BOOTSTRAP_ADMIN_PASSWORD=...
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
After the first administrator is created, remove the bootstrap password from the long-running production environment if your deployment process allows it.
|
|
231
|
+
|
|
232
|
+
Do not change or lose `MASTER_KEY` after secrets have been stored. The same key is required to decrypt provider credentials later.
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
# 5. Build and install the CLI
|
|
237
|
+
|
|
238
|
+
From the repository root:
|
|
239
|
+
|
|
240
|
+
```powershell
|
|
241
|
+
npm install
|
|
242
|
+
npm run build
|
|
243
|
+
npm test
|
|
244
|
+
npm link
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Confirm installation:
|
|
248
|
+
|
|
249
|
+
```powershell
|
|
250
|
+
indraq --version
|
|
251
|
+
indraq --help
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
Run diagnostics:
|
|
255
|
+
|
|
256
|
+
```powershell
|
|
257
|
+
indraq doctor
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
# 6. Login to IndraQ Cloud
|
|
263
|
+
|
|
264
|
+
The official IndraQ Cloud API URL is built into the CLI (`https://api.indraq.com`). Users do not configure a backend URL.
|
|
265
|
+
|
|
266
|
+
After installing the npm package, login directly:
|
|
267
|
+
|
|
268
|
+
```powershell
|
|
269
|
+
indraq login
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Check the active identity:
|
|
273
|
+
|
|
274
|
+
```powershell
|
|
275
|
+
indraq whoami
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
Logout:
|
|
279
|
+
|
|
280
|
+
```powershell
|
|
281
|
+
indraq logout
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
The aliases below also work:
|
|
285
|
+
|
|
286
|
+
```powershell
|
|
287
|
+
indraq cloud login
|
|
288
|
+
indraq cloud whoami
|
|
289
|
+
indraq cloud logout
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
# 7. Shared environments
|
|
295
|
+
|
|
296
|
+
An environment is a friendly name bound to a reusable server IP.
|
|
297
|
+
|
|
298
|
+
Examples:
|
|
299
|
+
|
|
300
|
+
```text
|
|
301
|
+
production
|
|
302
|
+
production-backup
|
|
303
|
+
staging
|
|
304
|
+
qa
|
|
305
|
+
client-a
|
|
306
|
+
mumbai-app-01
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
There is no limit such as one primary and one secondary environment. Admins can create as many environments as required and name them freely.
|
|
310
|
+
|
|
311
|
+
## Create an environment
|
|
312
|
+
|
|
313
|
+
Admin only:
|
|
314
|
+
|
|
315
|
+
```powershell
|
|
316
|
+
indraq environment create
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
The wizard asks for values such as:
|
|
320
|
+
|
|
321
|
+
- environment name
|
|
322
|
+
- description
|
|
323
|
+
- server IPv4 address
|
|
324
|
+
- region (optional/useful for latency routing)
|
|
325
|
+
- audit reason
|
|
326
|
+
|
|
327
|
+
## List environments
|
|
328
|
+
|
|
329
|
+
```powershell
|
|
330
|
+
indraq environment list
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
## Update an environment
|
|
334
|
+
|
|
335
|
+
```powershell
|
|
336
|
+
indraq environment update production
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
## Delete an environment
|
|
340
|
+
|
|
341
|
+
```powershell
|
|
342
|
+
indraq environment delete production
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
Environments are shared infrastructure shortcuts. Provider credentials are still private per IndraQ user.
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
# 8. Configure reusable provider credentials
|
|
350
|
+
|
|
351
|
+
The easiest entry point is:
|
|
352
|
+
|
|
353
|
+
```powershell
|
|
354
|
+
indraq configure
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
Or configure one provider directly:
|
|
358
|
+
|
|
359
|
+
```powershell
|
|
360
|
+
indraq provider configure aws
|
|
361
|
+
indraq provider configure npm
|
|
362
|
+
indraq provider configure jenkins-dev
|
|
363
|
+
indraq provider configure jenkins-prod
|
|
364
|
+
indraq provider configure ghcr
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
List configured provider profiles:
|
|
368
|
+
|
|
369
|
+
```powershell
|
|
370
|
+
indraq provider list
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
Secrets are never printed by `provider list`.
|
|
374
|
+
|
|
375
|
+
## AWS provider
|
|
376
|
+
|
|
377
|
+
```powershell
|
|
378
|
+
indraq provider configure aws
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
The wizard validates AWS access and can configure:
|
|
382
|
+
|
|
383
|
+
- AWS region
|
|
384
|
+
- access key ID
|
|
385
|
+
- secret access key
|
|
386
|
+
- optional session token
|
|
387
|
+
- default hosted zone
|
|
388
|
+
- default managed IAM policies by IndraQ role
|
|
389
|
+
|
|
390
|
+
### AWS policy mapping
|
|
391
|
+
|
|
392
|
+
Admins can define managed policy ARNs for:
|
|
393
|
+
|
|
394
|
+
```text
|
|
395
|
+
USER
|
|
396
|
+
MANAGER
|
|
397
|
+
ADMIN
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
Managers can configure the policy mapping needed for normal users but cannot elevate users to manager/admin.
|
|
401
|
+
|
|
402
|
+
When unified AWS user creation is used, IndraQ applies the policies for the selected Cloud role. If the role changes later, IndraQ removes old IndraQ-managed role policies before applying the new role mapping so stale elevated access is not intentionally retained by the CLI.
|
|
403
|
+
|
|
404
|
+
You can still explicitly provide policies when using low-level IAM commands if required.
|
|
405
|
+
|
|
406
|
+
## Nginx Proxy Manager provider
|
|
407
|
+
|
|
408
|
+
```powershell
|
|
409
|
+
indraq provider configure npm
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
Enter:
|
|
413
|
+
|
|
414
|
+
- NPM URL
|
|
415
|
+
- NPM administrator email
|
|
416
|
+
- NPM administrator password
|
|
417
|
+
|
|
418
|
+
IndraQ validates the credentials before storing them.
|
|
419
|
+
|
|
420
|
+
## Jenkins provider
|
|
421
|
+
|
|
422
|
+
Development Jenkins:
|
|
423
|
+
|
|
424
|
+
```powershell
|
|
425
|
+
indraq provider configure jenkins-dev
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
Production Jenkins:
|
|
429
|
+
|
|
430
|
+
```powershell
|
|
431
|
+
indraq provider configure jenkins-prod
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
Enter:
|
|
435
|
+
|
|
436
|
+
- Jenkins URL
|
|
437
|
+
- Jenkins username
|
|
438
|
+
- Jenkins API token/password
|
|
439
|
+
|
|
440
|
+
IndraQ validates authentication before storing the profile.
|
|
441
|
+
|
|
442
|
+
## GHCR provider
|
|
443
|
+
|
|
444
|
+
```powershell
|
|
445
|
+
indraq provider configure ghcr
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
Enter:
|
|
449
|
+
|
|
450
|
+
- registry host, normally `ghcr.io`
|
|
451
|
+
- GitHub token with the package permissions needed by your workflow
|
|
452
|
+
|
|
453
|
+
After authentication, IndraQ fetches:
|
|
454
|
+
|
|
455
|
+
- the authenticated GitHub account
|
|
456
|
+
- organizations visible to that token
|
|
457
|
+
|
|
458
|
+
The user selects the owner instead of typing a hardcoded organization name.
|
|
459
|
+
|
|
460
|
+
Example generated image path:
|
|
461
|
+
|
|
462
|
+
```text
|
|
463
|
+
ghcr.io/acme-platform/order-service
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
No organization name is hardcoded into IndraQ.
|
|
467
|
+
|
|
468
|
+
If GitHub cannot enumerate the required organization for the supplied token, manual owner entry remains available as a fallback.
|
|
469
|
+
|
|
470
|
+
---
|
|
471
|
+
|
|
472
|
+
# 9. User management
|
|
473
|
+
|
|
474
|
+
Use unified user management when the same person needs accounts across IndraQ Cloud, AWS, NPM, and Jenkins.
|
|
475
|
+
|
|
476
|
+
## Create a user
|
|
477
|
+
|
|
478
|
+
```powershell
|
|
479
|
+
indraq user create
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
The wizard asks for:
|
|
483
|
+
|
|
484
|
+
- username
|
|
485
|
+
- providers to create/manage
|
|
486
|
+
- Cloud role (`user`, `manager`, `admin`) when permitted
|
|
487
|
+
- email
|
|
488
|
+
- temporary first-login password generated by IndraQ (shown once to the operator)
|
|
489
|
+
- provider-specific settings where required
|
|
490
|
+
|
|
491
|
+
You can also use flags:
|
|
492
|
+
|
|
493
|
+
```powershell
|
|
494
|
+
indraq user create hk --providers cloud,aws,npm,jenkins --role user
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
Provider-selection flags also exist:
|
|
498
|
+
|
|
499
|
+
```powershell
|
|
500
|
+
--cloud
|
|
501
|
+
--aws
|
|
502
|
+
--npm
|
|
503
|
+
--jenkins
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
### Role rules
|
|
507
|
+
|
|
508
|
+
Manager creating a user:
|
|
509
|
+
|
|
510
|
+
```text
|
|
511
|
+
allowed role: user
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
Admin creating a user:
|
|
515
|
+
|
|
516
|
+
```text
|
|
517
|
+
allowed roles: user, manager, admin
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
### Unified creation safety
|
|
521
|
+
|
|
522
|
+
Before creating accounts in multiple providers, IndraQ preflights Jenkins administration when Jenkins is selected.
|
|
523
|
+
|
|
524
|
+
If a later provider fails after creation has started, IndraQ performs best-effort rollback of providers created by that command.
|
|
525
|
+
|
|
526
|
+
Always review the provider result summary after a failed operation.
|
|
527
|
+
|
|
528
|
+
## Update a user
|
|
529
|
+
|
|
530
|
+
```powershell
|
|
531
|
+
indraq user update hk
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
Examples:
|
|
535
|
+
|
|
536
|
+
```powershell
|
|
537
|
+
indraq user update hk --role manager
|
|
538
|
+
indraq user update hk --providers cloud,aws
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
Only an admin can change Cloud roles.
|
|
542
|
+
|
|
543
|
+
## Delete a user
|
|
544
|
+
|
|
545
|
+
```powershell
|
|
546
|
+
indraq user delete hk
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
Skip the confirmation only when you intentionally want non-interactive deletion:
|
|
550
|
+
|
|
551
|
+
```powershell
|
|
552
|
+
indraq user delete hk --yes
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
## First login and password reset
|
|
557
|
+
|
|
558
|
+
When a manager/admin creates a Cloud user, IndraQ generates a temporary password. It is intended only for the first login. On first `indraq login`, the user must choose a new password before other Cloud commands are allowed. Managed NPM/Jenkins identities created by the unified user workflow are rotated to the same new password.
|
|
559
|
+
|
|
560
|
+
Self-service password recovery uses an email OTP:
|
|
561
|
+
|
|
562
|
+
```powershell
|
|
563
|
+
indraq password reset
|
|
564
|
+
indraq password reset --email user@example.com --cloud
|
|
565
|
+
indraq password reset --email user@example.com --npm
|
|
566
|
+
indraq password reset --email user@example.com --jenkins
|
|
567
|
+
indraq password reset --email user@example.com --all
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
`--all` means Cloud + NPM + Jenkins. AWS is intentionally excluded because IndraQ AWS users use access keys rather than console passwords. The Cloud API requires SMTP configuration (`SMTP_HOST`, `SMTP_PORT`, `SMTP_SECURE`, `SMTP_USER`, `SMTP_PASS`, `SMTP_FROM`).
|
|
571
|
+
|
|
572
|
+
List/update/delete workflows are searchable and selectable rather than requiring users to remember exact identities. By default list commands return 10 rows; use `--search`, `--limit`, or `--all` where available. This applies to organization users, AWS IAM users/records, NPM users/proxies, Jenkins users/jobs, projects, environments, health checks, and logs.
|
|
573
|
+
|
|
574
|
+
---
|
|
575
|
+
|
|
576
|
+
# 10. AWS IAM CLI users and recoverable access keys
|
|
577
|
+
|
|
578
|
+
AWS does not provide the original secret access key again after access-key creation.
|
|
579
|
+
|
|
580
|
+
When IndraQ creates an AWS IAM user through the unified user workflow, IndraQ stores the generated AWS secret encrypted in IndraQ Cloud and links it to that Cloud user.
|
|
581
|
+
IndraQ also attaches an `IndraQBaseRole` inline IAM policy automatically according to the selected IndraQ `user`, `manager`, or `admin` role. Optional AWS managed-policy mappings configured by an operator are reconciled on top of that base role.
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
The user sees the key at creation time and can retrieve their own stored credential later after logging into their IndraQ account. Access keys can also be rotated through IndraQ without losing the encrypted recovery copy.
|
|
585
|
+
|
|
586
|
+
Create an IAM CLI user directly:
|
|
587
|
+
|
|
588
|
+
```powershell
|
|
589
|
+
indraq iam user:create hk
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
Delete:
|
|
593
|
+
|
|
594
|
+
```powershell
|
|
595
|
+
indraq iam user:delete hk
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
Retrieve the current logged-in user's stored unified AWS credential:
|
|
599
|
+
|
|
600
|
+
```powershell
|
|
601
|
+
indraq iam credentials hk
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
Rotate an access key:
|
|
605
|
+
|
|
606
|
+
```powershell
|
|
607
|
+
indraq iam access-key rotate
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
A normal user can rotate only their own IndraQ-managed AWS key. Managers/admins can select managed organization users across the organization. IndraQ creates the replacement key, stores it encrypted, updates the target user's reusable AWS provider credential, and only then deletes the previous managed key. Rotation is audited. If the IAM user already has two keys, IndraQ stops rather than deleting an unknown/unmanaged key.
|
|
611
|
+
|
|
612
|
+
Important security behavior:
|
|
613
|
+
|
|
614
|
+
- the target Cloud user can retrieve their own stored AWS secret
|
|
615
|
+
- normal users cannot resolve another user's provider credentials
|
|
616
|
+
- retrieval is audited
|
|
617
|
+
- provider-resolution responses use `Cache-Control: no-store`
|
|
618
|
+
- AWS console login profiles are intentionally not created by these IAM CLI-user flows
|
|
619
|
+
|
|
620
|
+
If an AWS key is exposed publicly, rotate/delete it immediately even if IndraQ has an encrypted copy.
|
|
621
|
+
|
|
622
|
+
---
|
|
623
|
+
|
|
624
|
+
# 11. Create a project with `indraq init`
|
|
625
|
+
|
|
626
|
+
The recommended project entry point is:
|
|
627
|
+
|
|
628
|
+
```powershell
|
|
629
|
+
indraq init
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
Or initialize another directory:
|
|
633
|
+
|
|
634
|
+
```powershell
|
|
635
|
+
indraq init my-app
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
## Login check
|
|
639
|
+
|
|
640
|
+
`init` verifies that the user is connected and authenticated to IndraQ Cloud. If required, it guides the user through Cloud configuration/login.
|
|
641
|
+
|
|
642
|
+
## New project
|
|
643
|
+
|
|
644
|
+
The wizard supports:
|
|
645
|
+
|
|
646
|
+
- Frontend
|
|
647
|
+
- Backend
|
|
648
|
+
- Frontend + Backend
|
|
649
|
+
- Mobile App
|
|
650
|
+
|
|
651
|
+
Web/frontend options include supported project templates such as Vite/React/Next/vanilla depending on the selected flow.
|
|
652
|
+
|
|
653
|
+
Backend scaffolding includes Express and optional integrations selected in the wizard.
|
|
654
|
+
|
|
655
|
+
## Dependency installation
|
|
656
|
+
|
|
657
|
+
For web projects, IndraQ links the project to Cloud **before** dependency installation.
|
|
658
|
+
|
|
659
|
+
This is deliberate. If npm is unavailable, a registry is temporarily unreachable, or installation fails, the Cloud project is not lost.
|
|
660
|
+
|
|
661
|
+
IndraQ:
|
|
662
|
+
|
|
663
|
+
1. creates the project files
|
|
664
|
+
2. creates/links the Cloud project
|
|
665
|
+
3. runs npm installation
|
|
666
|
+
4. retries compatible npm execution paths where appropriate
|
|
667
|
+
5. reports any component where installation is still pending
|
|
668
|
+
6. continues the project/infrastructure workflow
|
|
669
|
+
|
|
670
|
+
If npm still cannot install dependencies, the CLI prints the exact folders where you should run:
|
|
671
|
+
|
|
672
|
+
```powershell
|
|
673
|
+
npm install
|
|
674
|
+
```
|
|
675
|
+
|
|
676
|
+
You can intentionally skip installation:
|
|
677
|
+
|
|
678
|
+
```powershell
|
|
679
|
+
indraq init --skip-install
|
|
680
|
+
```
|
|
681
|
+
|
|
682
|
+
Generated npm package names are sanitized so display names containing spaces or uppercase characters do not create invalid package names.
|
|
683
|
+
|
|
684
|
+
## Full setup vs project only
|
|
685
|
+
|
|
686
|
+
After project creation, choose:
|
|
687
|
+
|
|
688
|
+
```text
|
|
689
|
+
Full setup now — GHCR + Jenkins + Route53 + NPM
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
or:
|
|
693
|
+
|
|
694
|
+
```text
|
|
695
|
+
Project only — I will run prebuild later
|
|
696
|
+
```
|
|
697
|
+
|
|
698
|
+
Choosing project-only still leaves a valid Cloud-linked project.
|
|
699
|
+
|
|
700
|
+
Run infrastructure setup later with:
|
|
701
|
+
|
|
702
|
+
```powershell
|
|
703
|
+
indraq prebuild
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
## Existing IndraQ project
|
|
707
|
+
|
|
708
|
+
If `.indraq/project.json` already exists, `init` does not blindly recreate the application.
|
|
709
|
+
|
|
710
|
+
It checks the existing Cloud project and offers to reconcile pending:
|
|
711
|
+
|
|
712
|
+
- GHCR
|
|
713
|
+
- Jenkins
|
|
714
|
+
- Route53
|
|
715
|
+
- NPM
|
|
716
|
+
|
|
717
|
+
This means rerunning `indraq init` is useful when a previous setup was intentionally skipped or interrupted.
|
|
718
|
+
|
|
719
|
+
## Existing non-IndraQ project
|
|
720
|
+
|
|
721
|
+
If files already exist but the folder was not initialized by IndraQ, the CLI warns that generated files may be overwritten.
|
|
722
|
+
|
|
723
|
+
It requires two confirmations, including typing:
|
|
724
|
+
|
|
725
|
+
```text
|
|
726
|
+
OVERWRITE
|
|
727
|
+
```
|
|
728
|
+
|
|
729
|
+
No existing project should be overwritten silently.
|
|
730
|
+
|
|
731
|
+
---
|
|
732
|
+
|
|
733
|
+
# 12. Project Cloud registration and linking
|
|
734
|
+
|
|
735
|
+
## Register an existing application without running `init`
|
|
736
|
+
|
|
737
|
+
If you already have a project and only want IndraQ to manage its Cloud identity/infrastructure, run this from the existing project folder:
|
|
738
|
+
|
|
739
|
+
```powershell
|
|
740
|
+
indraq project create
|
|
741
|
+
```
|
|
742
|
+
|
|
743
|
+
This command is intentionally non-destructive. It:
|
|
744
|
+
|
|
745
|
+
- verifies your IndraQ Cloud login
|
|
746
|
+
- detects sensible defaults from `package.json` when possible
|
|
747
|
+
- asks for project type/framework/port metadata where needed
|
|
748
|
+
- creates the Cloud project
|
|
749
|
+
- creates only `.indraq/project.json` locally
|
|
750
|
+
|
|
751
|
+
It does **not** scaffold source code, run `npm install`, generate a Dockerfile, create AWS records, create NPM proxies, create Jenkins jobs, configure GHCR, run prebuild, or deploy anything.
|
|
752
|
+
|
|
753
|
+
Example for an existing Express API:
|
|
754
|
+
|
|
755
|
+
```powershell
|
|
756
|
+
cd cloud-api
|
|
757
|
+
indraq project create cloud-api --kind backend --framework express --port 4010 --health /health
|
|
758
|
+
```
|
|
759
|
+
|
|
760
|
+
After that you can run infrastructure commands independently:
|
|
761
|
+
|
|
762
|
+
```powershell
|
|
763
|
+
indraq dockerfile create
|
|
764
|
+
indraq jenkins create-deployment
|
|
765
|
+
indraq healthcheck list
|
|
766
|
+
indraq healthcheck create
|
|
767
|
+
indraq healthcheck delete
|
|
768
|
+
|
|
769
|
+
indraq dns create
|
|
770
|
+
indraq proxy create
|
|
771
|
+
```
|
|
772
|
+
|
|
773
|
+
Or reconcile everything later:
|
|
774
|
+
|
|
775
|
+
```powershell
|
|
776
|
+
indraq prebuild
|
|
777
|
+
```
|
|
778
|
+
|
|
779
|
+
If an accessible Cloud project with the same name already exists, IndraQ offers to link the folder to it instead of silently creating a duplicate.
|
|
780
|
+
|
|
781
|
+
## Sync older IndraQ project metadata
|
|
782
|
+
|
|
783
|
+
For folders already initialized by an older IndraQ metadata format, create/update the Cloud project with:
|
|
784
|
+
|
|
785
|
+
```powershell
|
|
786
|
+
indraq project sync
|
|
787
|
+
```
|
|
788
|
+
|
|
789
|
+
Check infrastructure associations:
|
|
790
|
+
|
|
791
|
+
```powershell
|
|
792
|
+
indraq project status
|
|
793
|
+
```
|
|
794
|
+
|
|
795
|
+
The local project file becomes Cloud-oriented and primarily stores the project ID.
|
|
796
|
+
|
|
797
|
+
Example:
|
|
798
|
+
|
|
799
|
+
```json
|
|
800
|
+
{
|
|
801
|
+
"schemaVersion": 3,
|
|
802
|
+
"projectId": "..."
|
|
803
|
+
}
|
|
804
|
+
```
|
|
805
|
+
|
|
806
|
+
Provider passwords/tokens are not supposed to live in that file.
|
|
807
|
+
|
|
808
|
+
## Re-link a folder when `.indraq/project.json` is missing
|
|
809
|
+
|
|
810
|
+
If the local project reference is deleted accidentally, do **not** recreate the project. Run:
|
|
811
|
+
|
|
812
|
+
```powershell
|
|
813
|
+
indraq project link
|
|
814
|
+
```
|
|
815
|
+
|
|
816
|
+
IndraQ lists the Cloud projects the logged-in user is allowed to access. Selecting one recreates only `.indraq/project.json`; application files are not modified.
|
|
817
|
+
|
|
818
|
+
Every authenticated organization user can discover and view the project catalog. `indraq project list` shows whether the current account has `VIEW` or `WRITE` access. Managers/admins can manage project membership with audited reasons:
|
|
819
|
+
|
|
820
|
+
```powershell
|
|
821
|
+
indraq project add user
|
|
822
|
+
indraq project delete user
|
|
823
|
+
```
|
|
824
|
+
|
|
825
|
+
VIEW access allows discovery/linking/inspection. WRITE access is required for infrastructure-changing commands such as prebuild. Cloud project update/delete remains manager/admin controlled and audited.
|
|
826
|
+
|
|
827
|
+
## Project resource access
|
|
828
|
+
|
|
829
|
+
Project membership and provider-resource access are separate. Managers/admins can grant or revoke access to AWS, NPM, Jenkins, or all supported project resources:
|
|
830
|
+
|
|
831
|
+
```powershell
|
|
832
|
+
indraq access add user
|
|
833
|
+
indraq access delete user
|
|
834
|
+
```
|
|
835
|
+
|
|
836
|
+
For AWS, IndraQ generates record-name/record-type/action conditions for granted Route53 records and exact health-check ARN permissions. AWS cannot safely hide individual records if `ListResourceRecordSets` is granted, so normal-user workflows rely on the IndraQ project inventory rather than broad hosted-zone listing.
|
|
837
|
+
|
|
838
|
+
For Jenkins, IndraQ synchronizes Role Strategy item roles for the selected deployment jobs.
|
|
839
|
+
|
|
840
|
+
For NPM, normal users retain NPM's creator-owned `visibility=user` model. IndraQ records project/resource grants but does not switch accounts to `visibility=all`, because that would expose proxy hosts created by other users.
|
|
841
|
+
|
|
842
|
+
---
|
|
843
|
+
|
|
844
|
+
# 13. Prebuild: reconcile the complete web deployment
|
|
845
|
+
|
|
846
|
+
For a Cloud-linked web project, run:
|
|
847
|
+
|
|
848
|
+
```powershell
|
|
849
|
+
indraq prebuild
|
|
850
|
+
```
|
|
851
|
+
|
|
852
|
+
Prebuild is an infrastructure reconciler. It checks what already exists, creates missing resources, and repairs supported stale associations instead of assuming every run starts from zero.
|
|
853
|
+
|
|
854
|
+
Typical order:
|
|
855
|
+
|
|
856
|
+
```text
|
|
857
|
+
User provider credentials
|
|
858
|
+
|
|
|
859
|
+
v
|
|
860
|
+
GHCR project image
|
|
861
|
+
|
|
|
862
|
+
v
|
|
863
|
+
Jenkins host-port validation
|
|
864
|
+
|
|
|
865
|
+
v
|
|
866
|
+
Jenkins deployment job
|
|
867
|
+
|
|
|
868
|
+
v
|
|
869
|
+
Route53 record + selected existing health checks
|
|
870
|
+
|
|
|
871
|
+
v
|
|
872
|
+
Verify Route53 prerequisite
|
|
873
|
+
|
|
|
874
|
+
v
|
|
875
|
+
NPM proxy + SSL
|
|
876
|
+
```
|
|
877
|
+
|
|
878
|
+
## Missing provider configuration
|
|
879
|
+
|
|
880
|
+
If required reusable credentials are missing, IndraQ warns and offers to configure them instead of immediately failing with an unexplained configuration error.
|
|
881
|
+
|
|
882
|
+
## Shared environment or custom target
|
|
883
|
+
|
|
884
|
+
For infrastructure targets, users can select an admin-created shared environment.
|
|
885
|
+
|
|
886
|
+
Where supported, a custom IP/hostname option remains available for exceptional cases.
|
|
887
|
+
|
|
888
|
+
---
|
|
889
|
+
|
|
890
|
+
# 14. Route53 DNS
|
|
891
|
+
|
|
892
|
+
Standalone DNS wizard:
|
|
893
|
+
|
|
894
|
+
```powershell
|
|
895
|
+
indraq dns create
|
|
896
|
+
```
|
|
897
|
+
|
|
898
|
+
Other useful commands:
|
|
899
|
+
|
|
900
|
+
```powershell
|
|
901
|
+
indraq dns zones
|
|
902
|
+
indraq dns records
|
|
903
|
+
indraq dns update
|
|
904
|
+
indraq dns delete
|
|
905
|
+
```
|
|
906
|
+
|
|
907
|
+
Supported routing choices for managed A-record flows:
|
|
908
|
+
|
|
909
|
+
```text
|
|
910
|
+
SIMPLE
|
|
911
|
+
FAILOVER
|
|
912
|
+
WEIGHTED
|
|
913
|
+
LATENCY
|
|
914
|
+
```
|
|
915
|
+
|
|
916
|
+
## FAILOVER
|
|
917
|
+
|
|
918
|
+
For FAILOVER, the user chooses any two environments:
|
|
919
|
+
|
|
920
|
+
```text
|
|
921
|
+
PRIMARY target -> production
|
|
922
|
+
SECONDARY target -> production-backup
|
|
923
|
+
```
|
|
924
|
+
|
|
925
|
+
The environments themselves are not permanently primary/secondary.
|
|
926
|
+
|
|
927
|
+
The same environment can play a different role for another DNS record.
|
|
928
|
+
|
|
929
|
+
## Route53 health checks
|
|
930
|
+
|
|
931
|
+
DNS creation does **not** create health checks automatically. Users and managers select from health checks that already exist in Route53. Only an IndraQ admin can create or delete health checks:
|
|
932
|
+
|
|
933
|
+
```powershell
|
|
934
|
+
indraq healthcheck list
|
|
935
|
+
indraq healthcheck create
|
|
936
|
+
indraq healthcheck delete
|
|
937
|
+
```
|
|
938
|
+
|
|
939
|
+
`healthcheck list` is available for selection/search. `healthcheck create` asks for the real AWS endpoint settings (IP/FQDN, protocol, port, path where applicable, request interval, failure threshold, and latency measurement).
|
|
940
|
+
|
|
941
|
+
Routing behavior is enforced:
|
|
942
|
+
|
|
943
|
+
- `SIMPLE`: no health check is attached.
|
|
944
|
+
- `FAILOVER`: select existing PRIMARY and SECONDARY health checks.
|
|
945
|
+
- `WEIGHTED` / `LATENCY`: attaching an existing health check is optional.
|
|
946
|
+
|
|
947
|
+
## WEIGHTED
|
|
948
|
+
|
|
949
|
+
IndraQ asks for primary/secondary weights.
|
|
950
|
+
|
|
951
|
+
## LATENCY
|
|
952
|
+
|
|
953
|
+
IndraQ asks for the AWS regions associated with the selected targets when required.
|
|
954
|
+
|
|
955
|
+
## SIMPLE
|
|
956
|
+
|
|
957
|
+
Only one target is required.
|
|
958
|
+
|
|
959
|
+
---
|
|
960
|
+
|
|
961
|
+
# 15. Nginx Proxy Manager proxy and SSL
|
|
962
|
+
|
|
963
|
+
Standalone proxy creation:
|
|
964
|
+
|
|
965
|
+
```powershell
|
|
966
|
+
indraq proxy create api.example.com
|
|
967
|
+
```
|
|
968
|
+
|
|
969
|
+
Update/delete:
|
|
970
|
+
|
|
971
|
+
```powershell
|
|
972
|
+
indraq proxy update api.example.com
|
|
973
|
+
indraq proxy delete api.example.com
|
|
974
|
+
```
|
|
975
|
+
|
|
976
|
+
## Route53 prerequisite
|
|
977
|
+
|
|
978
|
+
IndraQ verifies that the exact Route53 record exists before creating a new NPM proxy host.
|
|
979
|
+
|
|
980
|
+
If the DNS record is missing, proxy creation stops before NPM creation. This avoids creating a proxy/certificate flow for a domain that has not been routed yet.
|
|
981
|
+
|
|
982
|
+
## Forward target
|
|
983
|
+
|
|
984
|
+
The user can select a shared environment, for example:
|
|
985
|
+
|
|
986
|
+
```text
|
|
987
|
+
production — 10.0.0.10
|
|
988
|
+
staging — 10.0.1.10
|
|
989
|
+
```
|
|
990
|
+
|
|
991
|
+
or choose a custom IP/hostname.
|
|
992
|
+
|
|
993
|
+
## SSL choices
|
|
994
|
+
|
|
995
|
+
NPM creation includes explicit SSL selection:
|
|
996
|
+
|
|
997
|
+
```text
|
|
998
|
+
Request Let's Encrypt certificate
|
|
999
|
+
Use an existing NPM certificate
|
|
1000
|
+
No SSL
|
|
1001
|
+
```
|
|
1002
|
+
|
|
1003
|
+
For Let's Encrypt, IndraQ asks for the required email and certificate options.
|
|
1004
|
+
|
|
1005
|
+
For an existing certificate, IndraQ lists available NPM certificates when possible so users do not have to remember a certificate ID.
|
|
1006
|
+
|
|
1007
|
+
---
|
|
1008
|
+
|
|
1009
|
+
# 16. Jenkins deployment and port validation
|
|
1010
|
+
|
|
1011
|
+
IndraQ checks the requested host port before final deployment creation.
|
|
1012
|
+
|
|
1013
|
+
If the port is busy, the CLI reports it immediately and suggests available alternatives instead of waiting for a pipeline failure.
|
|
1014
|
+
|
|
1015
|
+
Conceptually:
|
|
1016
|
+
|
|
1017
|
+
```text
|
|
1018
|
+
Requested port: 6200
|
|
1019
|
+
|
|
|
1020
|
+
+-- free -> continue
|
|
1021
|
+
|
|
|
1022
|
+
+-- busy -> show suggested free ports -> ask again
|
|
1023
|
+
```
|
|
1024
|
+
|
|
1025
|
+
Jenkins remains the final authority and should still validate the port during the pipeline/deployment itself.
|
|
1026
|
+
|
|
1027
|
+
## Create only the Jenkins deployment
|
|
1028
|
+
|
|
1029
|
+
If DNS/NPM setup is not wanted yet, trigger only the Jenkins seed job:
|
|
1030
|
+
|
|
1031
|
+
```powershell
|
|
1032
|
+
indraq jenkins create-deployment
|
|
1033
|
+
```
|
|
1034
|
+
|
|
1035
|
+
This performs the aggressive host-port check, uses the selected user's GHCR owner/image, invokes `CREATE-DEPLOYMENT`, records the Jenkins project resource, and does **not** modify Route53 or NPM.
|
|
1036
|
+
|
|
1037
|
+
Create/reconcile deployment infrastructure:
|
|
1038
|
+
|
|
1039
|
+
```powershell
|
|
1040
|
+
indraq deployment create
|
|
1041
|
+
```
|
|
1042
|
+
|
|
1043
|
+
This is backed by the same prebuild reconciliation flow.
|
|
1044
|
+
|
|
1045
|
+
Run an existing configured deployment:
|
|
1046
|
+
|
|
1047
|
+
```powershell
|
|
1048
|
+
indraq deployment run --env production
|
|
1049
|
+
```
|
|
1050
|
+
|
|
1051
|
+
Build/push/deploy:
|
|
1052
|
+
|
|
1053
|
+
```powershell
|
|
1054
|
+
indraq deploy build --env production
|
|
1055
|
+
```
|
|
1056
|
+
|
|
1057
|
+
The shared environment name is not restricted to `dev` or `prod`.
|
|
1058
|
+
|
|
1059
|
+
---
|
|
1060
|
+
|
|
1061
|
+
# 17. GHCR image naming
|
|
1062
|
+
|
|
1063
|
+
The image path is built from the authenticated user's selected registry owner.
|
|
1064
|
+
|
|
1065
|
+
Example provider configuration:
|
|
1066
|
+
|
|
1067
|
+
```text
|
|
1068
|
+
Registry: ghcr.io
|
|
1069
|
+
Owner: acme-platform
|
|
1070
|
+
```
|
|
1071
|
+
|
|
1072
|
+
Project:
|
|
1073
|
+
|
|
1074
|
+
```text
|
|
1075
|
+
order-service
|
|
1076
|
+
```
|
|
1077
|
+
|
|
1078
|
+
Generated repository:
|
|
1079
|
+
|
|
1080
|
+
```text
|
|
1081
|
+
ghcr.io/acme-platform/order-service
|
|
1082
|
+
```
|
|
1083
|
+
|
|
1084
|
+
For full-stack projects, components can use separate image names, for example:
|
|
1085
|
+
|
|
1086
|
+
```text
|
|
1087
|
+
ghcr.io/acme-platform/order-service-frontend
|
|
1088
|
+
ghcr.io/acme-platform/order-service-backend
|
|
1089
|
+
```
|
|
1090
|
+
|
|
1091
|
+
---
|
|
1092
|
+
|
|
1093
|
+
# 18. NPM user management
|
|
1094
|
+
|
|
1095
|
+
Create:
|
|
1096
|
+
|
|
1097
|
+
```powershell
|
|
1098
|
+
indraq npm-user create
|
|
1099
|
+
```
|
|
1100
|
+
|
|
1101
|
+
Update:
|
|
1102
|
+
|
|
1103
|
+
```powershell
|
|
1104
|
+
indraq npm-user update user@example.com
|
|
1105
|
+
```
|
|
1106
|
+
|
|
1107
|
+
Delete:
|
|
1108
|
+
|
|
1109
|
+
```powershell
|
|
1110
|
+
indraq npm-user delete user@example.com
|
|
1111
|
+
```
|
|
1112
|
+
|
|
1113
|
+
These commands use the current logged-in user's reusable NPM provider credential.
|
|
1114
|
+
|
|
1115
|
+
---
|
|
1116
|
+
|
|
1117
|
+
# 19. Dockerfile generation
|
|
1118
|
+
|
|
1119
|
+
For an existing project:
|
|
1120
|
+
|
|
1121
|
+
```powershell
|
|
1122
|
+
indraq dockerfile create
|
|
1123
|
+
```
|
|
1124
|
+
|
|
1125
|
+
IndraQ does not try to guess which source/configuration files your application needs. Generated Dockerfiles copy the complete Docker build context with `COPY . .`; `.dockerignore` is the source of truth for files that must stay out of the image.
|
|
1126
|
+
|
|
1127
|
+
Generated Alpine runtime images install `curl`, and Docker health checks use `curl -fsS`. This keeps container health validation available for Node and Nginx images without relying on whichever BusyBox utilities happen to be present.
|
|
1128
|
+
|
|
1129
|
+
The generated `.dockerignore` excludes local dependencies, Git/IndraQ metadata, logs, coverage, caches, and previous build output. IndraQ intentionally does **not** ignore `.env` or `.env.*` files, so environment files present in the project directory are included in the Docker build context and baked into the resulting image according to the company's deployment policy.
|
|
1130
|
+
|
|
1131
|
+
For Node backends and Next.js applications, the runtime stage copies the complete filtered build tree from the build stage, including generated output and production dependencies. For Vite/React static frontends, the build stage receives the complete filtered project context and Nginx serves only the compiled output directory.
|
|
1132
|
+
|
|
1133
|
+
Dependency installation also works whether the project has a `package-lock.json` or not: IndraQ uses `npm ci` when a lockfile exists and falls back to `npm install` otherwise.
|
|
1134
|
+
|
|
1135
|
+
Optional flags include framework, Node version, port, health endpoint, Compose generation, output directory, and force overwrite.
|
|
1136
|
+
|
|
1137
|
+
Use command help for the current options:
|
|
1138
|
+
|
|
1139
|
+
```powershell
|
|
1140
|
+
indraq dockerfile create --help
|
|
1141
|
+
```
|
|
1142
|
+
|
|
1143
|
+
---
|
|
1144
|
+
|
|
1145
|
+
# 20. Mobile projects
|
|
1146
|
+
|
|
1147
|
+
IndraQ also includes mobile project configuration/build commands.
|
|
1148
|
+
|
|
1149
|
+
See:
|
|
1150
|
+
|
|
1151
|
+
```powershell
|
|
1152
|
+
indraq help mobile
|
|
1153
|
+
```
|
|
1154
|
+
|
|
1155
|
+
or:
|
|
1156
|
+
|
|
1157
|
+
```powershell
|
|
1158
|
+
indraq build --help
|
|
1159
|
+
```
|
|
1160
|
+
|
|
1161
|
+
Web deployment reconciliation through Route53/NPM is intended for web frontend/backend components. Mobile build behavior is separate.
|
|
1162
|
+
|
|
1163
|
+
---
|
|
1164
|
+
|
|
1165
|
+
# 21. Audit logs
|
|
1166
|
+
|
|
1167
|
+
Managers and admins can view audit logs:
|
|
1168
|
+
|
|
1169
|
+
```powershell
|
|
1170
|
+
indraq logs
|
|
1171
|
+
```
|
|
1172
|
+
|
|
1173
|
+
Sensitive Cloud/provider actions use audit reasons so administrative changes can be traced.
|
|
1174
|
+
|
|
1175
|
+
Examples include:
|
|
1176
|
+
|
|
1177
|
+
- user creation/deletion
|
|
1178
|
+
- provider credential changes
|
|
1179
|
+
- AWS credential storage/resolution
|
|
1180
|
+
- environment changes
|
|
1181
|
+
- project resource reconciliation
|
|
1182
|
+
|
|
1183
|
+
---
|
|
1184
|
+
|
|
1185
|
+
# 22. Doctor
|
|
1186
|
+
|
|
1187
|
+
Run:
|
|
1188
|
+
|
|
1189
|
+
```powershell
|
|
1190
|
+
indraq doctor
|
|
1191
|
+
```
|
|
1192
|
+
|
|
1193
|
+
Doctor checks the local IndraQ/Node environment and useful project/provider conditions.
|
|
1194
|
+
|
|
1195
|
+
Use it when setup feels inconsistent before manually editing local configuration files.
|
|
1196
|
+
|
|
1197
|
+
---
|
|
1198
|
+
|
|
1199
|
+
# 23. Recommended first-time setup
|
|
1200
|
+
|
|
1201
|
+
## Administrator
|
|
1202
|
+
|
|
1203
|
+
1. Start IndraQ Cloud API.
|
|
1204
|
+
2. Login as bootstrap admin.
|
|
1205
|
+
3. Create shared environments.
|
|
1206
|
+
4. Configure your own provider credentials.
|
|
1207
|
+
5. Configure AWS role-policy mappings if unified AWS user creation will be used.
|
|
1208
|
+
6. Create managers/users as required.
|
|
1209
|
+
|
|
1210
|
+
Example:
|
|
1211
|
+
|
|
1212
|
+
```powershell
|
|
1213
|
+
indraq login
|
|
1214
|
+
indraq environment create
|
|
1215
|
+
indraq environment create
|
|
1216
|
+
indraq provider configure aws
|
|
1217
|
+
indraq provider configure npm
|
|
1218
|
+
indraq provider configure jenkins-dev
|
|
1219
|
+
indraq provider configure jenkins-prod
|
|
1220
|
+
indraq provider configure ghcr
|
|
1221
|
+
indraq user create
|
|
1222
|
+
```
|
|
1223
|
+
|
|
1224
|
+
## Developer
|
|
1225
|
+
|
|
1226
|
+
1. Login to IndraQ Cloud.
|
|
1227
|
+
2. Configure the provider credentials that belong to you.
|
|
1228
|
+
3. Run `indraq init`.
|
|
1229
|
+
4. Select full infrastructure setup, or skip it and run `indraq prebuild` later.
|
|
1230
|
+
5. Start coding.
|
|
1231
|
+
|
|
1232
|
+
Example:
|
|
1233
|
+
|
|
1234
|
+
```powershell
|
|
1235
|
+
indraq login
|
|
1236
|
+
indraq configure
|
|
1237
|
+
indraq init my-service
|
|
1238
|
+
```
|
|
1239
|
+
|
|
1240
|
+
---
|
|
1241
|
+
|
|
1242
|
+
# 24. Recommended daily workflow
|
|
1243
|
+
|
|
1244
|
+
Inside an existing project:
|
|
1245
|
+
|
|
1246
|
+
```powershell
|
|
1247
|
+
indraq whoami
|
|
1248
|
+
indraq project status
|
|
1249
|
+
indraq prebuild
|
|
1250
|
+
indraq deploy build --env production
|
|
1251
|
+
```
|
|
1252
|
+
|
|
1253
|
+
You do not need to re-enter AWS/NPM/Jenkins/GHCR credentials for every project.
|
|
1254
|
+
|
|
1255
|
+
---
|
|
1256
|
+
|
|
1257
|
+
# 25. Common troubleshooting
|
|
1258
|
+
|
|
1259
|
+
## `npm install` fails during `indraq init`
|
|
1260
|
+
|
|
1261
|
+
IndraQ links the Cloud project before dependency installation and should preserve setup even when installation fails.
|
|
1262
|
+
|
|
1263
|
+
Look for the component paths printed by the CLI, then run:
|
|
1264
|
+
|
|
1265
|
+
```powershell
|
|
1266
|
+
cd <component-folder>
|
|
1267
|
+
npm install
|
|
1268
|
+
```
|
|
1269
|
+
|
|
1270
|
+
Also verify:
|
|
1271
|
+
|
|
1272
|
+
```powershell
|
|
1273
|
+
node --version
|
|
1274
|
+
npm --version
|
|
1275
|
+
npm config get registry
|
|
1276
|
+
```
|
|
1277
|
+
|
|
1278
|
+
Use Node.js 22 or newer.
|
|
1279
|
+
|
|
1280
|
+
## Jenkins returns `403 No valid crumb was included`
|
|
1281
|
+
|
|
1282
|
+
The current Jenkins administration client fetches the Jenkins crumb together with its session cookies and sends them together to `/scriptText`.
|
|
1283
|
+
|
|
1284
|
+
If a 403 continues:
|
|
1285
|
+
|
|
1286
|
+
- verify the configured Jenkins account can access the required administration endpoint
|
|
1287
|
+
- verify reverse proxies are not stripping session cookies/headers
|
|
1288
|
+
- verify Jenkins security settings/plugins expected by your setup
|
|
1289
|
+
- prefer a Jenkins API token where appropriate
|
|
1290
|
+
|
|
1291
|
+
Run the provider configuration again if credentials changed:
|
|
1292
|
+
|
|
1293
|
+
```powershell
|
|
1294
|
+
indraq provider configure jenkins-dev
|
|
1295
|
+
```
|
|
1296
|
+
|
|
1297
|
+
or:
|
|
1298
|
+
|
|
1299
|
+
```powershell
|
|
1300
|
+
indraq provider configure jenkins-prod
|
|
1301
|
+
```
|
|
1302
|
+
|
|
1303
|
+
## Port is already in use
|
|
1304
|
+
|
|
1305
|
+
IndraQ should detect the busy Jenkins host port before creating the deployment and offer suggested alternatives.
|
|
1306
|
+
|
|
1307
|
+
Choose another suggested port and continue.
|
|
1308
|
+
|
|
1309
|
+
## NPM proxy creation says Route53 is missing
|
|
1310
|
+
|
|
1311
|
+
Create/reconcile DNS first:
|
|
1312
|
+
|
|
1313
|
+
```powershell
|
|
1314
|
+
indraq dns create
|
|
1315
|
+
```
|
|
1316
|
+
|
|
1317
|
+
or run:
|
|
1318
|
+
|
|
1319
|
+
```powershell
|
|
1320
|
+
indraq prebuild
|
|
1321
|
+
```
|
|
1322
|
+
|
|
1323
|
+
Then retry the proxy.
|
|
1324
|
+
|
|
1325
|
+
## GHCR organization is missing from the selection
|
|
1326
|
+
|
|
1327
|
+
The organization list is based on what the GitHub token can see.
|
|
1328
|
+
|
|
1329
|
+
Check token access. If the required owner still cannot be enumerated, use the manual-owner fallback in the GHCR provider wizard.
|
|
1330
|
+
|
|
1331
|
+
## AWS secret is not visible in AWS anymore
|
|
1332
|
+
|
|
1333
|
+
AWS does not re-display an existing secret access key.
|
|
1334
|
+
|
|
1335
|
+
If the AWS user was created through IndraQ's unified user workflow and the encrypted credential was stored successfully, the logged-in target user can run:
|
|
1336
|
+
|
|
1337
|
+
```powershell
|
|
1338
|
+
indraq iam credentials <aws-username>
|
|
1339
|
+
```
|
|
1340
|
+
|
|
1341
|
+
Otherwise rotate/create a new AWS access key rather than attempting to recover an unavailable secret from AWS.
|
|
1342
|
+
|
|
1343
|
+
## Cloud API refuses to start because of `MASTER_KEY`
|
|
1344
|
+
|
|
1345
|
+
`MASTER_KEY` must be exactly 64 hexadecimal characters.
|
|
1346
|
+
|
|
1347
|
+
Generate one with:
|
|
1348
|
+
|
|
1349
|
+
```powershell
|
|
1350
|
+
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
|
|
1351
|
+
```
|
|
1352
|
+
|
|
1353
|
+
Do not replace an existing production master key if encrypted credentials already exist.
|
|
1354
|
+
|
|
1355
|
+
---
|
|
1356
|
+
|
|
1357
|
+
# 26. Security model
|
|
1358
|
+
|
|
1359
|
+
## Passwords
|
|
1360
|
+
|
|
1361
|
+
IndraQ Cloud account passwords are hashed with bcrypt.
|
|
1362
|
+
|
|
1363
|
+
## Reusable provider secrets
|
|
1364
|
+
|
|
1365
|
+
Provider secrets must be usable again for AWS/Jenkins/NPM/GHCR API calls, so they cannot be stored as one-way password hashes.
|
|
1366
|
+
|
|
1367
|
+
They are encrypted at rest using AES-256-GCM with the Cloud API `MASTER_KEY`.
|
|
1368
|
+
|
|
1369
|
+
## Project files
|
|
1370
|
+
|
|
1371
|
+
Project folders should not contain reusable provider secrets.
|
|
1372
|
+
|
|
1373
|
+
The normal design is:
|
|
1374
|
+
|
|
1375
|
+
```text
|
|
1376
|
+
local project -> project ID
|
|
1377
|
+
Cloud user -> reusable encrypted provider credentials
|
|
1378
|
+
Cloud project -> infrastructure associations
|
|
1379
|
+
```
|
|
1380
|
+
|
|
1381
|
+
## AWS IAM users
|
|
1382
|
+
|
|
1383
|
+
IndraQ's IAM-user flow is intended for CLI/API users. AWS console login profiles are intentionally not created.
|
|
1384
|
+
|
|
1385
|
+
## Exposed credentials
|
|
1386
|
+
|
|
1387
|
+
If any AWS key, GitHub token, Jenkins token, NPM password, or other credential is pasted into logs/chat/tickets or otherwise exposed, rotate it immediately. Encryption in IndraQ Cloud does not make a publicly exposed credential safe.
|
|
1388
|
+
|
|
1389
|
+
---
|
|
1390
|
+
|
|
1391
|
+
# 27. Main command reference
|
|
1392
|
+
|
|
1393
|
+
Use `--help` on any command for the authoritative current flags.
|
|
1394
|
+
|
|
1395
|
+
```text
|
|
1396
|
+
indraq configure
|
|
1397
|
+
indraq doctor
|
|
1398
|
+
|
|
1399
|
+
indraq login
|
|
1400
|
+
indraq logout
|
|
1401
|
+
indraq whoami
|
|
1402
|
+
|
|
1403
|
+
indraq environment create
|
|
1404
|
+
indraq environment list
|
|
1405
|
+
indraq environment update
|
|
1406
|
+
indraq environment delete
|
|
1407
|
+
|
|
1408
|
+
indraq provider configure
|
|
1409
|
+
indraq provider list
|
|
1410
|
+
|
|
1411
|
+
indraq user list
|
|
1412
|
+
indraq user create
|
|
1413
|
+
indraq user update
|
|
1414
|
+
indraq user delete
|
|
1415
|
+
indraq password reset
|
|
1416
|
+
|
|
1417
|
+
indraq iam user:create
|
|
1418
|
+
indraq iam user:delete
|
|
1419
|
+
indraq iam credentials
|
|
1420
|
+
|
|
1421
|
+
indraq dns zones
|
|
1422
|
+
indraq dns records
|
|
1423
|
+
indraq dns create
|
|
1424
|
+
indraq dns update
|
|
1425
|
+
indraq dns delete
|
|
1426
|
+
|
|
1427
|
+
indraq proxy create
|
|
1428
|
+
indraq proxy update
|
|
1429
|
+
indraq proxy delete
|
|
1430
|
+
|
|
1431
|
+
indraq npm-user create
|
|
1432
|
+
indraq npm-user update
|
|
1433
|
+
indraq npm-user delete
|
|
1434
|
+
|
|
1435
|
+
indraq init
|
|
1436
|
+
indraq project create
|
|
1437
|
+
indraq project link
|
|
1438
|
+
indraq project sync
|
|
1439
|
+
indraq project status
|
|
1440
|
+
indraq prebuild
|
|
1441
|
+
|
|
1442
|
+
indraq deployment create
|
|
1443
|
+
indraq deployment run
|
|
1444
|
+
indraq deploy build
|
|
1445
|
+
|
|
1446
|
+
indraq dockerfile create
|
|
1447
|
+
indraq logs
|
|
1448
|
+
```
|
|
1449
|
+
|
|
1450
|
+
For the complete live command reference:
|
|
1451
|
+
|
|
1452
|
+
```powershell
|
|
1453
|
+
indraq --help
|
|
1454
|
+
```
|
|
1455
|
+
|
|
1456
|
+
---
|
|
1457
|
+
|
|
1458
|
+
# 28. Legacy compatibility commands
|
|
1459
|
+
|
|
1460
|
+
Provider credentials now live directly in IndraQ Cloud.
|
|
1461
|
+
|
|
1462
|
+
The old-style credential commands remain only for compatibility:
|
|
1463
|
+
|
|
1464
|
+
```powershell
|
|
1465
|
+
indraq credentials sync
|
|
1466
|
+
indraq credentials restore
|
|
1467
|
+
```
|
|
1468
|
+
|
|
1469
|
+
They do not represent the recommended local-file-to-Cloud workflow.
|
|
1470
|
+
|
|
1471
|
+
Use instead:
|
|
1472
|
+
|
|
1473
|
+
```powershell
|
|
1474
|
+
indraq provider configure <provider>
|
|
1475
|
+
indraq provider list
|
|
1476
|
+
```
|
|
1477
|
+
|
|
1478
|
+
---
|
|
1479
|
+
|
|
1480
|
+
# 29. Release verification
|
|
1481
|
+
|
|
1482
|
+
Before deploying or distributing the CLI, run:
|
|
1483
|
+
|
|
1484
|
+
```powershell
|
|
1485
|
+
npm install
|
|
1486
|
+
npm run build
|
|
1487
|
+
npm test
|
|
1488
|
+
```
|
|
1489
|
+
|
|
1490
|
+
Cloud API:
|
|
1491
|
+
|
|
1492
|
+
```powershell
|
|
1493
|
+
cd cloud-api
|
|
1494
|
+
npm install
|
|
1495
|
+
npm run build
|
|
1496
|
+
```
|
|
1497
|
+
|
|
1498
|
+
Then perform a real integration test in your own environment because mocked regression tests cannot verify private AWS, Jenkins, NPM, GHCR, DNS, firewall, or server configuration.
|
|
1499
|
+
|
|
1500
|
+
A useful end-to-end test is:
|
|
1501
|
+
|
|
1502
|
+
1. login
|
|
1503
|
+
2. create/list environments
|
|
1504
|
+
3. configure provider credentials
|
|
1505
|
+
4. create a disposable project with `indraq init`
|
|
1506
|
+
5. choose full setup
|
|
1507
|
+
6. verify Jenkins port validation
|
|
1508
|
+
7. verify Route53 routing and AWS health checks
|
|
1509
|
+
8. verify NPM SSL/proxy
|
|
1510
|
+
9. verify GHCR image owner/path
|
|
1511
|
+
10. rerun `indraq prebuild` and confirm resources are reconciled rather than duplicated
|
|
1512
|
+
|
|
1513
|
+
---
|
|
1514
|
+
|
|
1515
|
+
# License
|
|
1516
|
+
|
|
1517
|
+
MIT. See `LICENSE`.
|