diff --git a/apps/cistech-tunnel/source/Dockerfile b/apps/cistech-tunnel/source/Dockerfile old mode 100644 new mode 100755 diff --git a/apps/rego-tunnel/config.json b/apps/rego-tunnel/config.json new file mode 100755 index 0000000..306f621 --- /dev/null +++ b/apps/rego-tunnel/config.json @@ -0,0 +1,69 @@ +{ + "name": "Rego Tunnel", + "available": true, + "port": 8006, + "exposable": true, + "dynamic_config": true, + "id": "rego-tunnel", + "description": "VPN tunnel to access Rego environments securely.", + "tipi_version": 1, + "version": "latest", + "categories": ["utilities"], + "short_desc": "VPN tunnel to access Rego environments securely.", + "author": "dockurr", + "source": "https://github.com/dockur/windows/", + "form_fields": [ + { + "type": "number", + "label": "RAM", + "hint": "RAM to asign to the VM (in gigabytes)", + "placeholder": "4", + "required": true, + "env_variable": "WINDOWS_RAM_GB" + }, + { + "type": "number", + "label": "CPU Cores", + "hint": "CPU cores to asign to the VM", + "placeholder": "4", + "required": true, + "env_variable": "WINDOWS_CPU_CORES" + }, + { + "type": "number", + "label": "Disk Size", + "hint": "Disk size for the VM, it will be used dynamically (in gigabytes)", + "placeholder": "16", + "required": true, + "env_variable": "WINDOWS_DISK_SIZE_GB" + }, + { + "type": "text", + "label": "Windows Version", + "hint": "The windows version to use", + "required": true, + "options": [ + { "label": "Windows 10", "value": "win10" }, + { "label": "Windows 11", "value": "win11" }, + { "label": "Windows 10 LTSC", "value": "ltsc10" }, + { "label": "Windows 8.1", "value": "win81" }, + { "label": "Windows 7", "value": "win7" }, + { "label": "Windows Vista", "value": "vista" }, + { "label": "Windows XP", "value": "winxp" }, + { "label": "Windows Server 2022", "value": "2022" }, + { "label": "Windows Server 2019", "value": "2019" }, + { "label": "Windows Server 2016", "value": "2016" }, + { "label": "Windows Server 2012", "value": "2012" }, + { "label": "Windows Server 2008", "value": "2008" }, + { "label": "Windows Tiny 11 Core", "value": "core11" }, + { "label": "Windows Tiny 11", "value": "tiny11" }, + { "label": "Windows Tiny 10", "value": "tiny10" } + ], + "env_variable": "WINDOWS_VERSION" + } + ], + "supported_architectures": ["arm64", "amd64"], + "created_at": 1691943801422, + "updated_at": 1763873319189, + "force_pull": false +} diff --git a/apps/rego-tunnel/docker-compose.json b/apps/rego-tunnel/docker-compose.json new file mode 100755 index 0000000..c6637c5 --- /dev/null +++ b/apps/rego-tunnel/docker-compose.json @@ -0,0 +1,157 @@ +{ + "schemaVersion": 2, + "services": [ + { + "name": "rego-tunnel", + "image": "dockurr/windows:5.14", + "environment": [ + { + "key": "RAM_SIZE", + "value": "${WINDOWS_RAM_GB}G" + }, + { + "key": "CPU_CORE", + "value": "${WINDOWS_CPU_CORES}" + }, + { + "key": "DISK_SIZE", + "value": "${WINDOWS_DISK_SIZE_GB}G" + }, + { + "key": "VERSION", + "value": "${WINDOWS_VERSION}" + } + ], + "internalPort": 8006, + "addPorts": [ + { + "containerPort": 3389, + "hostPort": 3389, + "tcp": true, + "udp": false, + "interface": "192.168.0.151" + }, + { + "containerPort": 3389, + "hostPort": 3389, + "tcp": false, + "udp": true, + "interface": "192.168.0.151" + }, + { + "containerPort": 21, + "hostPort": 21, + "tcp": true, + "udp": false, + "interface": "192.168.0.151" + }, + { + "containerPort": 22, + "hostPort": 22, + "tcp": true, + "udp": false, + "interface": "192.168.0.151" + }, + { + "containerPort": 23, + "hostPort": 23, + "tcp": true, + "udp": false, + "interface": "192.168.0.151" + }, + { + "containerPort": 449, + "hostPort": 449, + "tcp": true, + "udp": false, + "interface": "192.168.0.151" + }, + { + "containerPort": 446, + "hostPort": 446, + "tcp": true, + "udp": false, + "interface": "192.168.0.151" + }, + { + "containerPort": 448, + "hostPort": 448, + "tcp": true, + "udp": false, + "interface": "192.168.0.151" + }, + { + "containerPort": 8470, + "hostPort": 8470, + "tcp": true, + "udp": false, + "interface": "192.168.0.151" + }, + { + "containerPort": 8471, + "hostPort": 8471, + "tcp": true, + "udp": false, + "interface": "192.168.0.151" + }, + { + "containerPort": 8472, + "hostPort": 8472, + "tcp": true, + "udp": false, + "interface": "192.168.0.151" + }, + { + "containerPort": 8473, + "hostPort": 8473, + "tcp": true, + "udp": false, + "interface": "192.168.0.151" + }, + { + "containerPort": 8474, + "hostPort": 8474, + "tcp": true, + "udp": false, + "interface": "192.168.0.151" + }, + { + "containerPort": 8475, + "hostPort": 8475, + "tcp": true, + "udp": false, + "interface": "192.168.0.151" + }, + { + "containerPort": 8476, + "hostPort": 8476, + "tcp": true, + "udp": false, + "interface": "192.168.0.151" + } + ], + "volumes": [ + { + "hostPath": "${APP_DATA_DIR}/data/storage", + "containerPath": "/storage", + "readOnly": false, + "shared": false, + "private": false + } + ], + "stopGracePeriod": "2m", + "sysctls": {}, + "devices": [ + "/dev/kvm", + "/dev/net/tun" + ], + "capAdd": [ + "NET_ADMIN" + ], + "isMain": true, + "extraLabels": { + "runtipi.managed": true + } + } + ] +} \ No newline at end of file diff --git a/apps/rego-tunnel/docker-compose.yml b/apps/rego-tunnel/docker-compose.yml new file mode 100755 index 0000000..cf8c36a --- /dev/null +++ b/apps/rego-tunnel/docker-compose.yml @@ -0,0 +1,84 @@ +version: '3.9' + +services: + rego-tunnel: + container_name: rego-tunnel + image: dockurr/windows:5.14 + restart: unless-stopped + devices: + - /dev/kvm + - /dev/net/tun + cap_add: + - NET_ADMIN + stop_grace_period: 2m + + ports: + # Web console (Tipi APP_PORT -> 8006) + - "192.168.0.151:${APP_PORT}:8006/tcp" + + # RDP + - "192.168.0.151:3389:3389/tcp" + - "192.168.0.151:3389:3389/udp" + + # Optional admin + - "192.168.0.151:21:21/tcp" + - "192.168.0.151:22:22/tcp" + + # IBM i common + - "192.168.0.151:23:23/tcp" + - "192.168.0.151:449:449/tcp" + - "192.168.0.151:446:446/tcp" + - "192.168.0.151:448:448/tcp" + - "192.168.0.151:8470:8470/tcp" + - "192.168.0.151:8471:8471/tcp" + - "192.168.0.151:8472:8472/tcp" + - "192.168.0.151:8473:8473/tcp" + - "192.168.0.151:8474:8474/tcp" + - "192.168.0.151:8475:8475/tcp" + - "192.168.0.151:8476:8476/tcp" + + environment: + - RAM_SIZE=${WINDOWS_RAM_GB}G + - CPU_CORE=${WINDOWS_CPU_CORES} + - DISK_SIZE=${WINDOWS_DISK_SIZE_GB}G + - VERSION=${WINDOWS_VERSION} + + volumes: + - ${APP_DATA_DIR}/data/storage:/storage + + networks: + - tipi_main_network + + sysctls: + - net.ipv4.ip_forward=1 + + labels: + traefik.enable: true + traefik.http.middlewares.rego-tunnel-web-redirect.redirectscheme.scheme: https + traefik.http.services.rego-tunnel.loadbalancer.server.port: 8006 + + traefik.http.routers.rego-tunnel-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.rego-tunnel-insecure.entrypoints: web + traefik.http.routers.rego-tunnel-insecure.service: rego-tunnel + traefik.http.routers.rego-tunnel-insecure.middlewares: rego-tunnel-web-redirect + + traefik.http.routers.rego-tunnel.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.rego-tunnel.entrypoints: websecure + traefik.http.routers.rego-tunnel.service: rego-tunnel + traefik.http.routers.rego-tunnel.tls.certresolver: myresolver + + traefik.http.routers.rego-tunnel-local-insecure.rule: Host(`rego-tunnel.${LOCAL_DOMAIN}`) + traefik.http.routers.rego-tunnel-local-insecure.entrypoints: web + traefik.http.routers.rego-tunnel-local-insecure.service: rego-tunnel + traefik.http.routers.rego-tunnel-local-insecure.middlewares: rego-tunnel-web-redirect + + traefik.http.routers.rego-tunnel-local.rule: Host(`rego-tunnel.${LOCAL_DOMAIN}`) + traefik.http.routers.rego-tunnel-local.entrypoints: websecure + traefik.http.routers.rego-tunnel-local.service: rego-tunnel + traefik.http.routers.rego-tunnel-local.tls: true + + runtipi.managed: true + +networks: + tipi_main_network: + external: true diff --git a/apps/rego-tunnel/metadata/compose-schema.json b/apps/rego-tunnel/metadata/compose-schema.json new file mode 100644 index 0000000..e45055b --- /dev/null +++ b/apps/rego-tunnel/metadata/compose-schema.json @@ -0,0 +1,1217 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "schemaVersion": { + "const": 2 + }, + "services": { + "type": "array", + "message": "CUSTOM_APP_ERROR_SERVICES_MIN_LENGTH", + "minItems": 1, + "items": { + "type": "object", + "properties": { + "image": { + "type": "string", + "message": "CUSTOM_APP_ERROR_IMAGE_REQUIRED" + }, + "name": { + "type": "string", + "message": "CUSTOM_APP_ERROR_NAME_REQUIRED" + }, + "addPorts": { + "type": "array", + "items": { + "type": "object", + "properties": { + "containerPort": { + "anyOf": [ + { + "type": "string", + "message": "CUSTOM_APP_ERROR_CONTAINER_PORT_INVALID" + }, + { + "type": "integer", + "message": "CUSTOM_APP_ERROR_CONTAINER_PORT_INVALID", + "exclusiveMaximum": 65536, + "exclusiveMinimum": 0 + } + ], + "message": "CUSTOM_APP_ERROR_CONTAINER_PORT_INVALID" + }, + "hostPort": { + "anyOf": [ + { + "type": "string", + "message": "CUSTOM_APP_ERROR_HOST_PORT_INVALID" + }, + { + "type": "integer", + "message": "CUSTOM_APP_ERROR_HOST_PORT_INVALID", + "exclusiveMaximum": 65536, + "exclusiveMinimum": 0 + } + ], + "message": "CUSTOM_APP_ERROR_HOST_PORT_INVALID" + }, + "interface": { + "type": "string" + }, + "tcp": { + "type": "boolean" + }, + "udp": { + "type": "boolean" + } + }, + "required": [ + "containerPort", + "hostPort" + ] + } + }, + "addToMainNetwork": { + "type": "boolean" + }, + "capAdd": { + "type": "array", + "message": "CUSTOM_APP_ERROR_CAP_ADD_INVALID", + "items": { + "type": "string" + } + }, + "capDrop": { + "type": "array", + "message": "CUSTOM_APP_ERROR_CAP_DROP_INVALID", + "items": { + "type": "string" + } + }, + "command": { + "anyOf": [ + { + "type": "string", + "message": "CUSTOM_APP_ERROR_COMMAND_INVALID" + }, + { + "type": "array", + "message": "CUSTOM_APP_ERROR_COMMAND_INVALID", + "items": { + "type": "string" + } + } + ], + "message": "CUSTOM_APP_ERROR_COMMAND_INVALID" + }, + "dependsOn": { + "anyOf": [ + { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "condition": { + "anyOf": [ + { + "const": "service_completed_successfully", + "message": "CUSTOM_APP_ERROR_DEPENDS_ON_CONDITION_INVALID" + }, + { + "const": "service_healthy", + "message": "CUSTOM_APP_ERROR_DEPENDS_ON_CONDITION_INVALID" + }, + { + "const": "service_started", + "message": "CUSTOM_APP_ERROR_DEPENDS_ON_CONDITION_INVALID" + } + ], + "message": "CUSTOM_APP_ERROR_DEPENDS_ON_CONDITION_INVALID" + } + }, + "required": [ + "condition" + ] + } + }, + { + "type": "array", + "message": "CUSTOM_APP_ERROR_DEPENDS_ON_SERVICE_INVALID", + "items": { + "type": "string" + } + } + ] + }, + "deploy": { + "type": "object", + "properties": { + "resources": { + "type": "object", + "properties": { + "limits": { + "type": "object", + "properties": { + "cpus": { + "type": "string" + }, + "memory": { + "type": "string" + }, + "pids": { + "type": "number", + "message": "CUSTOM_APP_ERROR_DEPLOY_PIDS_INVALID" + } + } + }, + "reservations": { + "type": "object", + "properties": { + "devices": { + "type": "array", + "items": { + "type": "object", + "properties": { + "capabilities": { + "type": "array", + "message": "CUSTOM_APP_ERROR_DEVICE_CAPABILITY_INVALID", + "items": { + "type": "string" + } + }, + "count": { + "anyOf": [ + { + "type": "number", + "message": "CUSTOM_APP_ERROR_DEVICE_COUNT_INVALID" + }, + { + "const": "all", + "message": "CUSTOM_APP_ERROR_DEVICE_COUNT_INVALID" + } + ], + "message": "CUSTOM_APP_ERROR_DEVICE_COUNT_INVALID" + }, + "deviceIds": { + "type": "array", + "message": "CUSTOM_APP_ERROR_DEVICE_ID_INVALID", + "items": { + "type": "string" + } + }, + "driver": { + "type": "string" + } + }, + "required": [ + "capabilities" + ] + } + }, + "cpus": { + "type": "string" + }, + "memory": { + "type": "string" + } + }, + "required": [ + "devices" + ] + } + } + } + }, + "required": [ + "resources" + ] + }, + "devices": { + "type": "array", + "message": "CUSTOM_APP_ERROR_DEVICE_INVALID", + "items": { + "type": "string" + } + }, + "dns": { + "anyOf": [ + { + "type": "string", + "message": "CUSTOM_APP_ERROR_DNS_INVALID" + }, + { + "type": "array", + "message": "CUSTOM_APP_ERROR_DNS_INVALID", + "items": { + "type": "string" + } + } + ], + "message": "CUSTOM_APP_ERROR_DNS_INVALID" + }, + "entrypoint": { + "anyOf": [ + { + "type": "string", + "message": "CUSTOM_APP_ERROR_ENTRYPOINT_INVALID" + }, + { + "type": "array", + "message": "CUSTOM_APP_ERROR_ENTRYPOINT_INVALID", + "items": { + "type": "string" + } + } + ], + "message": "CUSTOM_APP_ERROR_ENTRYPOINT_INVALID" + }, + "environment": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string", + "message": "CUSTOM_APP_ERROR_ENV_KEY_REQUIRED", + "minLength": 1 + }, + "value": { + "anyOf": [ + { + "type": "number", + "message": "CUSTOM_APP_ERROR_ENV_VALUE_REQUIRED" + }, + { + "type": "string", + "message": "CUSTOM_APP_ERROR_ENV_VALUE_REQUIRED", + "minLength": 1 + }, + { + "type": "boolean" + } + ], + "message": "CUSTOM_APP_ERROR_ENV_VALUE_REQUIRED" + } + }, + "required": [ + "key", + "value" + ] + } + }, + "extraHosts": { + "type": "array", + "message": "CUSTOM_APP_ERROR_EXTRA_HOST_INVALID", + "items": { + "type": "string" + } + }, + "extraLabels": { + "type": "object", + "message": "CUSTOM_APP_ERROR_LABEL_KEY_INVALID", + "additionalProperties": { + "anyOf": [ + { + "type": "string", + "message": "CUSTOM_APP_ERROR_LABEL_VALUE_INVALID" + }, + { + "type": "boolean" + } + ], + "message": "CUSTOM_APP_ERROR_LABEL_VALUE_INVALID" + } + }, + "healthCheck": { + "type": "object", + "properties": { + "test": { + "type": "string", + "message": "CUSTOM_APP_ERROR_HEALTH_CHECK_TEST_REQUIRED" + }, + "interval": { + "type": "string" + }, + "retries": { + "type": "number", + "message": "CUSTOM_APP_ERROR_HEALTH_CHECK_RETRIES_INVALID" + }, + "startInterval": { + "type": "string" + }, + "startPeriod": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "test" + ] + }, + "hostname": { + "type": "string" + }, + "internalPort": { + "anyOf": [ + { + "type": "string", + "message": "CUSTOM_APP_ERROR_INTERNAL_PORT_INVALID" + }, + { + "type": "integer", + "message": "CUSTOM_APP_ERROR_INTERNAL_PORT_INVALID", + "exclusiveMaximum": 65536, + "exclusiveMinimum": 0 + } + ], + "message": "CUSTOM_APP_ERROR_INTERNAL_PORT_INVALID" + }, + "isMain": { + "type": "boolean" + }, + "logging": { + "type": "object", + "properties": { + "driver": { + "type": "string", + "message": "CUSTOM_APP_ERROR_LOGGING_DRIVER_REQUIRED" + }, + "options": { + "type": "object", + "message": "CUSTOM_APP_ERROR_LOGGING_OPTION_KEY_INVALID", + "additionalProperties": { + "type": "string", + "message": "CUSTOM_APP_ERROR_LOGGING_OPTION_VALUE_INVALID" + } + } + }, + "required": [ + "driver" + ] + }, + "networkMode": { + "type": "string" + }, + "pid": { + "type": "string" + }, + "privileged": { + "type": "boolean" + }, + "readOnly": { + "type": "boolean" + }, + "securityOpt": { + "type": "array", + "message": "CUSTOM_APP_ERROR_SECURITY_OPT_INVALID", + "items": { + "type": "string" + } + }, + "shmSize": { + "type": "string" + }, + "stdinOpen": { + "type": "boolean" + }, + "stopGracePeriod": { + "type": "string" + }, + "stopSignal": { + "type": "string" + }, + "sysctls": { + "type": "object", + "message": "CUSTOM_APP_ERROR_SYSCTL_KEY_INVALID", + "additionalProperties": { + "type": "number", + "message": "CUSTOM_APP_ERROR_SYSCTL_VALUE_INVALID" + } + }, + "tty": { + "type": "boolean" + }, + "ulimits": { + "type": "object", + "properties": { + "core": { + "anyOf": [ + { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_CORE_INVALID" + }, + { + "type": "object", + "properties": { + "hard": { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_HARD_INVALID" + }, + "soft": { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_SOFT_INVALID" + } + }, + "required": [ + "hard", + "soft" + ] + } + ] + }, + "memlock": { + "anyOf": [ + { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_MEMLOCK_INVALID" + }, + { + "type": "object", + "properties": { + "hard": { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_HARD_INVALID" + }, + "soft": { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_SOFT_INVALID" + } + }, + "required": [ + "hard", + "soft" + ] + } + ] + }, + "nofile": { + "anyOf": [ + { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_NOFILE_INVALID" + }, + { + "type": "object", + "properties": { + "hard": { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_HARD_INVALID" + }, + "soft": { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_SOFT_INVALID" + } + }, + "required": [ + "hard", + "soft" + ] + } + ] + }, + "nproc": { + "anyOf": [ + { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_NPROC_INVALID" + }, + { + "type": "object", + "properties": { + "hard": { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_HARD_INVALID" + }, + "soft": { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_SOFT_INVALID" + } + }, + "required": [ + "hard", + "soft" + ] + } + ] + } + } + }, + "user": { + "type": "string" + }, + "volumes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "containerPath": { + "type": "string", + "message": "CUSTOM_APP_ERROR_CONTAINER_PATH_REQUIRED" + }, + "hostPath": { + "type": "string", + "message": "CUSTOM_APP_ERROR_HOST_PATH_REQUIRED" + }, + "bind": { + "type": "object", + "properties": { + "propagation": { + "enum": [ + "private", + "rprivate", + "rshared", + "rslave", + "shared", + "slave" + ] + } + }, + "required": [ + "propagation" + ] + }, + "private": { + "type": "boolean" + }, + "readOnly": { + "type": "boolean" + }, + "shared": { + "type": "boolean" + } + }, + "required": [ + "containerPath", + "hostPath" + ] + } + }, + "workingDir": { + "type": "string" + } + }, + "required": [ + "image", + "name" + ] + } + }, + "overrides": { + "type": "array", + "items": { + "type": "object", + "properties": { + "services": { + "type": "array", + "items": { + "type": "object", + "properties": { + "addPorts": { + "type": "array", + "items": { + "type": "object", + "properties": { + "containerPort": { + "anyOf": [ + { + "type": "string", + "message": "CUSTOM_APP_ERROR_CONTAINER_PORT_INVALID" + }, + { + "type": "integer", + "message": "CUSTOM_APP_ERROR_CONTAINER_PORT_INVALID", + "exclusiveMaximum": 65536, + "exclusiveMinimum": 0 + } + ], + "message": "CUSTOM_APP_ERROR_CONTAINER_PORT_INVALID" + }, + "hostPort": { + "anyOf": [ + { + "type": "string", + "message": "CUSTOM_APP_ERROR_HOST_PORT_INVALID" + }, + { + "type": "integer", + "message": "CUSTOM_APP_ERROR_HOST_PORT_INVALID", + "exclusiveMaximum": 65536, + "exclusiveMinimum": 0 + } + ], + "message": "CUSTOM_APP_ERROR_HOST_PORT_INVALID" + }, + "interface": { + "type": "string" + }, + "tcp": { + "type": "boolean" + }, + "udp": { + "type": "boolean" + } + }, + "required": [ + "containerPort", + "hostPort" + ] + } + }, + "addToMainNetwork": { + "type": "boolean" + }, + "capAdd": { + "type": "array", + "message": "CUSTOM_APP_ERROR_CAP_ADD_INVALID", + "items": { + "type": "string" + } + }, + "capDrop": { + "type": "array", + "message": "CUSTOM_APP_ERROR_CAP_DROP_INVALID", + "items": { + "type": "string" + } + }, + "command": { + "anyOf": [ + { + "type": "string", + "message": "CUSTOM_APP_ERROR_COMMAND_INVALID" + }, + { + "type": "array", + "message": "CUSTOM_APP_ERROR_COMMAND_INVALID", + "items": { + "type": "string" + } + } + ], + "message": "CUSTOM_APP_ERROR_COMMAND_INVALID" + }, + "dependsOn": { + "anyOf": [ + { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "condition": { + "anyOf": [ + { + "const": "service_completed_successfully", + "message": "CUSTOM_APP_ERROR_DEPENDS_ON_CONDITION_INVALID" + }, + { + "const": "service_healthy", + "message": "CUSTOM_APP_ERROR_DEPENDS_ON_CONDITION_INVALID" + }, + { + "const": "service_started", + "message": "CUSTOM_APP_ERROR_DEPENDS_ON_CONDITION_INVALID" + } + ], + "message": "CUSTOM_APP_ERROR_DEPENDS_ON_CONDITION_INVALID" + } + }, + "required": [ + "condition" + ] + } + }, + { + "type": "array", + "message": "CUSTOM_APP_ERROR_DEPENDS_ON_SERVICE_INVALID", + "items": { + "type": "string" + } + } + ] + }, + "deploy": { + "type": "object", + "properties": { + "resources": { + "type": "object", + "properties": { + "limits": { + "type": "object", + "properties": { + "cpus": { + "type": "string" + }, + "memory": { + "type": "string" + }, + "pids": { + "type": "number", + "message": "CUSTOM_APP_ERROR_DEPLOY_PIDS_INVALID" + } + } + }, + "reservations": { + "type": "object", + "properties": { + "devices": { + "type": "array", + "items": { + "type": "object", + "properties": { + "capabilities": { + "type": "array", + "message": "CUSTOM_APP_ERROR_DEVICE_CAPABILITY_INVALID", + "items": { + "type": "string" + } + }, + "count": { + "anyOf": [ + { + "type": "number", + "message": "CUSTOM_APP_ERROR_DEVICE_COUNT_INVALID" + }, + { + "const": "all", + "message": "CUSTOM_APP_ERROR_DEVICE_COUNT_INVALID" + } + ], + "message": "CUSTOM_APP_ERROR_DEVICE_COUNT_INVALID" + }, + "deviceIds": { + "type": "array", + "message": "CUSTOM_APP_ERROR_DEVICE_ID_INVALID", + "items": { + "type": "string" + } + }, + "driver": { + "type": "string" + } + }, + "required": [ + "capabilities" + ] + } + }, + "cpus": { + "type": "string" + }, + "memory": { + "type": "string" + } + }, + "required": [ + "devices" + ] + } + } + } + }, + "required": [ + "resources" + ] + }, + "devices": { + "type": "array", + "message": "CUSTOM_APP_ERROR_DEVICE_INVALID", + "items": { + "type": "string" + } + }, + "dns": { + "anyOf": [ + { + "type": "string", + "message": "CUSTOM_APP_ERROR_DNS_INVALID" + }, + { + "type": "array", + "message": "CUSTOM_APP_ERROR_DNS_INVALID", + "items": { + "type": "string" + } + } + ], + "message": "CUSTOM_APP_ERROR_DNS_INVALID" + }, + "entrypoint": { + "anyOf": [ + { + "type": "string", + "message": "CUSTOM_APP_ERROR_ENTRYPOINT_INVALID" + }, + { + "type": "array", + "message": "CUSTOM_APP_ERROR_ENTRYPOINT_INVALID", + "items": { + "type": "string" + } + } + ], + "message": "CUSTOM_APP_ERROR_ENTRYPOINT_INVALID" + }, + "environment": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string", + "message": "CUSTOM_APP_ERROR_ENV_KEY_REQUIRED", + "minLength": 1 + }, + "value": { + "anyOf": [ + { + "type": "number", + "message": "CUSTOM_APP_ERROR_ENV_VALUE_REQUIRED" + }, + { + "type": "string", + "message": "CUSTOM_APP_ERROR_ENV_VALUE_REQUIRED", + "minLength": 1 + }, + { + "type": "boolean" + } + ], + "message": "CUSTOM_APP_ERROR_ENV_VALUE_REQUIRED" + } + }, + "required": [ + "key", + "value" + ] + } + }, + "extraHosts": { + "type": "array", + "message": "CUSTOM_APP_ERROR_EXTRA_HOST_INVALID", + "items": { + "type": "string" + } + }, + "extraLabels": { + "type": "object", + "message": "CUSTOM_APP_ERROR_LABEL_KEY_INVALID", + "additionalProperties": { + "anyOf": [ + { + "type": "string", + "message": "CUSTOM_APP_ERROR_LABEL_VALUE_INVALID" + }, + { + "type": "boolean" + } + ], + "message": "CUSTOM_APP_ERROR_LABEL_VALUE_INVALID" + } + }, + "healthCheck": { + "type": "object", + "properties": { + "test": { + "type": "string", + "message": "CUSTOM_APP_ERROR_HEALTH_CHECK_TEST_REQUIRED" + }, + "interval": { + "type": "string" + }, + "retries": { + "type": "number", + "message": "CUSTOM_APP_ERROR_HEALTH_CHECK_RETRIES_INVALID" + }, + "startInterval": { + "type": "string" + }, + "startPeriod": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "test" + ] + }, + "hostname": { + "type": "string" + }, + "image": { + "type": "string", + "message": "CUSTOM_APP_ERROR_IMAGE_REQUIRED" + }, + "internalPort": { + "anyOf": [ + { + "type": "string", + "message": "CUSTOM_APP_ERROR_INTERNAL_PORT_INVALID" + }, + { + "type": "integer", + "message": "CUSTOM_APP_ERROR_INTERNAL_PORT_INVALID", + "exclusiveMaximum": 65536, + "exclusiveMinimum": 0 + } + ], + "message": "CUSTOM_APP_ERROR_INTERNAL_PORT_INVALID" + }, + "isMain": { + "type": "boolean" + }, + "logging": { + "type": "object", + "properties": { + "driver": { + "type": "string", + "message": "CUSTOM_APP_ERROR_LOGGING_DRIVER_REQUIRED" + }, + "options": { + "type": "object", + "message": "CUSTOM_APP_ERROR_LOGGING_OPTION_KEY_INVALID", + "additionalProperties": { + "type": "string", + "message": "CUSTOM_APP_ERROR_LOGGING_OPTION_VALUE_INVALID" + } + } + }, + "required": [ + "driver" + ] + }, + "name": { + "type": "string", + "message": "CUSTOM_APP_ERROR_NAME_REQUIRED" + }, + "networkMode": { + "type": "string" + }, + "pid": { + "type": "string" + }, + "privileged": { + "type": "boolean" + }, + "readOnly": { + "type": "boolean" + }, + "securityOpt": { + "type": "array", + "message": "CUSTOM_APP_ERROR_SECURITY_OPT_INVALID", + "items": { + "type": "string" + } + }, + "shmSize": { + "type": "string" + }, + "stdinOpen": { + "type": "boolean" + }, + "stopGracePeriod": { + "type": "string" + }, + "stopSignal": { + "type": "string" + }, + "sysctls": { + "type": "object", + "message": "CUSTOM_APP_ERROR_SYSCTL_KEY_INVALID", + "additionalProperties": { + "type": "number", + "message": "CUSTOM_APP_ERROR_SYSCTL_VALUE_INVALID" + } + }, + "tty": { + "type": "boolean" + }, + "ulimits": { + "type": "object", + "properties": { + "core": { + "anyOf": [ + { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_CORE_INVALID" + }, + { + "type": "object", + "properties": { + "hard": { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_HARD_INVALID" + }, + "soft": { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_SOFT_INVALID" + } + }, + "required": [ + "hard", + "soft" + ] + } + ] + }, + "memlock": { + "anyOf": [ + { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_MEMLOCK_INVALID" + }, + { + "type": "object", + "properties": { + "hard": { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_HARD_INVALID" + }, + "soft": { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_SOFT_INVALID" + } + }, + "required": [ + "hard", + "soft" + ] + } + ] + }, + "nofile": { + "anyOf": [ + { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_NOFILE_INVALID" + }, + { + "type": "object", + "properties": { + "hard": { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_HARD_INVALID" + }, + "soft": { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_SOFT_INVALID" + } + }, + "required": [ + "hard", + "soft" + ] + } + ] + }, + "nproc": { + "anyOf": [ + { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_NPROC_INVALID" + }, + { + "type": "object", + "properties": { + "hard": { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_HARD_INVALID" + }, + "soft": { + "type": "number", + "message": "CUSTOM_APP_ERROR_ULIMIT_SOFT_INVALID" + } + }, + "required": [ + "hard", + "soft" + ] + } + ] + } + } + }, + "user": { + "type": "string" + }, + "volumes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "containerPath": { + "type": "string", + "message": "CUSTOM_APP_ERROR_CONTAINER_PATH_REQUIRED" + }, + "hostPath": { + "type": "string", + "message": "CUSTOM_APP_ERROR_HOST_PATH_REQUIRED" + }, + "bind": { + "type": "object", + "properties": { + "propagation": { + "enum": [ + "private", + "rprivate", + "rshared", + "rslave", + "shared", + "slave" + ] + } + }, + "required": [ + "propagation" + ] + }, + "private": { + "type": "boolean" + }, + "readOnly": { + "type": "boolean" + }, + "shared": { + "type": "boolean" + } + }, + "required": [ + "containerPath", + "hostPath" + ] + } + }, + "workingDir": { + "type": "string" + } + } + } + }, + "architecture": { + "anyOf": [ + { + "const": "amd64", + "message": "CUSTOM_APP_ERROR_ARCHITECTURE_INVALID" + }, + { + "const": "arm64", + "message": "CUSTOM_APP_ERROR_ARCHITECTURE_INVALID" + } + ], + "message": "CUSTOM_APP_ERROR_ARCHITECTURE_INVALID" + } + }, + "required": [ + "services" + ] + } + } + }, + "required": [ + "schemaVersion", + "services" + ] +} \ No newline at end of file diff --git a/apps/rego-tunnel/metadata/description.md b/apps/rego-tunnel/metadata/description.md new file mode 100755 index 0000000..149ac53 --- /dev/null +++ b/apps/rego-tunnel/metadata/description.md @@ -0,0 +1,82 @@ +

Windows
+
+ +
+
+ +

+ +Windows in a Docker container. + +## Features + + - ISO downloader + - KVM acceleration + - Web-based viewer + +## FAQ + +* ### How do I use it? + + Very simple! These are the steps: + + - Start the container and connect to [port 8006](http://localhost:8006) using your web browser. + + - Sit back and relax while the magic happens, the whole installation will be performed fully automatic. + + - Once you see the desktop, your Windows installation is ready for use. + + Enjoy your brand new machine, and don't forget to star this repo! + +* ### How do I select the Windows version? + + By default, Windows 11 will be installed. But you can change that in settings, in order to specify an alternative Windows version to be downloaded: + + Select from the values below: + + | **Value** | **Description** | **Source** | **Transfer** | **Size** | + |---|---|---|---|---| + | `win11` | Windows 11 Pro | Microsoft | Fast | 6.4 GB | + | `win10` | Windows 10 Pro | Microsoft | Fast | 5.8 GB | + | `ltsc10` | Windows 10 LTSC | Microsoft | Fast | 4.6 GB | + | `win81` | Windows 8.1 Pro | Microsoft | Fast | 4.2 GB | + | `win7` | Windows 7 SP1 | Bob Pony | Medium | 3.0 GB | + | `vista` | Windows Vista SP2 | Bob Pony | Medium | 3.6 GB | + | `winxp` | Windows XP SP3 | Bob Pony | Medium | 0.6 GB | + |||||| + | `2022` | Windows Server 2022 | Microsoft | Fast | 4.7 GB | + | `2019` | Windows Server 2019 | Microsoft | Fast | 5.3 GB | + | `2016` | Windows Server 2016 | Microsoft | Fast | 6.5 GB | + | `2012` | Windows Server 2012 R2 | Microsoft | Fast | 4.3 GB | + | `2008` | Windows Server 2008 R2 | Microsoft | Fast | 3.0 GB | + |||||| + | `core11` | Tiny 11 Core | Archive.org | Slow | 2.1 GB | + | `tiny11` | Tiny 11 | Archive.org | Slow | 3.8 GB | + | `tiny10` | Tiny 10 | Archive.org | Slow | 3.6 GB | + +* ### How do I connect using RDP? + + The web-viewer is mainly meant to be used during installation, as its picture quality is low, and it has no audio or clipboard for example. + + So for a better experience you can connect using any Microsoft Remote Desktop client to the IP of the container, using the username `docker` and by leaving the password empty. + + There is a good RDP client for [Android](https://play.google.com/store/apps/details?id=com.microsoft.rdc.androidx) available from the Play Store. One for [iOS](https://apps.apple.com/nl/app/microsoft-remote-desktop/id714464092?l=en-GB) is in the Apple Store. For Linux you can use [rdesktop](http://www.rdesktop.org/) and for Windows you don't need to install anything as it is already ships as part of the operating system. + +* ### How do I verify if my system supports KVM? + + To verify if your system supports KVM, run the following commands: + + ```bash + sudo apt install cpu-checker + sudo kvm-ok + ``` + + If you receive an error from `kvm-ok` indicating that KVM acceleration can't be used, check the virtualization settings in the BIOS. + +* ### Is this project legal? + + Yes, this project contains only open-source code and does not distribute any copyrighted material. Any product keys found in the code are just generic placeholders provided by Microsoft for trial purposes. So under all applicable laws, this project would be considered legal. + +## Disclaimer + +The product names, logos, brands, and other trademarks referred to within this project are the property of their respective trademark holders. This project is not affiliated, sponsored, or endorsed by Microsoft Corporation. \ No newline at end of file diff --git a/apps/rego-tunnel/metadata/logo.jpg b/apps/rego-tunnel/metadata/logo.jpg new file mode 100755 index 0000000..e284945 Binary files /dev/null and b/apps/rego-tunnel/metadata/logo.jpg differ