diff --git a/code_server_install.sh b/code_server_install.sh
new file mode 100644
index 0000000..7984460
--- /dev/null
+++ b/code_server_install.sh
@@ -0,0 +1,618 @@
+#!/bin/sh
+set -eu
+
+# code-server's automatic install script.
+# See https://coder.com/docs/code-server/latest/install
+
+usage() {
+ arg0="$0"
+ if [ "$0" = sh ]; then
+ arg0="curl -fsSL https://code-server.dev/install.sh | sh -s --"
+ else
+ not_curl_usage="The latest script is available at https://code-server.dev/install.sh
+"
+ fi
+
+ cath << EOF
+Installs code-server.
+It tries to use the system package manager if possible.
+After successful installation it explains how to start using code-server.
+
+Pass in user@host to install code-server on user@host over ssh.
+The remote host must have internet access.
+${not_curl_usage-}
+Usage:
+
+ $arg0 [--dry-run] [--version X.X.X] [--edge] [--method detect] \
+ [--prefix ~/.local] [--rsh ssh] [user@host]
+
+ --dry-run
+ Echo the commands for the install process without running them.
+
+ --version X.X.X
+ Install a specific version instead of the latest.
+
+ --edge
+ Install the latest edge version instead of the latest stable version.
+
+ --method [detect | standalone]
+ Choose the installation method. Defaults to detect.
+ - detect detects the system package manager and tries to use it.
+ Full reference on the process is further below.
+ - standalone installs a standalone release archive into ~/.local
+ Add ~/.local/bin to your \$PATH to use it.
+
+ --prefix
+ Sets the prefix used by standalone release archives. Defaults to ~/.local
+ The release is unarchived into ~/.local/lib/code-server-X.X.X
+ and the binary symlinked into ~/.local/bin/code-server
+ To install system wide pass --prefix=/usr/local
+
+ --rsh
+ Specifies the remote shell for remote installation. Defaults to ssh.
+
+The detection method works as follows:
+ - Debian, Ubuntu, Raspbian: install the deb package from GitHub.
+ - Fedora, CentOS, RHEL, openSUSE: install the rpm package from GitHub.
+ - Arch Linux: install from the AUR (which pulls releases from GitHub).
+ - FreeBSD, Alpine: install from npm.
+ - macOS: install using Homebrew if installed otherwise install from GitHub.
+ - All others: install the release from GitHub.
+
+We only build releases on GitHub for amd64 and arm64 on Linux and amd64 for
+macOS. When the detection method tries to pull a release from GitHub it will
+fall back to installing from npm when there is no matching release for the
+system's operating system and architecture.
+
+The standalone method will force installion using GitHub releases. It will not
+fall back to npm so on architectures without pre-built releases this will error.
+
+The installer will cache all downloaded assets into ~/.cache/code-server
+
+More installation docs are at https://coder.com/docs/code-server/latest/install
+EOF
+}
+
+echo_latest_version() {
+ if [ "${EDGE-}" ]; then
+ version="$(curl -fsSL https://api.github.com/repos/coder/code-server/releases | awk 'match($0,/.*"html_url": "(.*\/releases\/tag\/.*)".*/)' | head -n 1 | awk -F '"' '{print $4}')"
+ else
+ # https://gist.github.com/lukechilds/a83e1d7127b78fef38c2914c4ececc3c#gistcomment-2758860
+ version="$(curl -fsSLI -o /dev/null -w "%{url_effective}" https://github.com/coder/code-server/releases/latest)"
+ fi
+ version="${version#https://github.com/coder/code-server/releases/tag/}"
+ version="${version#v}"
+ echo "$version"
+}
+
+echo_npm_postinstall() {
+ echoh
+ cath << EOF
+npm package has been installed.
+
+Extend your path to use code-server:
+ PATH="$NPM_BIN_DIR:\$PATH"
+Then run with:
+ code-server
+EOF
+}
+
+echo_standalone_postinstall() {
+ echoh
+ cath << EOF
+Standalone release has been installed into $STANDALONE_INSTALL_PREFIX/lib/code-server-$VERSION
+
+Extend your path to use code-server:
+ PATH="$STANDALONE_INSTALL_PREFIX/bin:\$PATH"
+Then run with:
+ code-server
+EOF
+}
+
+echo_brew_postinstall() {
+ echoh
+ cath << EOF
+Brew release has been installed.
+
+Run with:
+ code-server
+EOF
+}
+
+echo_systemd_postinstall() {
+ echoh
+ cath << EOF
+$1 package has been installed.
+
+To have systemd start code-server now and restart on boot:
+ sudo systemctl enable --now code-server@\$USER
+Or, if you don't want/need a background service you can run:
+ code-server
+EOF
+}
+
+echo_coder_postinstall() {
+ echoh
+ echoh "Deploy code-server for your team with Coder: https://github.com/coder/coder"
+}
+
+main() {
+ if [ "${TRACE-}" ]; then
+ set -x
+ fi
+
+ unset \
+ DRY_RUN \
+ METHOD \
+ OPTIONAL \
+ ALL_FLAGS \
+ RSH_ARGS \
+ EDGE \
+ RSH
+
+ ALL_FLAGS=""
+ while [ "$#" -gt 0 ]; do
+ case "$1" in
+ -*)
+ ALL_FLAGS="${ALL_FLAGS} $1"
+ ;;
+ esac
+
+ case "$1" in
+ --dry-run)
+ DRY_RUN=1
+ ;;
+ --method)
+ METHOD="$(parse_arg "$@")"
+ shift
+ ;;
+ --method=*)
+ METHOD="$(parse_arg "$@")"
+ ;;
+ --prefix)
+ STANDALONE_INSTALL_PREFIX="$(parse_arg "$@")"
+ shift
+ ;;
+ --prefix=*)
+ STANDALONE_INSTALL_PREFIX="$(parse_arg "$@")"
+ ;;
+ --version)
+ VERSION="$(parse_arg "$@")"
+ shift
+ ;;
+ --version=*)
+ VERSION="$(parse_arg "$@")"
+ ;;
+ --edge)
+ EDGE=1
+ ;;
+ --rsh)
+ RSH="$(parse_arg "$@")"
+ shift
+ ;;
+ --rsh=*)
+ RSH="$(parse_arg "$@")"
+ ;;
+ -h | --h | -help | --help)
+ usage
+ exit 0
+ ;;
+ --)
+ shift
+ # We remove the -- added above.
+ ALL_FLAGS="${ALL_FLAGS% --}"
+ RSH_ARGS="$*"
+ break
+ ;;
+ -*)
+ echoerr "Unknown flag $1"
+ echoerr "Run with --help to see usage."
+ exit 1
+ ;;
+ *)
+ RSH_ARGS="$*"
+ break
+ ;;
+ esac
+
+ shift
+ done
+
+ if [ "${RSH_ARGS-}" ]; then
+ RSH="${RSH-ssh}"
+ echoh "Installing remotely with $RSH $RSH_ARGS"
+ curl -fsSL https://code-server.dev/install.sh | prefix "$RSH_ARGS" "$RSH" "$RSH_ARGS" sh -s -- "$ALL_FLAGS"
+ return
+ fi
+
+ METHOD="${METHOD-detect}"
+ if [ "$METHOD" != detect ] && [ "$METHOD" != standalone ]; then
+ echoerr "Unknown install method \"$METHOD\""
+ echoerr "Run with --help to see usage."
+ exit 1
+ fi
+
+ # These are used by the various install_* functions that make use of GitHub
+ # releases in order to download and unpack the right release.
+ CACHE_DIR=$(echo_cache_dir)
+ STANDALONE_INSTALL_PREFIX=${STANDALONE_INSTALL_PREFIX:-$HOME/.local}
+ VERSION=${VERSION:-$(echo_latest_version)}
+ # These can be overridden for testing but shouldn't normally be used as it can
+ # result in a broken code-server.
+ OS=${OS:-$(os)}
+ ARCH=${ARCH:-$(arch)}
+
+ distro_name
+
+ # Standalone installs by pulling pre-built releases from GitHub.
+ if [ "$METHOD" = standalone ]; then
+ if has_standalone; then
+ install_standalone
+ echo_coder_postinstall
+ exit 0
+ else
+ echoerr "There are no standalone releases for $ARCH"
+ echoerr "Please try again without '--method standalone'"
+ exit 1
+ fi
+ fi
+
+ # DISTRO can be overridden for testing but shouldn't normally be used as it
+ # can result in a broken code-server.
+ DISTRO=${DISTRO:-$(distro)}
+
+ case $DISTRO in
+ # macOS uses brew when available and falls back to standalone. We only have
+ # amd64 for macOS so for anything else use npm.
+ macos)
+ BREW_PATH="${BREW_PATH-brew}"
+ if command_exists "$BREW_PATH"; then
+ install_brew
+ else
+ echoh "Homebrew not installed."
+ echoh "Falling back to standalone installation."
+ npm_fallback install_standalone
+ fi
+ ;;
+ # The .deb and .rpm files are pulled from GitHub and we only have amd64 and
+ # arm64 there and need to fall back to npm otherwise.
+ debian) npm_fallback install_deb ;;
+ fedora | opensuse) npm_fallback install_rpm ;;
+ # Arch uses the AUR package which only supports amd64 and arm64 since it
+ # pulls releases from GitHub so we need to fall back to npm.
+ arch) npm_fallback install_aur ;;
+ # We don't have GitHub releases that work on Alpine or FreeBSD so we have no
+ # choice but to use npm here.
+ alpine | freebsd) install_npm ;;
+ # For anything else we'll try to install standalone but fall back to npm if
+ # we don't have releases for the architecture.
+ *)
+ echoh "Unsupported package manager."
+ echoh "Falling back to standalone installation."
+ npm_fallback install_standalone
+ ;;
+ esac
+
+ echo_coder_postinstall
+}
+
+parse_arg() {
+ case "$1" in
+ *=*)
+ # Remove everything after first equal sign.
+ opt="${1%%=*}"
+ # Remove everything before first equal sign.
+ optarg="${1#*=}"
+ if [ ! "$optarg" ] && [ ! "${OPTIONAL-}" ]; then
+ echoerr "$opt requires an argument"
+ echoerr "Run with --help to see usage."
+ exit 1
+ fi
+ echo "$optarg"
+ return
+ ;;
+ esac
+
+ case "${2-}" in
+ "" | -*)
+ if [ ! "${OPTIONAL-}" ]; then
+ echoerr "$1 requires an argument"
+ echoerr "Run with --help to see usage."
+ exit 1
+ fi
+ ;;
+ *)
+ echo "$2"
+ return
+ ;;
+ esac
+}
+
+fetch() {
+ URL="$1"
+ FILE="$2"
+
+ if [ -e "$FILE" ]; then
+ echoh "+ Reusing $FILE"
+ return
+ fi
+
+ sh_c mkdir -p "$CACHE_DIR"
+ sh_c curl \
+ -#fL \
+ -o "$FILE.incomplete" \
+ -C - \
+ "$URL"
+ sh_c mv "$FILE.incomplete" "$FILE"
+}
+
+install_brew() {
+ echoh "Installing latest from Homebrew."
+ echoh
+
+ sh_c "$BREW_PATH" install code-server
+
+ echo_brew_postinstall
+}
+
+install_deb() {
+ echoh "Installing v$VERSION of the $ARCH deb package from GitHub."
+ echoh
+
+ fetch "https://github.com/coder/code-server/releases/download/v$VERSION/code-server_${VERSION}_$ARCH.deb" \
+ "$CACHE_DIR/code-server_${VERSION}_$ARCH.deb"
+ sudo_sh_c dpkg -i "$CACHE_DIR/code-server_${VERSION}_$ARCH.deb"
+
+ echo_systemd_postinstall deb
+}
+
+install_rpm() {
+ echoh "Installing v$VERSION of the $ARCH rpm package from GitHub."
+ echoh
+
+ fetch "https://github.com/coder/code-server/releases/download/v$VERSION/code-server-$VERSION-$ARCH.rpm" \
+ "$CACHE_DIR/code-server-$VERSION-$ARCH.rpm"
+ sudo_sh_c rpm -U "$CACHE_DIR/code-server-$VERSION-$ARCH.rpm"
+
+ echo_systemd_postinstall rpm
+}
+
+install_aur() {
+ echoh "Installing latest from the AUR."
+ echoh
+
+ sh_c mkdir -p "$CACHE_DIR/code-server-aur"
+ sh_c "curl -#fsSL https://aur.archlinux.org/cgit/aur.git/snapshot/code-server.tar.gz | tar -xzC $CACHE_DIR/code-server-aur --strip-components 1"
+ echo "+ cd $CACHE_DIR/code-server-aur"
+ if [ ! "${DRY_RUN-}" ]; then
+ cd "$CACHE_DIR/code-server-aur"
+ fi
+ sh_c makepkg -si --noconfirm
+
+ echo_systemd_postinstall AUR
+}
+
+install_standalone() {
+ echoh "Installing v$VERSION of the $ARCH release from GitHub."
+ echoh
+
+ fetch "https://github.com/coder/code-server/releases/download/v$VERSION/code-server-$VERSION-$OS-$ARCH.tar.gz" \
+ "$CACHE_DIR/code-server-$VERSION-$OS-$ARCH.tar.gz"
+
+ # -w only works if the directory exists so try creating it first. If this
+ # fails we can ignore the error as the -w check will then swap us to sudo.
+ sh_c mkdir -p "$STANDALONE_INSTALL_PREFIX" 2> /dev/null || true
+
+ sh_c="sh_c"
+ if [ ! -w "$STANDALONE_INSTALL_PREFIX" ]; then
+ sh_c="sudo_sh_c"
+ fi
+
+ if [ -e "$STANDALONE_INSTALL_PREFIX/lib/code-server-$VERSION" ]; then
+ echoh
+ echoh "code-server-$VERSION is already installed at $STANDALONE_INSTALL_PREFIX/lib/code-server-$VERSION"
+ echoh "Remove it to reinstall."
+ exit 0
+ fi
+
+ "$sh_c" mkdir -p "$STANDALONE_INSTALL_PREFIX/lib" "$STANDALONE_INSTALL_PREFIX/bin"
+ "$sh_c" tar -C "$STANDALONE_INSTALL_PREFIX/lib" -xzf "$CACHE_DIR/code-server-$VERSION-$OS-$ARCH.tar.gz"
+ "$sh_c" mv -f "$STANDALONE_INSTALL_PREFIX/lib/code-server-$VERSION-$OS-$ARCH" "$STANDALONE_INSTALL_PREFIX/lib/code-server-$VERSION"
+ "$sh_c" ln -fs "$STANDALONE_INSTALL_PREFIX/lib/code-server-$VERSION/bin/code-server" "$STANDALONE_INSTALL_PREFIX/bin/code-server"
+
+ echo_standalone_postinstall
+}
+
+install_npm() {
+ echoh "Installing latest from npm."
+ echoh
+
+ NPM_PATH="${YARN_PATH-npm}"
+
+ if command_exists "$NPM_PATH"; then
+ sh_c="sh_c"
+ if [ ! "${DRY_RUN-}" ] && [ ! -w "$(NPM_PATH config get prefix)" ]; then
+ sh_c="sudo_sh_c"
+ fi
+ echoh "Installing with npm."
+ echoh
+ "$sh_c" "$NPM_PATH" install -g code-server --unsafe-perm
+ NPM_BIN_DIR="\$($NPM_PATH bin -g)" echo_npm_postinstall
+ return
+ fi
+ echoerr "Please install npm to install code-server!"
+ echoerr "You will need at least node v12 and a few C dependencies."
+ echoerr "See the docs https://coder.com/docs/code-server/latest/install#npm"
+
+ exit 1
+}
+
+# Run $1 if we have a standalone otherwise run install_npm.
+npm_fallback() {
+ if has_standalone; then
+ $1
+ else
+ echoh "No standalone releases for $ARCH."
+ echoh "Falling back to installation from npm."
+ install_npm
+ fi
+}
+
+# Determine if we have standalone releases on GitHub for the system's arch.
+has_standalone() {
+ case $ARCH in
+ amd64) return 0 ;;
+ # We only have amd64 for macOS.
+ arm64)
+ [ "$(distro)" != macos ]
+ return
+ ;;
+ *) return 1 ;;
+ esac
+}
+
+os() {
+ uname="$(uname)"
+ case $uname in
+ Linux) echo linux ;;
+ Darwin) echo macos ;;
+ FreeBSD) echo freebsd ;;
+ *) echo "$uname" ;;
+ esac
+}
+
+# Print the detected Linux distro, otherwise print the OS name.
+#
+# Example outputs:
+# - macos -> macos
+# - freebsd -> freebsd
+# - ubuntu, raspbian, debian ... -> debian
+# - amzn, centos, rhel, fedora, ... -> fedora
+# - opensuse-{leap,tumbleweed} -> opensuse
+# - alpine -> alpine
+# - arch, manjaro, endeavouros, ... -> arch
+#
+# Inspired by https://github.com/docker/docker-install/blob/26ff363bcf3b3f5a00498ac43694bf1c7d9ce16c/install.sh#L111-L120.
+distro() {
+ if [ "$OS" = "macos" ] || [ "$OS" = "freebsd" ]; then
+ echo "$OS"
+ return
+ fi
+
+ if [ -f /etc/os-release ]; then
+ (
+ . /etc/os-release
+ if [ "${ID_LIKE-}" ]; then
+ for id_like in $ID_LIKE; do
+ case "$id_like" in debian | fedora | opensuse | arch)
+ echo "$id_like"
+ return
+ ;;
+ esac
+ done
+ fi
+
+ echo "$ID"
+ )
+ return
+ fi
+}
+
+# Print a human-readable name for the OS/distro.
+distro_name() {
+ if [ "$(uname)" = "Darwin" ]; then
+ echo "macOS v$(sw_vers -productVersion)"
+ return
+ fi
+
+ if [ -f /etc/os-release ]; then
+ (
+ . /etc/os-release
+ echo "$PRETTY_NAME"
+ )
+ return
+ fi
+
+ # Prints something like: Linux 4.19.0-9-amd64
+ uname -sr
+}
+
+arch() {
+ uname_m=$(uname -m)
+ case $uname_m in
+ aarch64) echo arm64 ;;
+ x86_64) echo amd64 ;;
+ *) echo "$uname_m" ;;
+ esac
+}
+
+command_exists() {
+ if [ ! "$1" ]; then return 1; fi
+ command -v "$@" > /dev/null
+}
+
+sh_c() {
+ echoh "+ $*"
+ if [ ! "${DRY_RUN-}" ]; then
+ sh -c "$*"
+ fi
+}
+
+sudo_sh_c() {
+ if [ "$(id -u)" = 0 ]; then
+ sh_c "$@"
+ elif command_exists doas; then
+ sh_c "doas $*"
+ elif command_exists sudo; then
+ sh_c "sudo $*"
+ elif command_exists su; then
+ sh_c "su root -c '$*'"
+ else
+ echoh
+ echoerr "This script needs to run the following command as root."
+ echoerr " $*"
+ echoerr "Please install doas, sudo, or su."
+ exit 1
+ fi
+}
+
+echo_cache_dir() {
+ if [ "${XDG_CACHE_HOME-}" ]; then
+ echo "$XDG_CACHE_HOME/code-server"
+ elif [ "${HOME-}" ]; then
+ echo "$HOME/.cache/code-server"
+ else
+ echo "/tmp/code-server-cache"
+ fi
+}
+
+echoh() {
+ echo "$@" | humanpath
+}
+
+cath() {
+ humanpath
+}
+
+echoerr() {
+ echoh "$@" >&2
+}
+
+# humanpath replaces all occurrences of " $HOME" with " ~"
+# and all occurrences of '"$HOME' with the literal '"$HOME'.
+humanpath() {
+ sed "s# $HOME# ~#g; s#\"$HOME#\"\$HOME#g"
+}
+
+# We need to make sure we exit with a non zero exit if the command fails.
+# /bin/sh does not support -o pipefail unfortunately.
+prefix() {
+ PREFIX="$1"
+ shift
+ fifo="$(mktemp -d)/fifo"
+ mkfifo "$fifo"
+ sed -e "s#^#$PREFIX: #" "$fifo" &
+ "$@" > "$fifo" 2>&1
+}
+
+main "$@"
\ No newline at end of file