code-server / start.sh
cacode's picture
Update start.sh
2953ba2 verified
#!/usr/bin/env bash
set -euo pipefail
PORT="${PORT:-7860}"
if [[ -z "${PASSWORD:-}" && -z "${HASHED_PASSWORD:-}" ]]; then
echo "[ERROR] Missing PASSWORD/HASHED_PASSWORD secret."
exit 1
fi
if [[ -d "/data" ]]; then
WORKDIR="/data/workspace"
EXT_DIR="/data/code-server/extensions"
USER_DATA_DIR="/data/code-server/user-data"
CODEX_DIR="/data/.codex"
else
WORKDIR="${HOME}/workspace"
EXT_DIR="${HOME}/.local/share/code-server/extensions"
USER_DATA_DIR="${HOME}/.local/share/code-server/user-data"
CODEX_DIR="${HOME}/.codex"
fi
mkdir -p "$WORKDIR" "$EXT_DIR" "$USER_DATA_DIR" "${USER_DATA_DIR}/User" "${HOME}/.config/code-server" "$CODEX_DIR"
cat > "${HOME}/.config/code-server/config.yaml" <<EOF
bind-addr: 0.0.0.0:${PORT}
auth: password
cert: false
EOF
if [[ -n "${HASHED_PASSWORD:-}" ]]; then
echo "hashed-password: ${HASHED_PASSWORD}" >> "${HOME}/.config/code-server/config.yaml"
else
echo "password: ${PASSWORD}" >> "${HOME}/.config/code-server/config.yaml"
fi
# Codex config.toml
: "${CODEX_MODEL_PROVIDER:=sub2api}"
: "${CODEX_MODEL:=gpt-5.3-codex}"
: "${CODEX_REASONING_EFFORT:=high}"
: "${CODEX_NETWORK_ACCESS:=enabled}"
: "${CODEX_DISABLE_RESPONSE_STORAGE:=true}"
: "${CODEX_WSL_ACK:=true}"
: "${CODEX_VERBOSITY:=high}"
: "${CODEX_PROVIDER_NAME:=sub2api}"
: "${CODEX_BASE_URL:=https://cacode-sub2api.hf.space}"
: "${CODEX_WIRE_API:=responses}"
: "${CODEX_REQUIRES_OPENAI_AUTH:=true}"
cat > "${CODEX_DIR}/config.toml" <<EOF
model_provider = "${CODEX_MODEL_PROVIDER}"
model = "${CODEX_MODEL}"
model_reasoning_effort = "${CODEX_REASONING_EFFORT}"
network_access = "${CODEX_NETWORK_ACCESS}"
disable_response_storage = ${CODEX_DISABLE_RESPONSE_STORAGE}
windows_wsl_setup_acknowledged = ${CODEX_WSL_ACK}
model_verbosity = "${CODEX_VERBOSITY}"
[model_providers.${CODEX_PROVIDER_NAME}]
name = "${CODEX_PROVIDER_NAME}"
base_url = "${CODEX_BASE_URL}"
wire_api = "${CODEX_WIRE_API}"
requires_openai_auth = ${CODEX_REQUIRES_OPENAI_AUTH}
EOF
if [[ -n "${CODEX_AUTH_JSON:-}" ]]; then
printf '%s\n' "${CODEX_AUTH_JSON}" > "${CODEX_DIR}/auth.json"
elif [[ -n "${OPENAI_API_KEY:-}" ]]; then
cat > "${CODEX_DIR}/auth.json" <<EOF
{
"OPENAI_API_KEY": "${OPENAI_API_KEY}"
}
EOF
fi
chmod 600 "${CODEX_DIR}/config.toml" 2>/dev/null || true
chmod 600 "${CODEX_DIR}/auth.json" 2>/dev/null || true
if [[ "${CODEX_DIR}" != "${HOME}/.codex" ]]; then
rm -rf "${HOME}/.codex"
ln -s "${CODEX_DIR}" "${HOME}/.codex"
fi
# 默认中文界面
cat > "${USER_DATA_DIR}/User/locale.json" <<EOF
{
"locale": "zh-cn"
}
EOF
# 首次启动安装扩展(幂等)
EXT_MARKER="${USER_DATA_DIR}/.extensions_installed"
if [[ ! -f "${EXT_MARKER}" ]]; then
echo "[INFO] Installing extensions on first boot..."
install_ext() {
code-server --extensions-dir "${EXT_DIR}" --install-extension "$1" || true
}
# 你指定的 3 个(尽量装)
install_ext ms-vscode.cpptools
install_ext ms-vscode.cpptools-themes
install_ext ms-vscode.cpp-devtools
install_ext ms-vscode.cmake-tools
install_ext danielpinto8zz6.c-cpp-compile-run
install_ext redhat.java
install_ext vscjava.vscode-java-debug
install_ext vscjava.vscode-java-test
install_ext vscjava.vscode-maven
install_ext vscjava.vscode-gradle
install_ext vscjava.vscode-java-dependency
install_ext ms-python.vscode-pylance
install_ext ms-python.python
install_ext ms-python.debugpy
install_ext ms-python.vscode-python-envs
# Codex
install_ext openai.chatgpt
# 若微软扩展不可用,装稳定替代
install_ext MS-CEINTL.vscode-language-pack-zh-hans
install_ext llvm-vs-code-extensions.vscode-clangd
install_ext ms-vscode.makefile-tools
install_ext vadimcn.vscode-lldb
touch "${EXT_MARKER}"
fi
echo "[INFO] Java: $(java -version 2>&1 | head -n1 || true)"
echo "[INFO] Python: $(python --version || true)"
echo "[INFO] Pip: $(pip --version || true)"
echo "[INFO] Node: $(node --version || true)"
echo "[INFO] g++: $(g++ --version | head -n1 || true)"
exec code-server "$WORKDIR" \
--extensions-dir "$EXT_DIR" \
--user-data-dir "$USER_DATA_DIR" \
--disable-telemetry \
--disable-update-check \
--log warn