pve9-repo-fix/code-server.sh
시골약사 2780b5cf14 feat: Add code-server installation and setup script
 새로운 기능:
- code-server 자동 설치 (미설치 시)
- 설정 파일 자동 생성 및 구성
- 기존 프로세스 정리 (중복 실행 방지)
- 0.0.0.0 바인딩으로 외부 접속 가능
- nohup 백그라운드 실행 (세션 종료 후에도 유지)

🛠️ 사용 방법:
- 기본 포트(8080): ./code-server.sh
- 포트 지정: PORT=8443 ./code-server.sh
- 무인 설치: PASSWORD="pass" SKIP_CONFIRM=1 ./code-server.sh

🔧 주요 기능:
- systemd 미사용 (수동 관리)
- 설정 백업 자동 생성
- 프로세스 안전 종료 후 재시작

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 23:14:31 +09:00

129 lines
4.6 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
#
# setup-code-server.sh
# - code-server 미설치 시 자동 설치
# - 최초 1회 실행해 ~/.config/code-server/config.yaml 생성
# - config.yaml을 0.0.0.0:<PORT> + 지정 비밀번호로 갱신
# - 기존에 떠있는 code-server(수동/비-systemd) 프로세스 정리
# - systemd 미사용: nohup으로 백그라운드 실행
#
# 환경변수:
# PORT=8080 # 바인드 포트 (기본 8080)
# PASSWORD= # 비밀번호(무인 실행용)
# SKIP_CONFIRM=0/1 # 비밀번호 확인 입력 생략
#
set -euo pipefail
PORT="${PORT:-8080}"
CONFIG_DIR="${HOME}/.config/code-server"
CONFIG_FILE="${CONFIG_DIR}/config.yaml"
LOG_FILE="${HOME}/code-server.log"
say() { echo -e "$@"; }
die() { echo -e "$@" >&2; exit 1; }
# 0) 필수 도구 준비 (curl/timeout/pgrep 등)
if ! command -v curl >/dev/null 2>&1 || ! command -v timeout >/dev/null 2>&1; then
say "📦 필요 패키지 설치 중 (curl, coreutils, procps 등)..."
if command -v apt >/dev/null 2>&1; then
apt update -y >/dev/null 2>&1 || true
apt install -y curl ca-certificates coreutils procps >/dev/null 2>&1
else
die "apt 환경이 아닙니다. curl/timeout/pgrep가 필요합니다."
fi
fi
# 1) code-server 설치 확인 및 자동 설치
if ! command -v code-server >/dev/null 2>&1; then
say "📦 code-server 미설치 상태 → 설치 진행..."
bash <(curl -fsSL https://code-server.dev/install.sh)
command -v code-server >/dev/null 2>&1 || die "code-server 설치 실패"
say "✅ code-server 설치 완료"
else
say "✅ code-server 이미 설치됨"
fi
# 2) config.yaml 생성 (없으면 최초 1회 3~5초 실행)
if [ ! -f "${CONFIG_FILE}" ]; then
say "📝 config.yaml 이 없어 최초 1회 실행으로 생성합니다..."
mkdir -p "${CONFIG_DIR}"
timeout 5s code-server >/dev/null 2>&1 || true
[ -f "${CONFIG_FILE}" ] || die "config.yaml 생성 실패"
say "✅ 기본 config.yaml 생성됨: ${CONFIG_FILE}"
else
say " 기존 config.yaml 감지: ${CONFIG_FILE}"
fi
# 3) 비밀번호 입력/확정
if [ "${PASSWORD-}" = "" ]; then
read -rsp "🔐 code-server 접속 비밀번호 입력: " PASS; echo
if [ "${SKIP_CONFIRM-0}" != "1" ]; then
read -rsp "🔐 비밀번호 확인 입력: " PASS2; echo
[ "$PASS" = "$PASS2" ] || die "비밀번호 불일치"
fi
else
PASS="$PASSWORD"
fi
[ -n "$PASS" ] || die "비밀번호는 비어 있을 수 없습니다."
# 4) 기존 파일 백업 후 config.yaml 갱신
ts="$(date +%Y%m%d%H%M%S)"
if [ -f "${CONFIG_FILE}" ]; then
cp -a "${CONFIG_FILE}" "${CONFIG_FILE}.bak.${ts}"
say "🗂 백업 생성: ${CONFIG_FILE}.bak.${ts}"
fi
cat > "${CONFIG_FILE}" <<EOF
bind-addr: 0.0.0.0:${PORT}
auth: password
password: ${PASS}
cert: false
EOF
say "✅ config.yaml 갱신됨 (bind-addr=0.0.0.0:${PORT})"
# 5) systemd로 떠있다면 중지(원하시는 게 '비-systemd' 운영이므로)
if command -v systemctl >/dev/null 2>&1; then
if systemctl is-active --quiet "code-server@${USER}"; then
say "⏹ systemd 서비스(code-server@${USER}) 중지"
systemctl stop "code-server@${USER}" || true
fi
if [ "$EUID" -eq 0 ] && systemctl is-active --quiet "code-server@root"; then
say "⏹ systemd 서비스(code-server@root}) 중지"
systemctl stop "code-server@root" || true
fi
fi
# 6) 수동/기존 실행 프로세스 정리 (부모/자식 순서 종료)
say "🧹 기존 code-server 수동 프로세스 정리..."
# 부모 엔트리(메인/entry) TERM
pids="$(pgrep -f "/usr/lib/code-server/lib/node /usr/lib/code-server($|/out/node/entry)" || true)"
if [ -n "${pids}" ]; then
for p in $pids; do
pkill -TERM -P "$p" 2>/dev/null || true
kill -TERM "$p" 2>/dev/null || true
done
sleep 2
fi
# 남아있으면 KILL
pids="$(pgrep -f "/usr/lib/code-server/lib/node /usr/lib/code-server($|/out/node/entry)" || true)"
[ -n "${pids}" ] && kill -9 $pids 2>/dev/null || true
# 보조 호스트/터미널 프로세스 잔여물 정리(있어도 없어도 무방)
pkill -f "vscode/out/bootstrap-fork --type=ptyHost" 2>/dev/null || true
pkill -f "vscode/out/bootstrap-fork --type=extensionHost" 2>/dev/null || true
pkill -f "shellIntegration-bash.sh" 2>/dev/null || true
# 7) 비-systemd 백그라운드 실행
say "🚀 code-server 일반 실행(nohup 백그라운드) 시작..."
nohup code-server > "${LOG_FILE}" 2>&1 &
pid=$!
disown || true
sleep 1
say "✅ 실행됨 (PID: ${pid})"
say "📄 로그 보기: tail -f ${LOG_FILE}"
say "🌐 접속 URL: http://<서버IP>:${PORT}"
say "🔑 비밀번호: (방금 설정한 값)"
say "🔒 보안 권장: 역프록시(Caddy/Nginx) + HTTPS 사용 시 config는 127.0.0.1로 바꾸세요."