aboutsummaryrefslogtreecommitdiff
path: root/services/docker/debian-dev
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-02-22 18:11:35 +0800
committerYuqian Yang <crupest@crupest.life>2025-02-23 01:36:11 +0800
commit1e9b2436eaffa4130f6a69c3a108f6feb9dd4ac8 (patch)
tree585b6124b0100371b4bd8a291c4a59fbb5fbf1fe /services/docker/debian-dev
parenta931457d61b053682d5e89a0cfb411e43e5e21c7 (diff)
downloadcrupest-1e9b2436eaffa4130f6a69c3a108f6feb9dd4ac8.tar.gz
crupest-1e9b2436eaffa4130f6a69c3a108f6feb9dd4ac8.tar.bz2
crupest-1e9b2436eaffa4130f6a69c3a108f6feb9dd4ac8.zip
feat(services): refactor structure.
Diffstat (limited to 'services/docker/debian-dev')
-rw-r--r--services/docker/debian-dev/Dockerfile24
-rwxr-xr-xservices/docker/debian-dev/bootstrap/extra/setup-cmake.bash9
-rwxr-xr-xservices/docker/debian-dev/bootstrap/extra/setup-dotnet.bash10
-rwxr-xr-xservices/docker/debian-dev/bootstrap/extra/setup-llvm.bash26
-rw-r--r--services/docker/debian-dev/bootstrap/home/.bashrc117
-rw-r--r--services/docker/debian-dev/bootstrap/home/.quiltrc-dpkg13
-rw-r--r--services/docker/debian-dev/bootstrap/official.sources23
-rwxr-xr-xservices/docker/debian-dev/bootstrap/setup-apt.bash41
-rwxr-xr-xservices/docker/debian-dev/bootstrap/setup.bash56
9 files changed, 319 insertions, 0 deletions
diff --git a/services/docker/debian-dev/Dockerfile b/services/docker/debian-dev/Dockerfile
new file mode 100644
index 0000000..8114c56
--- /dev/null
+++ b/services/docker/debian-dev/Dockerfile
@@ -0,0 +1,24 @@
+FROM debian:latest
+
+ARG USER=crupest
+ARG IN_CHINA=
+
+ENV CRUPEST_DEBIAN_DEV_USER=${USER}
+ENV CRUPEST_DEBIAN_DEV_IN_CHINA=${IN_CHINA}
+
+ADD bootstrap /bootstrap
+RUN /bootstrap/setup.bash
+
+ENV LANG=en_US.utf8
+USER ${USER}
+WORKDIR /home/${USER}
+
+RUN --mount=type=secret,id=code-server-password,required=true,env=CRUPEST_CODE_SERVER_PASSWORD \
+ mkdir -p ${HOME}/.config/code-server && \
+ echo -e "auth: password\nhashed-password: " >> ${HOME}/.config/code-server/config.yaml && \
+ echo -n "$CRUPEST_CODE_SERVER_PASSWORD" | argon2 $(shuf -i 10000000-99999999 -n 1 --random-source /dev/urandom) -e >> ${HOME}/.config/code-server/config.yaml
+
+EXPOSE 4567
+VOLUME [ "/home/${USER}" ]
+
+CMD [ "tini", "--", "/usr/bin/code-server", "--bind-addr", "0.0.0.0:4567" ]
diff --git a/services/docker/debian-dev/bootstrap/extra/setup-cmake.bash b/services/docker/debian-dev/bootstrap/extra/setup-cmake.bash
new file mode 100755
index 0000000..76c1ae4
--- /dev/null
+++ b/services/docker/debian-dev/bootstrap/extra/setup-cmake.bash
@@ -0,0 +1,9 @@
+#! /usr/bin/env bash
+
+set -e
+
+CMAKE_VERSION=$(curl -s https://api.github.com/repos/Kitware/CMake/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
+wget -O cmake-installer.sh https://github.com/Kitware/CMake/releases/download/v"$CMAKE_VERSION"/cmake-"$CMAKE_VERSION"-linux-x86_64.sh
+chmod +x cmake-installer.sh
+./cmake-installer.sh --skip-license --prefix=/usr
+rm cmake-installer.sh
diff --git a/services/docker/debian-dev/bootstrap/extra/setup-dotnet.bash b/services/docker/debian-dev/bootstrap/extra/setup-dotnet.bash
new file mode 100755
index 0000000..0ef7743
--- /dev/null
+++ b/services/docker/debian-dev/bootstrap/extra/setup-dotnet.bash
@@ -0,0 +1,10 @@
+#! /usr/bin/env bash
+
+set -e
+
+wget https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
+dpkg -i packages-microsoft-prod.deb
+rm packages-microsoft-prod.deb
+
+apt-get update
+apt-get install -y dotnet-sdk-7.0
diff --git a/services/docker/debian-dev/bootstrap/extra/setup-llvm.bash b/services/docker/debian-dev/bootstrap/extra/setup-llvm.bash
new file mode 100755
index 0000000..48dde86
--- /dev/null
+++ b/services/docker/debian-dev/bootstrap/extra/setup-llvm.bash
@@ -0,0 +1,26 @@
+#! /usr/bin/env bash
+
+set -e
+
+LLVM_VERSION=18
+
+. /bootstrap/func.bash
+
+if is_true "$CRUPEST_DEBIAN_DEV_IN_CHINA"; then
+ base_url=https://mirrors.tuna.tsinghua.edu.cn/llvm-apt
+else
+ base_url=https://apt.llvm.org
+fi
+
+wget "$base_url/llvm.sh"
+chmod +x llvm.sh
+./llvm.sh $LLVM_VERSION all -m "$base_url"
+rm llvm.sh
+
+update-alternatives --install /usr/bin/clang clang /usr/bin/clang-$LLVM_VERSION 100 \
+ --slave /usr/bin/clang++ clang++ /usr/bin/clang++-$LLVM_VERSION \
+ --slave /usr/bin/clangd clangd /usr/bin/clangd-$LLVM_VERSION \
+ --slave /usr/bin/clang-format clang-format /usr/bin/clang-format-$LLVM_VERSION \
+ --slave /usr/bin/clang-tidy clang-tidy /usr/bin/clang-tidy-$LLVM_VERSION \
+ --slave /usr/bin/lldb lldb /usr/bin/lldb-$LLVM_VERSION \
+ --slave /usr/bin/lld lld /usr/bin/lld-$LLVM_VERSION
diff --git a/services/docker/debian-dev/bootstrap/home/.bashrc b/services/docker/debian-dev/bootstrap/home/.bashrc
new file mode 100644
index 0000000..3646ee2
--- /dev/null
+++ b/services/docker/debian-dev/bootstrap/home/.bashrc
@@ -0,0 +1,117 @@
+# ~/.bashrc: executed by bash(1) for non-login shells.
+# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
+# for examples
+
+# If not running interactively, don't do anything
+case $- in
+ *i*) ;;
+ *) return;;
+esac
+
+# don't put duplicate lines or lines starting with space in the history.
+# See bash(1) for more options
+HISTCONTROL=ignoreboth
+
+# append to the history file, don't overwrite it
+shopt -s histappend
+
+# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
+HISTSIZE=1000
+HISTFILESIZE=2000
+
+# check the window size after each command and, if necessary,
+# update the values of LINES and COLUMNS.
+shopt -s checkwinsize
+
+# If set, the pattern "**" used in a pathname expansion context will
+# match all files and zero or more directories and subdirectories.
+#shopt -s globstar
+
+# make less more friendly for non-text input files, see lesspipe(1)
+#[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
+
+# set variable identifying the chroot you work in (used in the prompt below)
+if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
+ debian_chroot=$(cat /etc/debian_chroot)
+fi
+
+# set a fancy prompt (non-color, unless we know we "want" color)
+case "$TERM" in
+ xterm-color|*-256color) color_prompt=yes;;
+esac
+
+# uncomment for a colored prompt, if the terminal has the capability; turned
+# off by default to not distract the user: the focus in a terminal window
+# should be on the output of commands, not on the prompt
+#force_color_prompt=yes
+
+if [ -n "$force_color_prompt" ]; then
+ if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
+ # We have color support; assume it's compliant with Ecma-48
+ # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
+ # a case would tend to support setf rather than setaf.)
+ color_prompt=yes
+ else
+ color_prompt=
+ fi
+fi
+
+if [ "$color_prompt" = yes ]; then
+ PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
+else
+ PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
+fi
+unset color_prompt force_color_prompt
+
+# If this is an xterm set the title to user@host:dir
+case "$TERM" in
+xterm*|rxvt*)
+ PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
+ ;;
+*)
+ ;;
+esac
+
+# enable color support of ls and also add handy aliases
+if [ -x /usr/bin/dircolors ]; then
+ test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
+ alias ls='ls --color=auto'
+ #alias dir='dir --color=auto'
+ #alias vdir='vdir --color=auto'
+
+ #alias grep='grep --color=auto'
+ #alias fgrep='fgrep --color=auto'
+ #alias egrep='egrep --color=auto'
+fi
+
+# colored GCC warnings and errors
+#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
+
+# some more ls aliases
+#alias ll='ls -l'
+#alias la='ls -A'
+#alias l='ls -CF'
+
+# Alias definitions.
+# You may want to put all your additions into a separate file like
+# ~/.bash_aliases, instead of adding them here directly.
+# See /usr/share/doc/bash-doc/examples in the bash-doc package.
+
+if [ -f ~/.bash_aliases ]; then
+ . ~/.bash_aliases
+fi
+
+# enable programmable completion features (you don't need to enable
+# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
+# sources /etc/bash.bashrc).
+if ! shopt -oq posix; then
+ if [ -f /usr/share/bash-completion/bash_completion ]; then
+ . /usr/share/bash-completion/bash_completion
+ elif [ -f /etc/bash_completion ]; then
+ . /etc/bash_completion
+ fi
+fi
+
+alias dquilt="quilt --quiltrc=${HOME}/.quiltrc-dpkg"
+. /usr/share/bash-completion/completions/quilt
+complete -F _quilt_completion $_quilt_complete_opt dquilt
diff --git a/services/docker/debian-dev/bootstrap/home/.quiltrc-dpkg b/services/docker/debian-dev/bootstrap/home/.quiltrc-dpkg
new file mode 100644
index 0000000..e8fc3c5
--- /dev/null
+++ b/services/docker/debian-dev/bootstrap/home/.quiltrc-dpkg
@@ -0,0 +1,13 @@
+d=.
+while [ ! -d $d/debian -a `readlink -e $d` != / ];
+ do d=$d/..; done
+if [ -d $d/debian ] && [ -z $QUILT_PATCHES ]; then
+ # if in Debian packaging tree with unset $QUILT_PATCHES
+ QUILT_PATCHES="debian/patches"
+ QUILT_PATCH_OPTS="--reject-format=unified"
+ QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto"
+ QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
+ QUILT_COLORS="diff_hdr=1;32:diff_add=1;34:diff_rem=1;31:diff_hunk=1;33:"
+ QUILT_COLORS="${QUILT_COLORS}diff_ctx=35:diff_cctx=33"
+ if ! [ -d $d/debian/patches ]; then mkdir $d/debian/patches; fi
+fi
diff --git a/services/docker/debian-dev/bootstrap/official.sources b/services/docker/debian-dev/bootstrap/official.sources
new file mode 100644
index 0000000..c9aa9a0
--- /dev/null
+++ b/services/docker/debian-dev/bootstrap/official.sources
@@ -0,0 +1,23 @@
+Types: deb
+URIs: http://deb.debian.org/debian
+Suites: bookworm bookworm-updates bookworm-backports
+Components: main contrib non-free non-free-firmware
+Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
+
+Types: deb-src
+URIs: http://deb.debian.org/debian
+Suites: bookworm bookworm-updates bookworm-backports
+Components: main contrib non-free non-free-firmware
+Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
+
+Types: deb
+URIs: http://deb.debian.org/debian-security
+Suites: bookworm-security
+Components: main contrib non-free non-free-firmware
+Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
+
+Types: deb-src
+URIs: http://deb.debian.org/debian-security
+Suites: bookworm-security
+Components: main contrib non-free non-free-firmware
+Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
diff --git a/services/docker/debian-dev/bootstrap/setup-apt.bash b/services/docker/debian-dev/bootstrap/setup-apt.bash
new file mode 100755
index 0000000..38cba05
--- /dev/null
+++ b/services/docker/debian-dev/bootstrap/setup-apt.bash
@@ -0,0 +1,41 @@
+#! /usr/bin/env bash
+# shellcheck disable=1090,1091
+
+set -e
+
+if [[ $EUID -ne 0 ]]; then
+ die "This script must be run as root."
+fi
+
+script_dir=$(dirname "$0")
+
+old_one="/etc/apt/sources.list"
+new_one="/etc/apt/sources.list.d/debian.sources"
+
+echo "Setup apt sources ..."
+
+echo "Backup old ones to .bak ..."
+if [[ -f "$old_one" ]]; then
+ mv "$old_one" "$old_one.bak"
+fi
+
+if [[ -f "$new_one" ]]; then
+ mv "$new_one" "$new_one.bak"
+fi
+
+echo "Copy the new one ..."
+cp "$script_dir/official.sources" "$new_one"
+
+if [[ -n "$CRUPEST_DEBIAN_DEV_IN_CHINA" ]]; then
+ echo "Replace with China mirror ..."
+ china_mirror="mirrors.ustc.edu.cn"
+ sed -i "s|deb.debian.org|${china_mirror}|" "$new_one"
+fi
+
+echo "Try to use https ..."
+apt-get update
+apt-get install -y apt-transport-https ca-certificates
+
+sed -i 's|http://|https://|' "$new_one"
+
+echo "APT source setup done!"
diff --git a/services/docker/debian-dev/bootstrap/setup.bash b/services/docker/debian-dev/bootstrap/setup.bash
new file mode 100755
index 0000000..65aabbb
--- /dev/null
+++ b/services/docker/debian-dev/bootstrap/setup.bash
@@ -0,0 +1,56 @@
+#! /usr/bin/env bash
+# shellcheck disable=1090,1091
+
+set -e -o pipefail
+
+die() {
+ echo "$@" >&2
+ exit 1
+}
+
+if [[ $EUID -ne 0 ]]; then
+ die "This script must be run as root."
+fi
+
+script_dir=$(dirname "$0")
+
+os_release_file="/etc/os-release"
+if [[ -f "$os_release_file" ]]; then
+ debian_version=$(. "$os_release_file"; echo "$VERSION_CODENAME")
+ if [[ "$debian_version" != "bookworm" ]]; then
+ die "This script can only be run on Debian Bookworm. But it is $debian_version"
+ fi
+else
+ die "$os_release_file not found. Failed to get debian version."
+fi
+
+script_dir=$(dirname "$0")
+
+export DEBIAN_FRONTEND=noninteractive
+
+echo "Begin to setup debian..."
+
+bash "$script_dir/setup-apt.bash"
+
+echo "Installing packages..."
+apt-get update
+apt-get install -y \
+ tini locales procps sudo vim less man bash-completion curl wget \
+ build-essential git devscripts debhelper quilt argon2
+
+echo "Setting up locale..."
+localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
+
+echo "Setting up sudo..."
+sed -i.bak 's|%sudo[[:space:]]\+ALL=(ALL:ALL)[[:space:]]\+ALL|%sudo ALL=(ALL:ALL) NOPASSWD: ALL|' /etc/sudoers
+
+echo "Creating user $CRUPEST_DEBIAN_DEV_USER ..."
+useradd -m -G sudo -s /usr/bin/bash "$CRUPEST_DEBIAN_DEV_USER"
+
+echo "Setting up code-server..."
+curl -fsSL https://code-server.dev/install.sh | sh
+
+echo "Cleaning up apt source index..."
+rm -rf /var/lib/apt/lists/*
+
+echo "Setup debian done."