├── .dockerignore ├── .github ├── dependabot.yml └── workflows │ ├── cd.yml │ └── ci.yml ├── .gitignore ├── .hadolint.yaml ├── Dockerfile ├── LICENSE ├── README.md ├── package-lock.json ├── package.json └── sonar-project.properties /.dockerignore: -------------------------------------------------------------------------------- 1 | .git/ 2 | .github/ 3 | README.md 4 | LICENSE 5 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: "daily" 7 | - package-ecosystem: "docker" 8 | directory: "/" 9 | schedule: 10 | interval: "daily" 11 | -------------------------------------------------------------------------------- /.github/workflows/cd.yml: -------------------------------------------------------------------------------- 1 | name: 'CD (multi arch)' 2 | on: 3 | push: 4 | tags: 5 | - 'v*' 6 | 7 | jobs: 8 | docker-buildx: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - 12 | name: Checkout 13 | uses: actions/checkout@v4 14 | - 15 | name: Docker meta 16 | id: meta 17 | uses: docker/metadata-action@v5 18 | with: 19 | images: | 20 | ghcr.io/raonigabriel/coder-server 21 | tags: | 22 | type=ref,event=branch 23 | type=ref,event=pr 24 | type=semver,pattern={{version}} 25 | type=semver,pattern={{major}}.{{minor}} 26 | - 27 | name: Set up QEMU 28 | uses: docker/setup-qemu-action@v3 29 | with: 30 | platforms: arm64 31 | - 32 | name: Set up Docker Buildx 33 | id: buildx 34 | uses: docker/setup-buildx-action@v3 35 | with: 36 | install: true 37 | - 38 | name: Login to GitHub Container Registry 39 | uses: docker/login-action@v3 40 | with: 41 | registry: ghcr.io 42 | username: ${{ github.actor }} 43 | password: ${{ secrets.GITHUB_TOKEN }} 44 | - 45 | name: Build and push 46 | uses: docker/build-push-action@v5 47 | with: 48 | context: . 49 | platforms: linux/amd64,linux/arm64 50 | push: true 51 | tags: ${{ steps.meta.outputs.tags }} 52 | labels: ${{ steps.meta.outputs.labels }} 53 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: 3 | push: 4 | branches: 5 | - master 6 | pull_request: 7 | types: [opened, synchronize, reopened] 8 | 9 | jobs: 10 | sonarcloud: 11 | name: CI 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout shallow 15 | uses: actions/checkout@v4 16 | with: 17 | fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of Sonar analysis 18 | - name: Hadolint 19 | uses: hadolint/hadolint-action@v3.1.0 20 | with: 21 | dockerfile: ./Dockerfile 22 | - name: SonarCloud Scan 23 | uses: SonarSource/sonarcloud-github-action@master 24 | env: 25 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any 26 | SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/** 2 | -------------------------------------------------------------------------------- /.hadolint.yaml: -------------------------------------------------------------------------------- 1 | ignored: 2 | - DL3018 # Pin versions in apk add. Instead of apk add , use apk add : 3 | - SC2086 # Double quote to prevent globbing and word splitting 4 | - DL3006 # Always tag the version of an image explicitly 5 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # This is a hack to setup alternate architecture names 2 | # For this to work, it needs to be built using docker 'buildx' 3 | FROM ghcr.io/raonigabriel/coder-core:1.1.0 AS linux-amd64 4 | ARG ALT_ARCH=x64 5 | 6 | FROM ghcr.io/raonigabriel/coder-core:1.1.0 AS linux-arm64 7 | ARG ALT_ARCH=arm64 8 | 9 | # This inherits from the hack above 10 | FROM ${TARGETOS}-${TARGETARCH} AS builder 11 | ARG TARGETARCH 12 | ARG CLOUDFLARE_VERSION=2023.10.0 13 | ARG OPENVSCODE_VERSION=v1.84.0 14 | 15 | # Install npm, nodejs and some tools required to build native node modules 16 | USER root 17 | RUN apk --no-cache add build-base libsecret-dev krb5-dev python3 wget 18 | 19 | COPY package*.json /tmp/ 20 | 21 | WORKDIR /tmp 22 | # Add dependencies 23 | RUN npm install && \ 24 | # Remove any precompiled native modules 25 | find /tmp/node_modules -name "*.node" -exec rm -rf {} \; 26 | 27 | # Build kerberos native module 28 | WORKDIR /tmp/node_modules/kerberos 29 | RUN npm run install && \ 30 | strip /tmp/node_modules/kerberos/build/Release/kerberos.node 31 | 32 | # Build node-pty native module 33 | WORKDIR /tmp/node_modules/node-pty 34 | RUN npm install && \ 35 | strip /tmp/node_modules/node-pty/build/Release/pty.node 36 | 37 | # Build @vscode/spdlog native module 38 | WORKDIR /tmp/node_modules/@vscode/spdlog 39 | RUN npm rebuild && \ 40 | strip /tmp/node_modules/@vscode/spdlog/build/Release/spdlog.node 41 | 42 | # Build native-watchdog native module 43 | WORKDIR /tmp/node_modules/native-watchdog 44 | RUN npm rebuild && \ 45 | strip /tmp/node_modules/native-watchdog/build/Release/watchdog.node 46 | 47 | # Build @parcel/watcher native module 48 | WORKDIR /tmp/node_modules/@parcel/watcher 49 | RUN npm install && \ 50 | strip /tmp/node_modules/@parcel/watcher/build/Release/watcher.node 51 | 52 | # Download 'cloudflared' manually instead of using apk. 53 | # This is currently required because it is only available on the edge/testing Alpine repo. 54 | RUN wget -nv https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARE_VERSION}/cloudflared-linux-${TARGETARCH} && \ 55 | chmod +x cloudflared-linux-${TARGETARCH} && \ 56 | # Remove debug symbols 57 | strip cloudflared-linux-${TARGETARCH} && \ 58 | # Put it into a 'staging' folder 59 | mkdir -p /tmp/staging/usr/bin && \ 60 | mv cloudflared-linux-${TARGETARCH} /tmp/staging/usr/bin/cloudflared && \ 61 | chown root:root /tmp/staging/usr/bin/cloudflared 62 | 63 | # Download 'openvscode-server' 64 | WORKDIR / 65 | RUN wget -nv https://github.com/gitpod-io/openvscode-server/releases/download/openvscode-server-${OPENVSCODE_VERSION}/openvscode-server-${OPENVSCODE_VERSION}-linux-${ALT_ARCH}.tar.gz && \ 66 | # Unpack it 67 | tar -xf openvscode-server-${OPENVSCODE_VERSION}-linux-${ALT_ARCH}.tar.gz && \ 68 | rm openvscode-server-${OPENVSCODE_VERSION}-linux-${ALT_ARCH}.tar.gz && \ 69 | # Remove the 'node binary that comes with it 70 | rm openvscode-server-${OPENVSCODE_VERSION}-linux-${ALT_ARCH}/node && \ 71 | # Replacing it with a symlink 72 | ln -s /usr/bin/node ./openvscode-server-${OPENVSCODE_VERSION}-linux-${ALT_ARCH}/node && \ 73 | # Remove pre-compiled binary node modules 74 | find openvscode-server-${OPENVSCODE_VERSION}-linux-${ALT_ARCH} -name "*.node" -exec rm -rf {} \; && \ 75 | # Put everything into a 'staging' folder 76 | mkdir -p /tmp/staging/opt/ && \ 77 | mv openvscode-server-${OPENVSCODE_VERSION}-linux-${ALT_ARCH} /tmp/staging/opt/openvscode-server && \ 78 | mkdir -p /tmp/staging/opt/openvscode-server/node_modules/kerberos/build/Release && \ 79 | mkdir -p /tmp/staging/opt/openvscode-server/node_modules/node-pty/build/Release && \ 80 | mkdir -p /tmp/staging/opt/openvscode-server/node_modules/@vscode/spdlog/build/Release && \ 81 | mkdir -p /tmp/staging/opt/openvscode-server/node_modules/native-watchdog/build/Release && \ 82 | mkdir -p /tmp/staging/opt/openvscode-server/node_modules/@parcel/watcher/build/Release && \ 83 | cp /tmp/node_modules/kerberos/build/Release/kerberos.node /tmp/staging/opt/openvscode-server/node_modules/kerberos/build/Release/kerberos.node && \ 84 | cp /tmp/node_modules/node-pty/build/Release/pty.node /tmp/staging/opt/openvscode-server/node_modules/node-pty/build/Release/pty.node && \ 85 | cp /tmp/node_modules/@vscode/spdlog/build/Release/spdlog.node /tmp/staging/opt/openvscode-server/node_modules/@vscode/spdlog/build/Release/spdlog.node && \ 86 | cp /tmp/node_modules/native-watchdog/build/Release/watchdog.node /tmp/staging/opt/openvscode-server/node_modules/native-watchdog/build/Release/watchdog.node && \ 87 | cp /tmp/node_modules/@parcel/watcher/build/Release/watcher.node /tmp/staging/opt/openvscode-server/node_modules/@parcel/watcher/build/Release/watcher.node && \ 88 | chown -R root:root /tmp/staging/opt/openvscode-server 89 | 90 | # Reliquish root powers 91 | USER coder 92 | 93 | # This inherits from the hack above 94 | FROM ${TARGETOS}-${TARGETARCH} AS final 95 | ARG TARGETARCH 96 | 97 | USER root 98 | RUN apk --no-cache add krb5 99 | USER coder 100 | 101 | # Copy stuff from the staging folder of the 'builder' stage 102 | COPY --from=builder /tmp/staging / 103 | 104 | ENV PATH=$PATH:/opt/openvscode-server/bin 105 | EXPOSE 8000 106 | CMD ["openvscode-server", "serve-local", "--host", "0.0.0.0", "--port", "8000", "--accept-server-license-terms", "--disable-telemetry", "--without-connection-token"] 107 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # coder-server 2 | This is my opinionated attempt to build a lightweight docker image to run [openvscode-server](https://github.com/gitpod-io/openvscode-server). Think vscode, on the browser. 3 | 4 | Enough talking, show me some numbers: 5 | 6 | | REPOSITORY | SIZE¹ | 7 | | --- | --- | 8 | | [codercom/code-server:latest](https://github.com/coder/code-server) | 697MB | 9 | | [linuxserver/code-server:latest](https://docs.linuxserver.io/images/docker-code-server) | 563MB | 10 | | [gitpod/openvscode-server:latest](https://github.com/gitpod-io/openvscode-server)| 523MB | 11 | | [ghcr.io/raonigabriel/coder-server:latest](https://github.com/raonigabriel/coder-core)| 208MB | 12 | 13 | * (1) Uncompressed sizes, on amd64. Those values are even smaller on aarch64!! 14 | 15 | # Features 16 | 1. Based on my [coder-core](https://github.com/raonigabriel/coder-core) instead of Ubuntu. This translates to [musl being used instead of glib](https://wiki.musl-libc.org/functional-differences-from-glibc.html), but compatibility libraries are also preinstalled. 17 | 2. Its is Alpine, but using **bash** instead of **ash**. 18 | 3. By using **tini**, we ensure that child processes are correctly reaped. 19 | 4. Default user **coder** and group **coder** using UID and GID = 1000, to ease volume-mapping permissions issues. 20 | 5. Passwordless, **sudo** support: easily install extra packages with apk (e.g, ```sudo apk add docker-cli jq```) 21 | 6. Preinstalled [cloudflare tunnel client](https://github.com/cloudflare/cloudflared), like ngrok but free!! This allows you to create reverse tunnels (when your are behind nat). See their docs [here](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps) 22 | 7. Preinstalled tooling (node, npm, git, curl, socat, openssh-client, nano, unzip, brotli, zstd, xz) !!! 23 | 8. Image is hosted on [GitHub Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry), hence no Dockerhub caps. 24 | 25 | # Guidelines that I follow 26 | - Whenever possible, install software directly from the Alpine repositories, i.e. use apk instead of downloading / manually installing them. 27 | - Keep it small: do not cross the 250MB image size boundary. 28 | - Multi arch (amd64 && arm64) 29 | 30 | # Security notice 31 | 1. By default this image is **not with running with HTTPS** but HTTP instead. Its your responsibility to add a reverse-proxy to do that. If you dont, keep in mind that some issues may arise, regarding service workers on the browser. This is because they [need HTTPS](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#setting_up_to_play_with_service_workers) to work properly. 32 | 33 | 2. By default this image has **no security enforced** (user / password). Its your responsibility to add a reverse-proxy to do that. 34 | 35 | # Usage 36 | ``` 37 | docker run -d -p 8000:8000 ghcr.io/raonigabriel/coder-server:latest 38 | ``` 39 | Then, point your browser to [http://localhost:8000](http://localhost:8000) 40 | 41 | # Setting up reverse tunnels 42 | [Official Guide](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide/) 43 | 44 | [Tutorial](https://omar2cloud.github.io/cloudflare/cloudflared/cloudflare/) 45 | 46 | [Video](https://www.youtube.com/watch?v=VrV0udRUi8A) 47 | 48 | 49 | # Creating your own derived image (Java example) 50 | ```Dockerfile 51 | FROM ghcr.io/raonigabriel/coder-server:latest 52 | 53 | # Setup env variables 54 | ENV JAVA_HOME=/usr/lib/jvm/default-jvm \ 55 | MAVEN_HOME=/usr/share/java/maven-3 \ 56 | GRADLE_HOME=/usr/share/java/gradle 57 | 58 | # Installing Java and tools 59 | RUN sudo apk --no-cache add maven gradle && \ 60 | # Installing Java extensions 61 | openvscode-server --install-extension vscjava.vscode-java-pack \ 62 | vscjava.vscode-gradle vscjava.vscode-spring-initializr 63 | ``` 64 | 65 | ## Licenses 66 | [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0) 67 | 68 | ## Disclaimer 69 | 70 | * I am **not** sponsored neither work for cloudflare. I just happen to use their services, because they are cool! 71 | * This code comes with no warranty. Use it at your own risk. 72 | * I don't like Apple. Fuck off, fan-boys. 73 | * I don't like left-winged snowflakes. Fuck off, code-covenant. 74 | * I will call my branches the old way. Long live **master**, fuck-off renaming. 75 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "coder-server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "coder-server", 9 | "version": "1.0.0", 10 | "license": "Apache-2.0", 11 | "dependencies": { 12 | "@parcel/watcher": "2.1.0", 13 | "@vscode/spdlog": "^0.13.12", 14 | "kerberos": "^2.0.1", 15 | "native-watchdog": "^1.4.2", 16 | "node-pty": "1.1.0-beta5" 17 | } 18 | }, 19 | "node_modules/@parcel/watcher": { 20 | "version": "2.3.0", 21 | "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.3.0.tgz", 22 | "integrity": "sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==", 23 | "hasInstallScript": true, 24 | "dependencies": { 25 | "detect-libc": "^1.0.3", 26 | "is-glob": "^4.0.3", 27 | "micromatch": "^4.0.5", 28 | "node-addon-api": "^7.0.0" 29 | }, 30 | "engines": { 31 | "node": ">= 10.0.0" 32 | }, 33 | "funding": { 34 | "type": "opencollective", 35 | "url": "https://opencollective.com/parcel" 36 | }, 37 | "optionalDependencies": { 38 | "@parcel/watcher-android-arm64": "2.3.0", 39 | "@parcel/watcher-darwin-arm64": "2.3.0", 40 | "@parcel/watcher-darwin-x64": "2.3.0", 41 | "@parcel/watcher-freebsd-x64": "2.3.0", 42 | "@parcel/watcher-linux-arm-glibc": "2.3.0", 43 | "@parcel/watcher-linux-arm64-glibc": "2.3.0", 44 | "@parcel/watcher-linux-arm64-musl": "2.3.0", 45 | "@parcel/watcher-linux-x64-glibc": "2.3.0", 46 | "@parcel/watcher-linux-x64-musl": "2.3.0", 47 | "@parcel/watcher-win32-arm64": "2.3.0", 48 | "@parcel/watcher-win32-ia32": "2.3.0", 49 | "@parcel/watcher-win32-x64": "2.3.0" 50 | } 51 | }, 52 | "node_modules/@parcel/watcher-android-arm64": { 53 | "version": "2.3.0", 54 | "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.3.0.tgz", 55 | "integrity": "sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==", 56 | "cpu": [ 57 | "arm64" 58 | ], 59 | "optional": true, 60 | "os": [ 61 | "android" 62 | ], 63 | "engines": { 64 | "node": ">= 10.0.0" 65 | }, 66 | "funding": { 67 | "type": "opencollective", 68 | "url": "https://opencollective.com/parcel" 69 | } 70 | }, 71 | "node_modules/@parcel/watcher-darwin-arm64": { 72 | "version": "2.3.0", 73 | "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.3.0.tgz", 74 | "integrity": "sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==", 75 | "cpu": [ 76 | "arm64" 77 | ], 78 | "optional": true, 79 | "os": [ 80 | "darwin" 81 | ], 82 | "engines": { 83 | "node": ">= 10.0.0" 84 | }, 85 | "funding": { 86 | "type": "opencollective", 87 | "url": "https://opencollective.com/parcel" 88 | } 89 | }, 90 | "node_modules/@parcel/watcher-darwin-x64": { 91 | "version": "2.3.0", 92 | "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.3.0.tgz", 93 | "integrity": "sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==", 94 | "cpu": [ 95 | "x64" 96 | ], 97 | "optional": true, 98 | "os": [ 99 | "darwin" 100 | ], 101 | "engines": { 102 | "node": ">= 10.0.0" 103 | }, 104 | "funding": { 105 | "type": "opencollective", 106 | "url": "https://opencollective.com/parcel" 107 | } 108 | }, 109 | "node_modules/@parcel/watcher-freebsd-x64": { 110 | "version": "2.3.0", 111 | "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.3.0.tgz", 112 | "integrity": "sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==", 113 | "cpu": [ 114 | "x64" 115 | ], 116 | "optional": true, 117 | "os": [ 118 | "freebsd" 119 | ], 120 | "engines": { 121 | "node": ">= 10.0.0" 122 | }, 123 | "funding": { 124 | "type": "opencollective", 125 | "url": "https://opencollective.com/parcel" 126 | } 127 | }, 128 | "node_modules/@parcel/watcher-linux-arm-glibc": { 129 | "version": "2.3.0", 130 | "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.3.0.tgz", 131 | "integrity": "sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==", 132 | "cpu": [ 133 | "arm" 134 | ], 135 | "optional": true, 136 | "os": [ 137 | "linux" 138 | ], 139 | "engines": { 140 | "node": ">= 10.0.0" 141 | }, 142 | "funding": { 143 | "type": "opencollective", 144 | "url": "https://opencollective.com/parcel" 145 | } 146 | }, 147 | "node_modules/@parcel/watcher-linux-arm64-glibc": { 148 | "version": "2.3.0", 149 | "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.3.0.tgz", 150 | "integrity": "sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==", 151 | "cpu": [ 152 | "arm64" 153 | ], 154 | "optional": true, 155 | "os": [ 156 | "linux" 157 | ], 158 | "engines": { 159 | "node": ">= 10.0.0" 160 | }, 161 | "funding": { 162 | "type": "opencollective", 163 | "url": "https://opencollective.com/parcel" 164 | } 165 | }, 166 | "node_modules/@parcel/watcher-linux-arm64-musl": { 167 | "version": "2.3.0", 168 | "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.3.0.tgz", 169 | "integrity": "sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==", 170 | "cpu": [ 171 | "arm64" 172 | ], 173 | "optional": true, 174 | "os": [ 175 | "linux" 176 | ], 177 | "engines": { 178 | "node": ">= 10.0.0" 179 | }, 180 | "funding": { 181 | "type": "opencollective", 182 | "url": "https://opencollective.com/parcel" 183 | } 184 | }, 185 | "node_modules/@parcel/watcher-linux-x64-glibc": { 186 | "version": "2.3.0", 187 | "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.3.0.tgz", 188 | "integrity": "sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==", 189 | "cpu": [ 190 | "x64" 191 | ], 192 | "optional": true, 193 | "os": [ 194 | "linux" 195 | ], 196 | "engines": { 197 | "node": ">= 10.0.0" 198 | }, 199 | "funding": { 200 | "type": "opencollective", 201 | "url": "https://opencollective.com/parcel" 202 | } 203 | }, 204 | "node_modules/@parcel/watcher-linux-x64-musl": { 205 | "version": "2.3.0", 206 | "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.3.0.tgz", 207 | "integrity": "sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==", 208 | "cpu": [ 209 | "x64" 210 | ], 211 | "optional": true, 212 | "os": [ 213 | "linux" 214 | ], 215 | "engines": { 216 | "node": ">= 10.0.0" 217 | }, 218 | "funding": { 219 | "type": "opencollective", 220 | "url": "https://opencollective.com/parcel" 221 | } 222 | }, 223 | "node_modules/@parcel/watcher-win32-arm64": { 224 | "version": "2.3.0", 225 | "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.3.0.tgz", 226 | "integrity": "sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==", 227 | "cpu": [ 228 | "arm64" 229 | ], 230 | "optional": true, 231 | "os": [ 232 | "win32" 233 | ], 234 | "engines": { 235 | "node": ">= 10.0.0" 236 | }, 237 | "funding": { 238 | "type": "opencollective", 239 | "url": "https://opencollective.com/parcel" 240 | } 241 | }, 242 | "node_modules/@parcel/watcher-win32-ia32": { 243 | "version": "2.3.0", 244 | "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.3.0.tgz", 245 | "integrity": "sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==", 246 | "cpu": [ 247 | "ia32" 248 | ], 249 | "optional": true, 250 | "os": [ 251 | "win32" 252 | ], 253 | "engines": { 254 | "node": ">= 10.0.0" 255 | }, 256 | "funding": { 257 | "type": "opencollective", 258 | "url": "https://opencollective.com/parcel" 259 | } 260 | }, 261 | "node_modules/@parcel/watcher-win32-x64": { 262 | "version": "2.3.0", 263 | "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.3.0.tgz", 264 | "integrity": "sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==", 265 | "cpu": [ 266 | "x64" 267 | ], 268 | "optional": true, 269 | "os": [ 270 | "win32" 271 | ], 272 | "engines": { 273 | "node": ">= 10.0.0" 274 | }, 275 | "funding": { 276 | "type": "opencollective", 277 | "url": "https://opencollective.com/parcel" 278 | } 279 | }, 280 | "node_modules/@vscode/spdlog": { 281 | "version": "0.13.12", 282 | "resolved": "https://registry.npmjs.org/@vscode/spdlog/-/spdlog-0.13.12.tgz", 283 | "integrity": "sha512-8Qw8VwBzFkH6AWVKh+ULeVDff0lwTh/PkEKUOwRpyuu7Mr7W2zQoc+oAaGmTWKb1NPmvVeXmo+qF9X+jXuBCOg==", 284 | "hasInstallScript": true, 285 | "dependencies": { 286 | "bindings": "^1.5.0", 287 | "mkdirp": "^1.0.4", 288 | "nan": "^2.17.0" 289 | } 290 | }, 291 | "node_modules/base64-js": { 292 | "version": "1.5.1", 293 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 294 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 295 | "funding": [ 296 | { 297 | "type": "github", 298 | "url": "https://github.com/sponsors/feross" 299 | }, 300 | { 301 | "type": "patreon", 302 | "url": "https://www.patreon.com/feross" 303 | }, 304 | { 305 | "type": "consulting", 306 | "url": "https://feross.org/support" 307 | } 308 | ] 309 | }, 310 | "node_modules/bindings": { 311 | "version": "1.5.0", 312 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 313 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 314 | "dependencies": { 315 | "file-uri-to-path": "1.0.0" 316 | } 317 | }, 318 | "node_modules/bl": { 319 | "version": "4.1.0", 320 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 321 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 322 | "dependencies": { 323 | "buffer": "^5.5.0", 324 | "inherits": "^2.0.4", 325 | "readable-stream": "^3.4.0" 326 | } 327 | }, 328 | "node_modules/braces": { 329 | "version": "3.0.2", 330 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 331 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 332 | "dependencies": { 333 | "fill-range": "^7.0.1" 334 | }, 335 | "engines": { 336 | "node": ">=8" 337 | } 338 | }, 339 | "node_modules/buffer": { 340 | "version": "5.7.1", 341 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 342 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 343 | "funding": [ 344 | { 345 | "type": "github", 346 | "url": "https://github.com/sponsors/feross" 347 | }, 348 | { 349 | "type": "patreon", 350 | "url": "https://www.patreon.com/feross" 351 | }, 352 | { 353 | "type": "consulting", 354 | "url": "https://feross.org/support" 355 | } 356 | ], 357 | "dependencies": { 358 | "base64-js": "^1.3.1", 359 | "ieee754": "^1.1.13" 360 | } 361 | }, 362 | "node_modules/chownr": { 363 | "version": "1.1.4", 364 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 365 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 366 | }, 367 | "node_modules/decompress-response": { 368 | "version": "6.0.0", 369 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 370 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 371 | "dependencies": { 372 | "mimic-response": "^3.1.0" 373 | }, 374 | "engines": { 375 | "node": ">=10" 376 | }, 377 | "funding": { 378 | "url": "https://github.com/sponsors/sindresorhus" 379 | } 380 | }, 381 | "node_modules/deep-extend": { 382 | "version": "0.6.0", 383 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 384 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 385 | "engines": { 386 | "node": ">=4.0.0" 387 | } 388 | }, 389 | "node_modules/detect-libc": { 390 | "version": "1.0.3", 391 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 392 | "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", 393 | "bin": { 394 | "detect-libc": "bin/detect-libc.js" 395 | }, 396 | "engines": { 397 | "node": ">=0.10" 398 | } 399 | }, 400 | "node_modules/end-of-stream": { 401 | "version": "1.4.4", 402 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 403 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 404 | "dependencies": { 405 | "once": "^1.4.0" 406 | } 407 | }, 408 | "node_modules/expand-template": { 409 | "version": "2.0.3", 410 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 411 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 412 | "engines": { 413 | "node": ">=6" 414 | } 415 | }, 416 | "node_modules/file-uri-to-path": { 417 | "version": "1.0.0", 418 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 419 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" 420 | }, 421 | "node_modules/fill-range": { 422 | "version": "7.0.1", 423 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 424 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 425 | "dependencies": { 426 | "to-regex-range": "^5.0.1" 427 | }, 428 | "engines": { 429 | "node": ">=8" 430 | } 431 | }, 432 | "node_modules/fs-constants": { 433 | "version": "1.0.0", 434 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 435 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 436 | }, 437 | "node_modules/github-from-package": { 438 | "version": "0.0.0", 439 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 440 | "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" 441 | }, 442 | "node_modules/ieee754": { 443 | "version": "1.2.1", 444 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 445 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 446 | "funding": [ 447 | { 448 | "type": "github", 449 | "url": "https://github.com/sponsors/feross" 450 | }, 451 | { 452 | "type": "patreon", 453 | "url": "https://www.patreon.com/feross" 454 | }, 455 | { 456 | "type": "consulting", 457 | "url": "https://feross.org/support" 458 | } 459 | ] 460 | }, 461 | "node_modules/inherits": { 462 | "version": "2.0.4", 463 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 464 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 465 | }, 466 | "node_modules/ini": { 467 | "version": "1.3.8", 468 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 469 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 470 | }, 471 | "node_modules/is-extglob": { 472 | "version": "2.1.1", 473 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 474 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 475 | "engines": { 476 | "node": ">=0.10.0" 477 | } 478 | }, 479 | "node_modules/is-glob": { 480 | "version": "4.0.3", 481 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 482 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 483 | "dependencies": { 484 | "is-extglob": "^2.1.1" 485 | }, 486 | "engines": { 487 | "node": ">=0.10.0" 488 | } 489 | }, 490 | "node_modules/is-number": { 491 | "version": "7.0.0", 492 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 493 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 494 | "engines": { 495 | "node": ">=0.12.0" 496 | } 497 | }, 498 | "node_modules/kerberos": { 499 | "version": "2.1.0", 500 | "resolved": "https://registry.npmjs.org/kerberos/-/kerberos-2.1.0.tgz", 501 | "integrity": "sha512-HvOl6O6cyEN/8Z4CAocHe/sekJtvt5UrxUdCuu7bXDZ2Hnsy6OpsQbISW+lpm03vrbO2ir+1QQ5Sx/vMEhHnog==", 502 | "hasInstallScript": true, 503 | "dependencies": { 504 | "bindings": "^1.5.0", 505 | "node-addon-api": "^6.1.0", 506 | "prebuild-install": "7.1.1" 507 | }, 508 | "engines": { 509 | "node": ">=12.9.0" 510 | } 511 | }, 512 | "node_modules/kerberos/node_modules/node-addon-api": { 513 | "version": "6.1.0", 514 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", 515 | "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" 516 | }, 517 | "node_modules/lru-cache": { 518 | "version": "6.0.0", 519 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 520 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 521 | "dependencies": { 522 | "yallist": "^4.0.0" 523 | }, 524 | "engines": { 525 | "node": ">=10" 526 | } 527 | }, 528 | "node_modules/micromatch": { 529 | "version": "4.0.5", 530 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 531 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 532 | "dependencies": { 533 | "braces": "^3.0.2", 534 | "picomatch": "^2.3.1" 535 | }, 536 | "engines": { 537 | "node": ">=8.6" 538 | } 539 | }, 540 | "node_modules/mimic-response": { 541 | "version": "3.1.0", 542 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 543 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 544 | "engines": { 545 | "node": ">=10" 546 | }, 547 | "funding": { 548 | "url": "https://github.com/sponsors/sindresorhus" 549 | } 550 | }, 551 | "node_modules/minimist": { 552 | "version": "1.2.8", 553 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 554 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 555 | "funding": { 556 | "url": "https://github.com/sponsors/ljharb" 557 | } 558 | }, 559 | "node_modules/mkdirp": { 560 | "version": "1.0.4", 561 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 562 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 563 | "bin": { 564 | "mkdirp": "bin/cmd.js" 565 | }, 566 | "engines": { 567 | "node": ">=10" 568 | } 569 | }, 570 | "node_modules/mkdirp-classic": { 571 | "version": "0.5.3", 572 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 573 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" 574 | }, 575 | "node_modules/nan": { 576 | "version": "2.18.0", 577 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", 578 | "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" 579 | }, 580 | "node_modules/napi-build-utils": { 581 | "version": "1.0.2", 582 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 583 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" 584 | }, 585 | "node_modules/native-watchdog": { 586 | "version": "1.4.2", 587 | "resolved": "https://registry.npmjs.org/native-watchdog/-/native-watchdog-1.4.2.tgz", 588 | "integrity": "sha512-iT3Uj6FFdrW5vHbQ/ybiznLus9oiUoMJ8A8nyugXv9rV3EBhIodmGs+mztrwQyyBc+PB5/CrskAH/WxaUVRRSQ==", 589 | "hasInstallScript": true 590 | }, 591 | "node_modules/node-abi": { 592 | "version": "3.51.0", 593 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.51.0.tgz", 594 | "integrity": "sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==", 595 | "dependencies": { 596 | "semver": "^7.3.5" 597 | }, 598 | "engines": { 599 | "node": ">=10" 600 | } 601 | }, 602 | "node_modules/node-addon-api": { 603 | "version": "7.0.0", 604 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", 605 | "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==" 606 | }, 607 | "node_modules/node-pty": { 608 | "version": "1.1.0-beta5", 609 | "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-1.1.0-beta5.tgz", 610 | "integrity": "sha512-j3QdgFHnLY0JWxztrvM3g67RaQLOGvytv+C6mFu0PqD+JILlzqfwuoyqRqVxdZZjoOTUXPfSRj1qPVCaCH+eOw==", 611 | "hasInstallScript": true, 612 | "dependencies": { 613 | "nan": "^2.17.0" 614 | } 615 | }, 616 | "node_modules/once": { 617 | "version": "1.4.0", 618 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 619 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 620 | "dependencies": { 621 | "wrappy": "1" 622 | } 623 | }, 624 | "node_modules/picomatch": { 625 | "version": "2.3.1", 626 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 627 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 628 | "engines": { 629 | "node": ">=8.6" 630 | }, 631 | "funding": { 632 | "url": "https://github.com/sponsors/jonschlinkert" 633 | } 634 | }, 635 | "node_modules/prebuild-install": { 636 | "version": "7.1.1", 637 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", 638 | "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", 639 | "dependencies": { 640 | "detect-libc": "^2.0.0", 641 | "expand-template": "^2.0.3", 642 | "github-from-package": "0.0.0", 643 | "minimist": "^1.2.3", 644 | "mkdirp-classic": "^0.5.3", 645 | "napi-build-utils": "^1.0.1", 646 | "node-abi": "^3.3.0", 647 | "pump": "^3.0.0", 648 | "rc": "^1.2.7", 649 | "simple-get": "^4.0.0", 650 | "tar-fs": "^2.0.0", 651 | "tunnel-agent": "^0.6.0" 652 | }, 653 | "bin": { 654 | "prebuild-install": "bin.js" 655 | }, 656 | "engines": { 657 | "node": ">=10" 658 | } 659 | }, 660 | "node_modules/prebuild-install/node_modules/detect-libc": { 661 | "version": "2.0.2", 662 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", 663 | "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", 664 | "engines": { 665 | "node": ">=8" 666 | } 667 | }, 668 | "node_modules/pump": { 669 | "version": "3.0.0", 670 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 671 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 672 | "dependencies": { 673 | "end-of-stream": "^1.1.0", 674 | "once": "^1.3.1" 675 | } 676 | }, 677 | "node_modules/rc": { 678 | "version": "1.2.8", 679 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 680 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 681 | "dependencies": { 682 | "deep-extend": "^0.6.0", 683 | "ini": "~1.3.0", 684 | "minimist": "^1.2.0", 685 | "strip-json-comments": "~2.0.1" 686 | }, 687 | "bin": { 688 | "rc": "cli.js" 689 | } 690 | }, 691 | "node_modules/readable-stream": { 692 | "version": "3.6.2", 693 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 694 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 695 | "dependencies": { 696 | "inherits": "^2.0.3", 697 | "string_decoder": "^1.1.1", 698 | "util-deprecate": "^1.0.1" 699 | }, 700 | "engines": { 701 | "node": ">= 6" 702 | } 703 | }, 704 | "node_modules/safe-buffer": { 705 | "version": "5.2.1", 706 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 707 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 708 | "funding": [ 709 | { 710 | "type": "github", 711 | "url": "https://github.com/sponsors/feross" 712 | }, 713 | { 714 | "type": "patreon", 715 | "url": "https://www.patreon.com/feross" 716 | }, 717 | { 718 | "type": "consulting", 719 | "url": "https://feross.org/support" 720 | } 721 | ] 722 | }, 723 | "node_modules/semver": { 724 | "version": "7.5.4", 725 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 726 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 727 | "dependencies": { 728 | "lru-cache": "^6.0.0" 729 | }, 730 | "bin": { 731 | "semver": "bin/semver.js" 732 | }, 733 | "engines": { 734 | "node": ">=10" 735 | } 736 | }, 737 | "node_modules/simple-concat": { 738 | "version": "1.0.1", 739 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 740 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 741 | "funding": [ 742 | { 743 | "type": "github", 744 | "url": "https://github.com/sponsors/feross" 745 | }, 746 | { 747 | "type": "patreon", 748 | "url": "https://www.patreon.com/feross" 749 | }, 750 | { 751 | "type": "consulting", 752 | "url": "https://feross.org/support" 753 | } 754 | ] 755 | }, 756 | "node_modules/simple-get": { 757 | "version": "4.0.1", 758 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 759 | "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 760 | "funding": [ 761 | { 762 | "type": "github", 763 | "url": "https://github.com/sponsors/feross" 764 | }, 765 | { 766 | "type": "patreon", 767 | "url": "https://www.patreon.com/feross" 768 | }, 769 | { 770 | "type": "consulting", 771 | "url": "https://feross.org/support" 772 | } 773 | ], 774 | "dependencies": { 775 | "decompress-response": "^6.0.0", 776 | "once": "^1.3.1", 777 | "simple-concat": "^1.0.0" 778 | } 779 | }, 780 | "node_modules/string_decoder": { 781 | "version": "1.3.0", 782 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 783 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 784 | "dependencies": { 785 | "safe-buffer": "~5.2.0" 786 | } 787 | }, 788 | "node_modules/strip-json-comments": { 789 | "version": "2.0.1", 790 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 791 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 792 | "engines": { 793 | "node": ">=0.10.0" 794 | } 795 | }, 796 | "node_modules/tar-fs": { 797 | "version": "2.1.1", 798 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", 799 | "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", 800 | "dependencies": { 801 | "chownr": "^1.1.1", 802 | "mkdirp-classic": "^0.5.2", 803 | "pump": "^3.0.0", 804 | "tar-stream": "^2.1.4" 805 | } 806 | }, 807 | "node_modules/tar-stream": { 808 | "version": "2.2.0", 809 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 810 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 811 | "dependencies": { 812 | "bl": "^4.0.3", 813 | "end-of-stream": "^1.4.1", 814 | "fs-constants": "^1.0.0", 815 | "inherits": "^2.0.3", 816 | "readable-stream": "^3.1.1" 817 | }, 818 | "engines": { 819 | "node": ">=6" 820 | } 821 | }, 822 | "node_modules/to-regex-range": { 823 | "version": "5.0.1", 824 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 825 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 826 | "dependencies": { 827 | "is-number": "^7.0.0" 828 | }, 829 | "engines": { 830 | "node": ">=8.0" 831 | } 832 | }, 833 | "node_modules/tunnel-agent": { 834 | "version": "0.6.0", 835 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 836 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 837 | "dependencies": { 838 | "safe-buffer": "^5.0.1" 839 | }, 840 | "engines": { 841 | "node": "*" 842 | } 843 | }, 844 | "node_modules/util-deprecate": { 845 | "version": "1.0.2", 846 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 847 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 848 | }, 849 | "node_modules/wrappy": { 850 | "version": "1.0.2", 851 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 852 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 853 | }, 854 | "node_modules/yallist": { 855 | "version": "4.0.0", 856 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 857 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 858 | } 859 | } 860 | } 861 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "coder-server", 3 | "version": "1.0.0", 4 | "description": "This is my opinionated attempt to build a lightweight docker image to run [openvscode-server](https://github.com/gitpod-io/openvscode-server). Think vscode, on the browser.", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/raonigabriel/coder-server.git" 12 | }, 13 | "author": "Raoni Gabriel", 14 | "license": "Apache-2.0", 15 | "bugs": { 16 | "url": "https://github.com/raonigabriel/coder-server/issues" 17 | }, 18 | "homepage": "https://github.com/raonigabriel/coder-server#readme", 19 | "dependencies": { 20 | "@parcel/watcher": "2.1.0", 21 | "kerberos": "^2.0.1", 22 | "native-watchdog": "^1.4.2", 23 | "node-pty": "1.1.0-beta5", 24 | "@vscode/spdlog": "^0.13.12" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /sonar-project.properties: -------------------------------------------------------------------------------- 1 | sonar.organization=raonigabriel 2 | sonar.projectKey=raonigabriel_coder-server 3 | sonar.host.url=https://sonarcloud.io 4 | --------------------------------------------------------------------------------