@wocker/ws 1.0.25 → 1.0.26

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.
Files changed (114) hide show
  1. package/README.md +1 -1
  2. package/lib/AppModule.d.ts +0 -4
  3. package/lib/AppModule.js +6 -44
  4. package/lib/env.d.ts +2 -3
  5. package/lib/env.js +12 -42
  6. package/lib/main.d.ts +2 -3
  7. package/lib/main.js +23 -25
  8. package/lib/makes/GithubClient.d.ts +24 -3
  9. package/lib/makes/GithubClient.js +20 -6
  10. package/lib/makes/Version.d.ts +22 -0
  11. package/lib/makes/Version.js +59 -0
  12. package/lib/makes/VersionRange.d.ts +6 -0
  13. package/lib/makes/VersionRange.js +18 -0
  14. package/lib/makes/VersionRule.d.ts +24 -0
  15. package/lib/makes/VersionRule.js +68 -0
  16. package/lib/makes/index.d.ts +2 -0
  17. package/lib/makes/index.js +2 -0
  18. package/lib/modules/core/index.js +7 -26
  19. package/lib/modules/dns/controllers/DnsController.d.ts +7 -0
  20. package/lib/modules/dns/controllers/DnsController.js +47 -0
  21. package/lib/modules/dns/index.d.ts +4 -0
  22. package/lib/modules/dns/index.js +41 -0
  23. package/lib/modules/dns/services/DnsService.d.ts +10 -0
  24. package/lib/modules/dns/services/DnsService.js +77 -0
  25. package/lib/modules/docker/services/ComposeService.d.ts +1 -1
  26. package/lib/modules/docker/services/ComposeService.js +0 -2
  27. package/lib/modules/docker/services/ContainerService.d.ts +1 -1
  28. package/lib/modules/docker/services/DockerService.js +0 -1
  29. package/lib/modules/docker/services/ModemService.d.ts +0 -1
  30. package/lib/modules/docker/services/ModemService.js +0 -1
  31. package/lib/modules/index.d.ts +3 -0
  32. package/lib/modules/index.js +3 -0
  33. package/lib/modules/keystore/controllers/KeystoreController.d.ts +0 -3
  34. package/lib/modules/keystore/controllers/KeystoreController.js +3 -54
  35. package/lib/modules/keystore/services/KeystoreService.d.ts +1 -0
  36. package/lib/modules/keystore/services/KeystoreService.js +4 -0
  37. package/lib/modules/keystore/utils/createEncryptionKey.d.ts +1 -1
  38. package/lib/modules/package-manager/index.d.ts +5 -0
  39. package/lib/modules/package-manager/index.js +33 -0
  40. package/lib/modules/package-manager/providers/NpmProvider.d.ts +7 -0
  41. package/lib/modules/package-manager/providers/NpmProvider.js +39 -0
  42. package/lib/modules/package-manager/providers/PnpmProvider.d.ts +7 -0
  43. package/lib/modules/package-manager/providers/PnpmProvider.js +30 -0
  44. package/lib/modules/package-manager/providers/YarnProvider.d.ts +7 -0
  45. package/lib/modules/package-manager/providers/YarnProvider.js +29 -0
  46. package/lib/modules/package-manager/service/PackageManager.d.ts +10 -0
  47. package/lib/modules/package-manager/service/PackageManager.js +70 -0
  48. package/lib/modules/package-manager/service/RegistryService.d.ts +4 -0
  49. package/lib/{services/NpmService.js → modules/package-manager/service/RegistryService.js} +6 -11
  50. package/lib/modules/package-manager/types/Package.d.ts +4 -0
  51. package/lib/modules/package-manager/types/PackageInfo.js +2 -0
  52. package/lib/modules/package-manager/types/PackageManagerProvider.d.ts +6 -0
  53. package/lib/modules/package-manager/types/PackageManagerProvider.js +6 -0
  54. package/lib/{controllers → modules/plugin/controllers}/PluginController.d.ts +2 -2
  55. package/lib/{controllers → modules/plugin/controllers}/PluginController.js +21 -20
  56. package/lib/modules/plugin/index.d.ts +4 -0
  57. package/lib/modules/plugin/index.js +67 -0
  58. package/lib/{services → modules/plugin/services}/PluginService.d.ts +7 -5
  59. package/lib/{services → modules/plugin/services}/PluginService.js +38 -40
  60. package/lib/modules/preset/controllers/PresetController.d.ts +1 -1
  61. package/lib/modules/preset/controllers/PresetController.js +12 -6
  62. package/lib/modules/preset/services/PresetService.d.ts +2 -1
  63. package/lib/modules/preset/services/PresetService.js +73 -13
  64. package/lib/modules/project/controllers/ProjectController.d.ts +37 -2
  65. package/lib/modules/project/controllers/ProjectController.js +837 -7
  66. package/lib/modules/project/controllers/SecretsController.d.ts +8 -0
  67. package/lib/modules/project/controllers/SecretsController.js +72 -0
  68. package/lib/modules/project/index.js +5 -1
  69. package/lib/modules/project/repositories/ProjectRepository.d.ts +3 -6
  70. package/lib/modules/project/repositories/ProjectRepository.js +9 -28
  71. package/lib/modules/project/services/ProjectService.d.ts +5 -3
  72. package/lib/modules/project/services/ProjectService.js +53 -0
  73. package/lib/modules/proxy/controllers/ProxyController.d.ts +1 -2
  74. package/lib/modules/proxy/controllers/ProxyController.js +1 -2
  75. package/lib/modules/proxy/services/CertService.js +1 -1
  76. package/lib/modules/proxy/services/ProxyService.d.ts +1 -0
  77. package/lib/modules/proxy/services/ProxyService.js +5 -1
  78. package/lib/utils/exec.js +4 -1
  79. package/lib/utils/get-cursor-position.js +1 -1
  80. package/package.json +14 -15
  81. package/plugins/dns/Dockerfile +35 -0
  82. package/plugins/dns/app/Procfile +2 -0
  83. package/plugins/dns/app/dnsmasq.conf.tmpl +11 -0
  84. package/plugins/dns/app/dnsmasq.sh +28 -0
  85. package/plugins/proxmox/Dockerfile +35 -0
  86. package/plugins/proxy/Dockerfile +23 -0
  87. package/plugins/proxy/Procfile +2 -0
  88. package/plugins/proxy/bin/wocker-create-ca +19 -0
  89. package/plugins/proxy/bin/wocker-create-cert +38 -0
  90. package/plugins/proxy/bin/wocker-create-domains +21 -0
  91. package/presets/shopify/Dockerfile +160 -0
  92. package/presets/shopify/bin/compare-version +3 -0
  93. package/presets/shopify/config.json +26 -0
  94. package/presets/shopify/etc/apache2/apache2.conf +230 -0
  95. package/presets/shopify/etc/apache2/mods-available/mpm_prefork.conf +16 -0
  96. package/presets/shopify/etc/apache2/sites-available/000-default.conf +21 -0
  97. package/proto/buildkit.proto +55 -0
  98. package/proto/solver/pb/ops.proto +443 -0
  99. package/bin/ws.js +0 -6
  100. package/lib/controllers/ProjectController.d.ts +0 -44
  101. package/lib/controllers/ProjectController.js +0 -956
  102. package/lib/controllers/index.d.ts +0 -5
  103. package/lib/controllers/index.js +0 -21
  104. package/lib/services/NpmService.d.ts +0 -5
  105. package/lib/types/index.d.ts +0 -1
  106. package/lib/types/index.js +0 -17
  107. /package/lib/{controllers → modules/core/controllers}/CompletionController.d.ts +0 -0
  108. /package/lib/{controllers → modules/core/controllers}/CompletionController.js +0 -0
  109. /package/lib/{controllers → modules/core/controllers}/DebugController.d.ts +0 -0
  110. /package/lib/{controllers → modules/core/controllers}/DebugController.js +0 -0
  111. /package/lib/{controllers → modules/core/controllers}/ExperimentalController.d.ts +0 -0
  112. /package/lib/{controllers → modules/core/controllers}/ExperimentalController.js +0 -0
  113. /package/lib/{types/PackageInfo.js → modules/package-manager/types/Package.js} +0 -0
  114. /package/lib/{types → modules/package-manager/types}/PackageInfo.d.ts +0 -0
@@ -0,0 +1,8 @@
1
+ import { ProjectService } from "../services/ProjectService";
2
+ export declare class SecretsController {
3
+ protected readonly projectService: ProjectService;
4
+ constructor(projectService: ProjectService);
5
+ create(secret?: string, name?: string): Promise<void>;
6
+ inspect(secret?: string, name?: string): Promise<string | undefined>;
7
+ rm(secret?: string, name?: string): Promise<void>;
8
+ }
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.SecretsController = void 0;
16
+ const core_1 = require("@wocker/core");
17
+ const utils_1 = require("@wocker/utils");
18
+ const ProjectService_1 = require("../services/ProjectService");
19
+ let SecretsController = class SecretsController {
20
+ constructor(projectService) {
21
+ this.projectService = projectService;
22
+ }
23
+ async create(secret, name) {
24
+ const project = this.projectService.get(name);
25
+ const value = await (0, utils_1.promptInput)({
26
+ message: "Secret value",
27
+ type: "password"
28
+ });
29
+ await project.setSecret(secret, value);
30
+ }
31
+ async inspect(secret, name) {
32
+ const project = this.projectService.get(name);
33
+ return project.getSecret(secret);
34
+ }
35
+ async rm(secret, name) {
36
+ const project = this.projectService.get(name);
37
+ await project.unsetSecret(secret);
38
+ }
39
+ };
40
+ exports.SecretsController = SecretsController;
41
+ __decorate([
42
+ (0, core_1.Command)("secret:create [secret]"),
43
+ (0, core_1.Description)("Adds project secret value to keystore"),
44
+ __param(0, (0, core_1.Param)("secret")),
45
+ __param(1, (0, core_1.Option)("name", "n")),
46
+ __metadata("design:type", Function),
47
+ __metadata("design:paramtypes", [String, String]),
48
+ __metadata("design:returntype", Promise)
49
+ ], SecretsController.prototype, "create", null);
50
+ __decorate([
51
+ (0, core_1.Command)("secret:inspect [secret]"),
52
+ (0, core_1.Description)("Inspect secret value"),
53
+ __param(0, (0, core_1.Param)("secret")),
54
+ __param(1, (0, core_1.Option)("name", "n")),
55
+ __metadata("design:type", Function),
56
+ __metadata("design:paramtypes", [String, String]),
57
+ __metadata("design:returntype", Promise)
58
+ ], SecretsController.prototype, "inspect", null);
59
+ __decorate([
60
+ (0, core_1.Command)("secret:rm [secret]"),
61
+ (0, core_1.Description)("Delete secret value"),
62
+ __param(0, (0, core_1.Param)("secret")),
63
+ __param(1, (0, core_1.Option)("name", "n")),
64
+ __metadata("design:type", Function),
65
+ __metadata("design:paramtypes", [String, String]),
66
+ __metadata("design:returntype", Promise)
67
+ ], SecretsController.prototype, "rm", null);
68
+ exports.SecretsController = SecretsController = __decorate([
69
+ (0, core_1.Controller)(),
70
+ (0, core_1.Description)("Project secret commands"),
71
+ __metadata("design:paramtypes", [ProjectService_1.ProjectService])
72
+ ], SecretsController);
@@ -12,6 +12,7 @@ const keystore_1 = require("../keystore");
12
12
  const docker_1 = require("../docker");
13
13
  const preset_1 = require("../preset");
14
14
  const ProjectController_1 = require("./controllers/ProjectController");
15
+ const SecretsController_1 = require("./controllers/SecretsController");
15
16
  const ProjectRepository_1 = require("./repositories/ProjectRepository");
16
17
  Object.defineProperty(exports, "ProjectRepository", { enumerable: true, get: function () { return ProjectRepository_1.ProjectRepository; } });
17
18
  const ProjectService_1 = require("./services/ProjectService");
@@ -26,7 +27,10 @@ exports.ProjectModule = ProjectModule = __decorate([
26
27
  keystore_1.KeystoreModule,
27
28
  docker_1.DockerModule
28
29
  ],
29
- controllers: [ProjectController_1.ProjectController],
30
+ controllers: [
31
+ ProjectController_1.ProjectController,
32
+ SecretsController_1.SecretsController
33
+ ],
30
34
  providers: [
31
35
  ProjectRepository_1.ProjectRepository,
32
36
  ProjectService_1.ProjectService
@@ -1,12 +1,9 @@
1
- import { AppConfigService, AppFileSystemService, Project, ProjectProperties, ProjectServiceSearchParams as SearchParams } from "@wocker/core";
2
- import { KeystoreService } from "../../keystore";
3
- export declare class ProjectRepository {
1
+ import { AppConfigService, AppFileSystemService, Project, ProjectRepository as CoreProjectRepository, ProjectRepositorySearchParams as SearchParams } from "@wocker/core";
2
+ export declare class ProjectRepository extends CoreProjectRepository {
4
3
  protected readonly appConfigService: AppConfigService;
5
4
  protected readonly fs: AppFileSystemService;
6
- protected readonly keystoreService: KeystoreService;
7
- constructor(appConfigService: AppConfigService, fs: AppFileSystemService, keystoreService: KeystoreService);
5
+ constructor(appConfigService: AppConfigService, fs: AppFileSystemService);
8
6
  getByName(name: string): Project;
9
- fromObject(data: Partial<ProjectProperties>): Project;
10
7
  save(project: Project): void;
11
8
  search(params?: SearchParams): Project[];
12
9
  searchOne(params?: SearchParams): Project | null;
@@ -11,37 +11,19 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.ProjectRepository = void 0;
13
13
  const core_1 = require("@wocker/core");
14
- const keystore_1 = require("../../keystore");
15
- let ProjectRepository = class ProjectRepository {
16
- constructor(appConfigService, fs, keystoreService) {
14
+ let ProjectRepository = class ProjectRepository extends core_1.ProjectRepository {
15
+ constructor(appConfigService, fs) {
16
+ super();
17
17
  this.appConfigService = appConfigService;
18
18
  this.fs = fs;
19
- this.keystoreService = keystoreService;
20
19
  }
21
20
  getByName(name) {
22
21
  const ref = this.appConfigService.config.getProject(name), config = this.fs.readJSON(`projects/${name}/config.json`);
23
- return this.fromObject({
22
+ return new core_1.Project({
24
23
  ...config,
25
24
  path: ref.path
26
25
  });
27
26
  }
28
- fromObject(data) {
29
- const _this = this;
30
- return new class extends core_1.Project {
31
- constructor(data) {
32
- super(data);
33
- }
34
- async getSecret(key, defaultValue) {
35
- return _this.keystoreService.get(`p:${this.name}:${key}`, defaultValue);
36
- }
37
- async setSecret(key, value) {
38
- return _this.keystoreService.set(`p:${this.name}:${key}`, value);
39
- }
40
- save() {
41
- _this.save(this);
42
- }
43
- }(data);
44
- }
45
27
  save(project) {
46
28
  if (!project.name) {
47
29
  throw new Error("Project should has a name");
@@ -52,14 +34,14 @@ let ProjectRepository = class ProjectRepository {
52
34
  if (!project.id) {
53
35
  project.id = project.name;
54
36
  }
55
- if (!this.fs.exists(`projects/${project.id}`)) {
56
- this.fs.mkdir(`projects/${project.id}`, {
37
+ if (!this.fs.exists(`projects/${project.name}`)) {
38
+ this.fs.mkdir(`projects/${project.name}`, {
57
39
  recursive: true
58
40
  });
59
41
  }
60
42
  const { path, ...rest } = project.toObject();
61
- this.appConfigService.addProject(project.id, project.name, path);
62
- this.fs.writeJSON(`projects/${project.id}/config.json`, rest);
43
+ this.appConfigService.addProject(project.name, path);
44
+ this.fs.writeJSON(`projects/${project.name}/config.json`, rest);
63
45
  this.appConfigService.save();
64
46
  }
65
47
  search(params = {}) {
@@ -85,6 +67,5 @@ exports.ProjectRepository = ProjectRepository;
85
67
  exports.ProjectRepository = ProjectRepository = __decorate([
86
68
  (0, core_1.Injectable)(),
87
69
  __metadata("design:paramtypes", [core_1.AppConfigService,
88
- core_1.AppFileSystemService,
89
- keystore_1.KeystoreService])
70
+ core_1.AppFileSystemService])
90
71
  ], ProjectRepository);
@@ -1,6 +1,6 @@
1
- import { Project, AppConfigService, EventService, ProcessService, ProjectService as CoreProjectService, ProjectServiceSearchParams as SearchParams, LogService } from "@wocker/core";
2
- import { DockerService, ComposeService } from "../../docker";
3
- import { PresetService, PresetRepository } from "../../preset";
1
+ import { AppConfigService, EventService, LogService, ProcessService, Project, ProjectService as CoreProjectService, ProjectRepositorySearchParams as SearchParams } from "@wocker/core";
2
+ import { ComposeService, DockerService } from "../../docker";
3
+ import { PresetRepository, PresetService } from "../../preset";
4
4
  import { ProjectRepository } from "../repositories/ProjectRepository";
5
5
  export declare class ProjectService extends CoreProjectService {
6
6
  protected readonly appConfigService: AppConfigService;
@@ -20,6 +20,8 @@ export declare class ProjectService extends CoreProjectService {
20
20
  start(project: Project, restart?: boolean, rebuild?: boolean, attach?: boolean): Promise<void>;
21
21
  stop(project: Project): Promise<void>;
22
22
  build(project: Project, rebuild?: boolean): Promise<void>;
23
+ attach(project: Project): Promise<void>;
24
+ run(project: Project, script: string, service?: string, args?: string[]): Promise<void>;
23
25
  exec(project: Project, command: string[]): Promise<void>;
24
26
  logs(project: Project, detach?: boolean): Promise<void>;
25
27
  }
@@ -11,9 +11,15 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.ProjectService = void 0;
13
13
  const core_1 = require("@wocker/core");
14
+ const cli_1 = require("@kearisp/cli");
14
15
  const docker_1 = require("../../docker");
15
16
  const preset_1 = require("../../preset");
16
17
  const ProjectRepository_1 = require("../repositories/ProjectRepository");
18
+ class PublicCli extends cli_1.Cli {
19
+ parseCommand(command, index) {
20
+ return super.parseCommand(command, index);
21
+ }
22
+ }
17
23
  let ProjectService = class ProjectService extends core_1.ProjectService {
18
24
  constructor(appConfigService, processService, eventService, dockerService, composeService, projectRepository, presetService, presetRepository, logService) {
19
25
  super();
@@ -66,6 +72,7 @@ let ProjectService = class ProjectService extends core_1.ProjectService {
66
72
  container = await this.dockerService.createContainer({
67
73
  name: project.containerName,
68
74
  image: project.imageName,
75
+ cmd: project.cmd,
69
76
  env: {
70
77
  ...this.appConfigService.config.env || {},
71
78
  ...project.env || {}
@@ -192,6 +199,52 @@ let ProjectService = class ProjectService extends core_1.ProjectService {
192
199
  }
193
200
  await this.eventService.emit("project:build", project, rebuild);
194
201
  }
202
+ async attach(project) {
203
+ switch (project.type) {
204
+ case core_1.PROJECT_TYPE_IMAGE:
205
+ case core_1.PROJECT_TYPE_DOCKERFILE:
206
+ case core_1.PROJECT_TYPE_PRESET: {
207
+ await this.dockerService.attach(project.containerName);
208
+ break;
209
+ }
210
+ }
211
+ }
212
+ async run(project, script, service, args = []) {
213
+ if (!project.scripts || !project.scripts[script]) {
214
+ throw new Error(`Script ${script} not found`);
215
+ }
216
+ switch (project.type) {
217
+ case core_1.PROJECT_TYPE_IMAGE:
218
+ case core_1.PROJECT_TYPE_DOCKERFILE:
219
+ case core_1.PROJECT_TYPE_PRESET: {
220
+ const container = await this.dockerService.getContainer(project.containerName);
221
+ if (!container) {
222
+ throw new Error("The project is not started");
223
+ }
224
+ const cli = new PublicCli();
225
+ const cmd = cli.parseCommand(`command ${project.scripts[script]}`, 0);
226
+ this.logService.debug(cmd);
227
+ const exec = await container.exec({
228
+ AttachStdin: true,
229
+ AttachStdout: true,
230
+ AttachStderr: true,
231
+ Tty: process.stdin.isTTY,
232
+ Cmd: [...cmd, ...args || []]
233
+ });
234
+ const stream = await exec.start({
235
+ hijack: true,
236
+ stdin: true,
237
+ Tty: process.stdin.isTTY
238
+ });
239
+ await this.dockerService.attachStream(stream);
240
+ break;
241
+ }
242
+ case core_1.PROJECT_TYPE_COMPOSE: {
243
+ console.log(service, script, args);
244
+ break;
245
+ }
246
+ }
247
+ }
195
248
  async exec(project, command) {
196
249
  switch (project.type) {
197
250
  case core_1.PROJECT_TYPE_IMAGE:
@@ -6,10 +6,9 @@ export declare class ProxyController {
6
6
  protected readonly eventService: EventService;
7
7
  protected readonly projectService: ProjectService;
8
8
  protected readonly proxyService: ProxyService;
9
- protected containerName: string;
10
9
  constructor(appConfigService: AppConfigService, eventService: EventService, projectService: ProjectService, proxyService: ProxyService);
11
10
  onProjectStart(project: Project): Promise<void>;
12
- onProjectStop(project: Project): Promise<void>;
11
+ onProjectStop(_project: Project): Promise<void>;
13
12
  getProjectNames(): string[];
14
13
  init(httpPort?: number, httpsPort?: number, sshPort?: number, sshPassword?: string): Promise<void>;
15
14
  start(restart?: boolean, rebuild?: boolean): Promise<void>;
@@ -27,7 +27,6 @@ let ProxyController = class ProxyController {
27
27
  this.eventService = eventService;
28
28
  this.projectService = projectService;
29
29
  this.proxyService = proxyService;
30
- this.containerName = "proxy.workspace";
31
30
  this.eventService.on("project:init", (project) => this.proxyService.init(project));
32
31
  this.eventService.on("project:start", (project) => this.onProjectStart(project));
33
32
  this.eventService.on("project:stop", (project) => this.onProjectStop(project));
@@ -42,7 +41,7 @@ let ProxyController = class ProxyController {
42
41
  }
43
42
  await this.start();
44
43
  }
45
- async onProjectStop(project) {
44
+ async onProjectStop(_project) {
46
45
  }
47
46
  getProjectNames() {
48
47
  const projects = this.projectService.search();
@@ -72,7 +72,7 @@ let CertService = class CertService {
72
72
  throw new Error("Cert name missing");
73
73
  }
74
74
  await this.proxyService.start();
75
- const container = await this.dockerService.getContainer("proxy.workspace");
75
+ const container = await this.dockerService.getContainer("wocker-proxy");
76
76
  if (!container) {
77
77
  throw new Error("Proxy not started");
78
78
  }
@@ -5,6 +5,7 @@ export declare class ProxyService extends CoreProxyService {
5
5
  protected readonly fs: AppFileSystemService;
6
6
  protected readonly dockerService: DockerService;
7
7
  protected containerName: string;
8
+ protected oldContainerNames: string[];
8
9
  protected imageName: string;
9
10
  protected oldImages: string[];
10
11
  constructor(appConfigService: AppConfigService, fs: AppFileSystemService, dockerService: DockerService);
@@ -54,7 +54,8 @@ let ProxyService = class ProxyService extends core_1.ProxyService {
54
54
  this.appConfigService = appConfigService;
55
55
  this.fs = fs;
56
56
  this.dockerService = dockerService;
57
- this.containerName = "proxy.workspace";
57
+ this.containerName = "wocker-proxy";
58
+ this.oldContainerNames = ["proxy.workspace"];
58
59
  this.imageName = "wocker-proxy:1.0.1";
59
60
  this.oldImages = [
60
61
  "wocker-proxy:1.0.0"
@@ -75,6 +76,9 @@ let ProxyService = class ProxyService extends core_1.ProxyService {
75
76
  }
76
77
  let container = await this.dockerService.getContainer(this.containerName);
77
78
  if (!container) {
79
+ for (const containerName of this.oldContainerNames) {
80
+ await this.dockerService.removeContainer(containerName);
81
+ }
78
82
  console.info("Proxy starting...");
79
83
  await this.build(rebuild);
80
84
  const fs = this.fs;
package/lib/utils/exec.js CHANGED
@@ -8,10 +8,13 @@ const exec = async (command, options) => {
8
8
  maxBuffer: Infinity
9
9
  });
10
10
  return new Promise((resolve, reject) => {
11
- let data = "";
11
+ let data = "", errData = "";
12
12
  worker.stdout.on("data", (chunk) => {
13
13
  data += chunk.toString();
14
14
  });
15
+ worker.stderr.on("data", (chunk) => {
16
+ errData += chunk.toString();
17
+ });
15
18
  worker.on("exit", (code) => {
16
19
  if (code !== 0) {
17
20
  reject(new Error(`Process exited with code ${code}`));
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getCursorPosition = void 0;
4
- const code = '\x1b[6n';
4
+ const code = "\x1b[6n";
5
5
  const getCursorPosition = async () => {
6
6
  process.stdin.resume();
7
7
  process.stdin.setRawMode(true);
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@wocker/ws",
3
- "version": "1.0.25",
3
+ "type": "commonjs",
4
+ "version": "1.0.26",
4
5
  "author": "Kris Papercut <krispcut@gmail.com>",
5
6
  "description": "Docker workspace for web projects",
6
7
  "license": "MIT",
@@ -13,7 +14,7 @@
13
14
  "devops"
14
15
  ],
15
16
  "bin": {
16
- "ws": "./bin/ws.js"
17
+ "ws": "./lib/main.js"
17
18
  },
18
19
  "homepage": "https://kearisp.github.io/wocker",
19
20
  "repository": {
@@ -27,43 +28,41 @@
27
28
  "prepublishOnly": "npm run build",
28
29
  "start": "npm run watch",
29
30
  "build": "tsc --project tsconfig.build.json",
30
- "watch": "tsc -w --project tsconfig.build.json",
31
+ "postbuild": "chmod +x ./lib/main.js",
32
+ "watch": "npm run build && tsc -w --project tsconfig.build.json",
31
33
  "test": "jest --colors",
32
34
  "test-watch": "jest --colors --watchAll",
33
35
  "make-coverage-badge": "make-coverage-badge"
34
36
  },
35
37
  "dependencies": {
36
- "@wocker/core": "1.0.25",
37
- "@wocker/utils": "^2.0.3",
38
+ "@wocker/core": "1.0.26",
39
+ "@wocker/utils": "^2.0.6",
38
40
  "async-mutex": "^0.4.0",
39
41
  "axios": "^1.6.7",
40
42
  "child_process": "^1.0.2",
41
43
  "cli-table3": "^0.6.2",
42
44
  "docker-compose": "^1.2.0",
43
45
  "dockerode": "^4.0.2",
44
- "fs": "^0.0.1-security",
45
46
  "keytar": "^7.9.0",
46
47
  "md5": "^2.3.0",
47
- "os": "^0.1.2",
48
- "path": "^0.12.7",
49
48
  "protobufjs": "^7.5.1",
50
49
  "unzipper": "^0.12.3",
51
50
  "yoctocolors-cjs": "^2.1.2"
52
51
  },
53
52
  "devDependencies": {
54
53
  "@types/dockerode": "^3.3.23",
55
- "@types/jest": "^29.5.14",
54
+ "@types/jest": "^30.0.0",
56
55
  "@types/md5": "^2.3.2",
57
56
  "@types/mute-stream": "^0.0.4",
58
- "@types/node": "^24.0.13",
57
+ "@types/node": "^24.5.2",
59
58
  "@types/unzipper": "^0.10.10",
60
- "@wocker/testing": "1.0.2",
61
- "jest": "^29.7.0",
59
+ "@wocker/testing": "1.0.3",
60
+ "jest": "^30.1.3",
62
61
  "make-coverage-badge": "^1.2.0",
63
- "memfs": "^4.17.0",
64
- "ts-jest": "^29.3.2",
62
+ "memfs": "^4.49.0",
63
+ "ts-jest": "^29.4.4",
65
64
  "ts-node": "^10.9.2",
66
- "typescript": "^5.6.3",
65
+ "typescript": "^5.9.3",
67
66
  "unionfs": "^4.5.4"
68
67
  }
69
68
  }
@@ -0,0 +1,35 @@
1
+ FROM docker.io/nginxproxy/docker-gen:0.15.0 AS docker-gen
2
+
3
+ FROM docker.io/nginxproxy/forego:0.18.3 AS forego
4
+
5
+ FROM alpine:edge
6
+
7
+ RUN set -eu && \
8
+ apk --no-cache add \
9
+ tini \
10
+ bash \
11
+ dnsmasq-dnssec && \
12
+ mkdir -p /etc/default/ && \
13
+ echo -e "ENABLED=1\nIGNORE_RESOLVCONF=yes" > /etc/default/dnsmasq && \
14
+ # rm -f /etc/dnsmasq.conf && \
15
+ rm -rf /tmp/* /var/cache/apk/*
16
+
17
+ #COPY ./dnsmasq.conf.tmpl /app/dnsmasq.conf.tmpl
18
+ #COPY ./Procfile /app/Procfile
19
+
20
+ #RUN wget https://github.com/jwilder/docker-gen/releases/download/0.3.3/docker-gen-linux-amd64-0.3.3.tar.gz && \
21
+ # tar xvzf docker-gen-linux-amd64-0.3.3.tar.gz && \
22
+ # rm docker-gen-linux-amd64-0.3.3.tar.gz && \
23
+ # mv docker-gen /usr/local/bin/
24
+
25
+ # Install Forego + docker-gen
26
+ COPY --from=forego /usr/local/bin/forego /usr/local/bin/forego
27
+ COPY --from=docker-gen /usr/local/bin/docker-gen /usr/local/bin/docker-gen
28
+
29
+ COPY app /app/
30
+ RUN chmod 755 /app/dnsmasq.sh
31
+
32
+ WORKDIR /app/
33
+
34
+ #ENTRYPOINT ["/sbin/tini", "--", "honcho", "-f", "/app/Procfile", "start"]
35
+ CMD ["forego", "start", "-r"]
@@ -0,0 +1,2 @@
1
+ dockergen: docker-gen -watch -notify "pkill -HUP dnsmasq" dnsmasq.conf.tmpl /etc/dnsmasq.conf
2
+ # dnsmasq: /app/dnsmasq.sh
@@ -0,0 +1,11 @@
1
+ {{- $globals := dict }}
2
+ {{- $_ := set $globals "containers" $ }}
3
+
4
+ {{- range $hostname, $containers := groupByMulti $globals.containers "Env.VIRTUAL_HOST" "," }}
5
+ {{ $hostname }}
6
+
7
+ {{- range $container := $containers }}
8
+ {{ printf "%#v" $container.Networks }}
9
+ {{- end }}
10
+ {{- end }}
11
+
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env bash
2
+ set -Eeuo pipefail
3
+
4
+ conf="/etc/dnsmasq.conf"
5
+
6
+ # Check if config file is not a directory
7
+ if [ -d "$conf" ]; then
8
+ echo "The bind $conf maps to a file that does not exist!"
9
+ exit 1
10
+ fi
11
+
12
+ if [ ! -f "$conf" ]; then
13
+ conf="/etc/dnsmasq.custom"
14
+ template="/etc/dnsmasq.default"
15
+
16
+ if [ ! -f "$template" ]; then
17
+ echo "Your /etc directory does not contain a valid dnsmasq.conf file!"
18
+ exit 1
19
+ fi
20
+
21
+ rm -f "$conf"
22
+ cp "$template" "$conf"
23
+
24
+ [ -n "$DNS1" ] && sed -i -e "s/1.0.0.1/$DNS1/g" "$conf"
25
+ [ -n "$DNS2" ] && sed -i -e "s/1.1.1.1/$DNS2/g" "$conf"
26
+ fi
27
+
28
+ exec dnsmasq "--conf-file=$conf" --no-daemon --no-resolv
@@ -0,0 +1,35 @@
1
+ FROM debian:stable
2
+
3
+ RUN apt-get update \
4
+ && apt-get install -y wget
5
+
6
+ RUN apt-get update && apt-get install -y gnupg
7
+
8
+ RUN echo "deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription" | tee /etc/apt/sources.list.d/pve-install-repo.list
9
+
10
+ #RUN wget http://download.proxmox.com/debian/proxmox-release-bullseye.gpg
11
+ RUN wget http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg
12
+ RUN apt-key add proxmox-ve-release-6.x.gpg
13
+
14
+ RUN echo "deb http://download.proxmox.com/debian/pve buster pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list
15
+
16
+ RUN apt update
17
+ RUN apt install proxmox-ve postfix open-iscsi
18
+
19
+ # RUN apt remove os-prober
20
+
21
+ #RUN mv proxmox-release-bullseye.gpg /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg
22
+
23
+ #RUN chmod +r /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg
24
+
25
+ #RUN apt update
26
+
27
+ #RUN apt full-upgrade -y
28
+
29
+ #RUN apt update
30
+
31
+ #RUN echo "deb http://download.proxmox.com/debian/ceph-pacific bullseye main" | tee /etc/apt/sources.list.d/ceph.list
32
+
33
+ # RUN apt-get install -y proxmox-ve postfix open-iscsi
34
+
35
+ #RUN apt update
@@ -0,0 +1,23 @@
1
+ FROM nginxproxy/nginx-proxy:1.6.4-alpine
2
+
3
+ ARG SSH_PASSWORD=''
4
+
5
+ COPY ./bin/wocker-create-ca /usr/local/bin/wocker-create-ca
6
+ COPY ./bin/wocker-create-cert /usr/local/bin/wocker-create-cert
7
+ COPY ./bin/wocker-create-domains /usr/local/bin/wocker-create-domains
8
+
9
+ RUN chmod +x /usr/local/bin/wocker-create-ca && \
10
+ chmod +x /usr/local/bin/wocker-create-cert && \
11
+ chmod +x /usr/local/bin/wocker-create-domains
12
+
13
+ RUN if [ -n "$SSH_PASSWORD" ]; then \
14
+ apk update && apk add --no-cache openssh; \
15
+ mkdir -p /var/run/sshd; \
16
+ echo "root:$SSH_PASSWORD" | chpasswd; \
17
+ sed -i 's/AllowTcpForwarding no/AllowTcpForwarding yes/' /etc/ssh/sshd_config; \
18
+ sed -i 's/GatewayPorts no/GatewayPorts yes/' /etc/ssh/sshd_config; \
19
+ sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config; \
20
+ sed -i 's/#UsePAM yes/UsePAM no/' /etc/ssh/sshd_config; \
21
+ ssh-keygen -A; \
22
+ echo "sshd: /usr/sbin/sshd -D" >> /app/Procfile; \
23
+ fi
@@ -0,0 +1,2 @@
1
+ nginx: nginx -g "daemon off;"
2
+ docker-gen: docker-gen -watch -config /app/docker-gen.conf
@@ -0,0 +1,19 @@
1
+ #!/bin/bash
2
+
3
+ CA_DIR=/etc/nginx/ca-certs
4
+
5
+ if [ ! -f $CA_DIR/Wocker-CA.key ]; then
6
+ mkdir -p $CA_DIR
7
+
8
+ openssl req -x509 -nodes -new -sha256 \
9
+ -days 1024 \
10
+ -newkey rsa:2048 \
11
+ -keyout $CA_DIR/Wocker-CA.key \
12
+ -out $CA_DIR/Wocker-CA.pem \
13
+ -subj "/C=UA/ST=Kyiv/O=Wocker/CN=Wocker-CA"
14
+
15
+ openssl x509 \
16
+ -outform pem \
17
+ -in $CA_DIR/Wocker-CA.pem \
18
+ -out $CA_DIR/Wocker-CA.crt
19
+ fi