diff --git a/vs-code-server/template/QUICKSTART.md b/vs-code-server/template/QUICKSTART.md deleted file mode 100644 index de944a8..0000000 --- a/vs-code-server/template/QUICKSTART.md +++ /dev/null @@ -1,82 +0,0 @@ -# 🎯 5 分鐘快速開始 - -## 步驟 1:啟動 Coder Server(已在 Docker 運行) - -```bash -docker-compose -f vs-code-server.yml up -d -``` - -驗證:訪問 https://code.karylab.com - ---- - -## 步驟 2:上傳 Template - -```bash -# 進入 template 目錄 -cd c:\Users\ckliu\Documents\docker_stack\vs-code-server - -# 登入 Coder(首次) -coder login https://code.karylab.com - -# 上傳 template -coder templates create -d ./template --name vscode -``` - ---- - -## 步驟 3:建立 Workspace(以使用者身份) - -1. 進入 https://code.karylab.com -2. 用 GitHub 登入 -3. Dashboard → "Create Workspace" -4. 選 "vscode" template -5. 輸入 workspace 名稱 -6. 點擊 "Create" -7. 等待 30-60 秒 - ---- - -## 步驟 4:使用 VSCode + Copilot - -1. Workspace 啟動後 → 在 Dashboard 中應看到 "code" 應用 -2. 點擊 "code" 進入 VSCode -3. 左側 Extensions → 搜尋 "GitHub Copilot" -4. 安裝並授權 -5. 開始寫代碼,Copilot 自動完成! - ---- - -## 常用命令 - -```bash -# 上傳 template(更新後重新執行) -coder templates create -d ./template --name vscode - -# 查看已上傳的 templates -coder templates list - -# 刪除 template -coder templates delete vscode -``` - ---- - -## 常見問題速查 - -| 問題 | 解決方案 | -|------|--------| -| Workspace 無法啟動 | 查看 Dashboard → Workspace → Logs | -| Copilot 無法認證 | 重新登入:Ctrl+Shift+P → "Copilot: Sign In" | -| 檔案未保存 | Settings → Auto Save → 確認已啟用 | -| 容器無法訪問 | 檢查 Docker 是否運行、防火牆設定 | - ---- - -## 🎓 更詳細的說明 - -查看 `README-CN.md` 瞭解完整功能、配置、故障排除等。 - ---- - -**下一步:** 登入 Coder,建立第一個 Workspace! diff --git a/vs-code-server/template/main.tf b/vs-code-server/template/main.tf deleted file mode 100644 index 4807825..0000000 --- a/vs-code-server/template/main.tf +++ /dev/null @@ -1,138 +0,0 @@ -terraform { - required_providers { - coder = { - source = "coder/coder" - } - } -} - -locals { - username = data.coder_workspace_owner.me.name - user_id = data.coder_workspace_owner.me.id -} - -data "coder_provisioner" "me" {} -data "coder_workspace" "me" {} -data "coder_workspace_owner" "me" {} - -variable "github_token" { - description = "GitHub token for Copilot (optional)" - type = string - sensitive = true - default = "" -} - -resource "coder_agent" "main" { - arch = data.coder_provisioner.me.arch - os = "linux" - - startup_script = <<-EOT - #!/bin/bash - set +e - - # 初始化使用者目錄 - if [ ! -f ~/.init_done ]; then - cp -rT /etc/skel ~ 2>/dev/null || true - touch ~/.init_done - fi - mkdir -p ~/.config ~/.cache ~/.local/share - - # 確保 code-server 運行中 - # codercom/enterprise-base 已預裝 code-server - # Coder agent 會自動管理 code-server 進程 - EOT - - env = { - GIT_AUTHOR_NAME = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name) - GIT_AUTHOR_EMAIL = data.coder_workspace_owner.me.email - GIT_COMMITTER_NAME = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name) - GIT_COMMITTER_EMAIL = data.coder_workspace_owner.me.email - GITHUB_TOKEN = var.github_token != "" ? var.github_token : "" - } - - metadata { - display_name = "CPU Usage" - key = "0_cpu_usage" - script = "coder stat cpu" - interval = 10 - timeout = 1 - } - - metadata { - display_name = "RAM Usage" - key = "1_ram_usage" - script = "coder stat mem" - interval = 10 - timeout = 1 - } - - metadata { - display_name = "Home Disk" - key = "3_home_disk" - script = "coder stat disk --path $${HOME}" - interval = 60 - timeout = 1 - } - - metadata { - display_name = "CPU Usage (Host)" - key = "4_cpu_usage_host" - script = "coder stat cpu --host" - interval = 10 - timeout = 1 - } - - metadata { - display_name = "Memory Usage (Host)" - key = "5_mem_usage_host" - script = "coder stat mem --host" - interval = 10 - timeout = 1 - } - - metadata { - display_name = "Load Average (Host)" - key = "6_load_host" - script = "echo \"$$(cat /proc/loadavg | awk '{ print $$1 }') $$(nproc)\" | awk '{ printf \"%0.2f\", $$1/$$2 }'" - interval = 60 - timeout = 1 - } - - metadata { - display_name = "Swap Usage (Host)" - key = "7_swap_host" - script = "free -b | awk '/^Swap/ { printf(\"%.1f/%.1f\", $$3/1024.0/1024.0/1024.0, $$2/1024.0/1024.0/1024.0) }'" - interval = 10 - timeout = 1 - } -} - -# code-server 應用配置 -resource "coder_app" "code_server" { - count = data.coder_workspace.me.start_count - agent_id = coder_agent.main.id - slug = "code-server" - display_name = "code-server" - icon = "/icon/code.svg" - url = "http://localhost:13337" - subdomain = false - share = "owner" - - healthcheck { - url = "http://localhost:13337/health" - interval = 3 - threshold = 10 - } -} - -# JetBrains IDE 支援(可選) -resource "coder_app" "jetbrains" { - count = data.coder_workspace.me.start_count - agent_id = coder_agent.main.id - slug = "jetbrains" - display_name = "JetBrains Toolbox" - icon = "/icon/jetbrains.svg" - url = "http://localhost:5037" - subdomain = false - share = "owner" -} diff --git a/vs-code-server/template/outputs.tf b/vs-code-server/template/outputs.tf deleted file mode 100644 index 3e1205b..0000000 --- a/vs-code-server/template/outputs.tf +++ /dev/null @@ -1,46 +0,0 @@ -# 定義 Terraform 輸出(使用者在 Coder Dashboard 可看到) - -output "workspace_owner" { - description = "Workspace owner (GitHub username)" - value = data.coder_workspace_owner.me.name -} - -output "workspace_id" { - description = "Workspace unique ID" - value = data.coder_workspace.me.id -} - -output "agent_status" { - description = "Coder Agent status" - value = "Check agent details in Coder UI" -} - -output "code_server_info" { - description = "code-server 存取資訊" - value = "Click 'code-server' button in Workspace details" -} - -output "volume_name" { - description = "Docker volume name for this workspace" - value = "coder-${data.coder_workspace.me.id}-home" -} - -output "git_config" { - description = "Git 已配置的使用者資訊" - value = { - author_name = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name) - author_email = data.coder_workspace_owner.me.email - } - sensitive = true -} - -output "resources_monitored" { - description = "已啟用的監控指標" - value = [ - "CPU Usage (current & host)", - "RAM Usage (current & host)", - "Disk Usage (home directory)", - "System Load Average", - "Swap Usage" - ] -} diff --git a/vs-code-server/template/readme.md b/vs-code-server/template/readme.md deleted file mode 100644 index 03efcc1..0000000 --- a/vs-code-server/template/readme.md +++ /dev/null @@ -1,337 +0,0 @@ -# 🚀 Coder VSCode Template 使用指南 - -## 📋 功能清單 - -- ✅ 每個使用者獨立 Workspace -- ✅ GitHub OIDC 登入認證 -- ✅ GitHub Copilot 支援 -- ✅ code-server 網頁版 VSCode -- ✅ 自動存檔 -- ✅ 程式碼 & 設定持久化 (Volume) -- ✅ JetBrains IDE 支援(可選) -- ✅ 資源監控(CPU、RAM、Disk) - ---- - -## 🎯 使用流程 - -### 第一步:啟動 Coder Server - -你的 Docker 環境中已有 `vs-code-server.yml`,執行: - -```bash -cd c:\Users\ckliu\Documents\docker_stack\vs-code-server -docker-compose -f vs-code-server.yml up -d -``` - -檢查 Coder 是否正常運行: -```bash -# 訪問 -https://code.karylab.com -``` - ---- - -### 第二步:上傳 Template 到 Coder - -#### 方法 A:使用 Coder CLI(推薦) - -```bash -# 1. 安裝 Coder CLI(如果還沒安裝) -# 參考:https://coder.com/docs/install - -# 2. 登入 Coder server -coder login https://code.karylab.com - -# 3. 上傳 template -coder templates create \ - -d c:\Users\ckliu\Documents\docker_stack\vs-code-server\template \ - --name vscode -``` - -#### 方法 B:在 Coder UI 手動上傳 - -1. 進入 https://code.karylab.com/admin/templates -2. 點擊 "Create template" -3. 上傳整個 `template` 資料夾 -4. 設定名稱為 "vscode" -5. 點擊 "Create" - ---- - -### 第三步:使用者建立 Workspace - -**以普通使用者身份:** - -1. **用 GitHub 登入 Coder** - ``` - 進入 https://code.karylab.com - → 點擊 "Sign in with GitHub" - → 授權 - ``` - -2. **建立新 Workspace** - ``` - Dashboard → "Create Workspace" - → Select template: "vscode" - → Workspace name: "my-first-workspace" - → 點擊 "Create" - ``` - -3. **等待初始化** - ``` - 狀態從 "Provisioning" → "Running" - (首次約 30-60 秒) - ``` - -4. **進入 VSCode** - ``` - Workspace 啟動後 → 在 Dashboard 中應看到 "code" 應用 - → 點擊進入網頁版 VSCode - ``` - ---- - -## 💡 在 VSCode 中使用 GitHub Copilot - -### 自動啟用(推薦) - -因為你已用 GitHub 登入,Copilot 會自動使用你的 GitHub 身份: - -1. 進入 VSCode → Extensions (Ctrl+Shift+X) -2. 搜尋 "GitHub Copilot" -3. 安裝官方 extension(Microsoft 出品) -4. 完成 → Copilot 自動認證 - -### 手動驗證 - -打開任何代碼文件,開始輸入: - -```python -# 計算兩個數的和 - -# Copilot 應該會自動完成: -def add(a, b): - return a + b -``` - -如果沒有自動完成建議,檢查: -- Extension 是否已安裝 -- GitHub 登入是否有效 - ---- - -## 📁 你的檔案存放位置 - -每個 Workspace 的檔案存儲結構: - -``` -Docker Volume: coder-- -└── /home/coder/ - ├── .config/code-server/ ← VSCode 設定、extension 清單 - ├── .cache/ ← Copilot 快取、編譯快取 - ├── .local/share/ ← VSCode 歷史、其他數據 - ├── .init_done ← 初始化標記(首次啟動時建立) - └── (你的程式碼檔案) ← 自動持久化 -``` - -**重要:** 所有檔案都保存在 Docker volume 中,你登出或停止 Workspace 時 **不會遺失**。 - ---- - -## 🔄 常見操作 - -### 重啟 Workspace - -``` -Dashboard → 選擇你的 Workspace -→ 點擊"..."菜單 -→ "Stop"(等 30 秒) -→ "Start" -``` - -### 刪除 Workspace - -``` -Dashboard → 選擇你的 Workspace -→ 點擊"..."菜單 -→ "Delete" -⚠️ 警告:會永久刪除該 Workspace 的所有檔案! -``` - -### 查看 Workspace 日誌 - -``` -Dashboard → 選擇你的 Workspace -→ 點擊"Logs" -(可看 startup_script 的執行結果,有錯誤時很有用) -``` - -### 自訂 Extensions - -在 VSCode 的終端執行: - -```bash -# 安裝 extension -code-server --install-extension ms-vscode.cpptools -code-server --install-extension ms-python.python -code-server --install-extension rust-lang.rust-analyzer - -# 查看已安裝 -code-server --list-extensions - -# 卸載 extension -code-server --uninstall-extension -``` - ---- - -## ⚙️ 進階配置 - -### 如果要自動安裝特定 Extensions - -編輯 `main.tf` 中的 `startup_script` 部分: - -```hcl -startup_script = <<-EOT - set -e - - # 初始化使用者目錄 - if [ ! -f ~/.init_done ]; then - cp -rT /etc/skel ~ - touch ~/.init_done - fi - - # 確保必要目錄存在 - mkdir -p ~/.config ~/.cache ~/.local/share - - # 自動安裝 extensions - code-server --install-extension github.copilot - code-server --install-extension ms-vscode.cpptools - code-server --install-extension ms-python.python -EOT -``` - -然後重新上傳 template: - -```bash -coder templates create \ - -d c:\Users\ckliu\Documents\docker_stack\vs-code-server\template \ - --name vscode -``` - -### 傳入 GitHub Token(可選) - -如果要顯式指定 GitHub token,建立 Workspace 時傳入: - -```bash -coder create my-workspace \ - --parameter github_token="ghp_xxxxxxxxxxxxxxxxxxxx" -``` - ---- - -## 🐛 常見問題 - -### Q1:Copilot 無法工作 - -**症狀:** 沒有自動完成建議,或顯示"Not Authorized" - -**解決步驟:** -1. 檢查是否已安裝 GitHub Copilot extension -2. 在 VSCode 中按 `Ctrl+Shift+P` → 搜尋 "Copilot" -3. 選擇 "GitHub Copilot: Sign In" -4. 如果彈出授權窗口,點擊授權 -5. 重新開啟代碼文件 - -### Q2:Workspace 啟動失敗 - -**症狀:** 狀態停留在 "Provisioning" 或顯示紅色錯誤 - -**診斷步驟:** -``` -Dashboard → 選擇 Workspace -→ 點擊 "Logs" 分頁 -→ 查看錯誤信息 -``` - -常見原因: -- Docker 資源不足 -- Coder server 無法連接到 provisioner -- startup_script 有語法錯誤 - -**解決方案:** -- 檢查 Docker 磁碟空間 -- 重啟 Coder server:`docker-compose restart` -- 檢查 `main.tf` 語法 - -### Q3:無法保存檔案 - -**症狀:** 編輯後 Ctrl+S 無反應,或重啟後檔案遺失 - -**檢查步驟:** -1. VSCode 左下角應有自動存檔指示 -2. Settings → 搜尋 "Auto Save" → 確認已啟用 -3. 檢查磁碟空間是否充足 -4. 查看 code-server 是否正常運行 - -### Q4:如何備份 Workspace 的檔案? - -因為使用 Docker volume,備份方式: - -```bash -# 1. 進入 Docker 容器 -docker exec -it coder /bin/sh - -# 2. 備份 volume(替換 ) -docker run --rm -v :/data \ - -v /backup:/backup \ - alpine tar czf /backup/workspace-backup.tar.gz -C /data . - -# 3. 檔案會存在 /backup 目錄 -``` - ---- - -## 📊 資源監控 - -在 VSCode 右側 "Workspace" 菜單中,可看到: -- **CPU Usage** - 目前 CPU 使用率 -- **RAM Usage** - 目前 RAM 使用量 -- **Home Disk** - home 目錄磁碟使用量 -- **CPU Usage (Host)** - 宿主機 CPU -- **Memory Usage (Host)** - 宿主機 RAM - -如果 RAM 接近上限,可以: -- 關閉不必要的 extensions -- 重啟 Workspace -- 聯繫管理員增加資源 - ---- - -## 🔐 安全性 - -- ✅ 所有通訊都通過 HTTPS(由 Nginx 處理) -- ✅ GitHub OIDC 認證保護 -- ✅ 每個使用者的 workspace 完全隔離 -- ✅ 敏感信息(GitHub token)以環境變數形式傳遞,不儲存 - ---- - -## 📞 需要幫助? - -1. **查看 Logs** → Dashboard → Workspace → Logs -2. **Coder 官方文檔** → https://coder.com/docs -3. **code-server 文檔** → https://github.com/coder/code-server -4. **聯繫管理員** → 提供 Workspace 名稱和錯誤信息 - ---- - -## 📝 版本資訊 - -- **Coder** v2.0+ -- **code-server** module ~> 1.0 -- **jetbrains** module ~> 1.1 -- **Terraform** 0.13+ - -上次更新:2025-11-17 diff --git a/vs-code-server/vs-code-server.yml b/vs-code-server/vs-code-server.yml index c40fb43..0c8cbde 100644 --- a/vs-code-server/vs-code-server.yml +++ b/vs-code-server/vs-code-server.yml @@ -1,65 +1,43 @@ version: '3.8' services: - coder: - image: ghcr.io/coder/coder:latest - container_name: coder + code-server: + image: codercom/code-server:latest + container_name: code-server restart: unless-stopped - environment: - # === 資料庫 === - CODER_PG_CONNECTION_URL: postgresql://coder:${POSTGRES_PASSWORD}@postgres:5432/coder?sslmode=disable - - # === 外部 URL === - CODER_ACCESS_URL: https://code.karylab.com - CODER_WILDCARD_ACCESS_URL: "*.code.karylab.com" - - # === TLS 由 Nginx 處理 === - CODER_TLS_ENABLE: "false" - - # === GitHub OIDC === - CODER_OIDC_ISSUER_URL: https://token.actions.githubusercontent.com - CODER_OIDC_CLIENT_ID: ${CODER_OIDC_CLIENT_ID} - CODER_OIDC_CLIENT_SECRET: ${CODER_OIDC_CLIENT_SECRET} - CODER_OIDC_ALLOW_SIGNUPS: "true" - - CODER_ADDRESS: 0.0.0.0:3000 - CODER_HOME: /config/coder - + # GitHub OAuth 認證 + OAUTH_CLIENT_ID: ${OAUTH_CLIENT_ID} + OAUTH_CLIENT_SECRET: ${OAUTH_CLIENT_SECRET} + OAUTH_AUTHORIZE_URL: https://github.com/login/oauth/authorize + OAUTH_TOKEN_URL: https://github.com/login/oauth/access_token + OAUTH_USER_ID_TOKEN_CLAIM: login + volumes: - # 使用者 config(.config, .cache, extensions)→ volume - - user_config:/config/users - # 使用者程式碼 → 宿主實體目錄(bind mount) - - /mnt/data/External/code:/projects - # Coder 系統設定 → volume - - coder_system:/config/coder + # 程式碼目錄 + - /mnt/data/External/code:/home/coder/project + # VSCode 設定 + - code-server-config:/home/coder/.config + # 快取 + - code-server-cache:/home/coder/.cache + + ports: + - "6800:8443" + networks: - - coder-net - - webproxy # webproxy 網橋 - depends_on: - - postgres - - postgres: - image: postgres:15-alpine - container_name: coder-postgres - restart: unless-stopped - environment: - POSTGRES_DB: coder - POSTGRES_USER: coder - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - volumes: - - postgres_data:/var/lib/postgresql/data - networks: - - coder-net + - webproxy + + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8443"] + interval: 30s + timeout: 10s + retries: 3 volumes: - user_config: # 所有使用者 .config, .cache - coder_system: # Coder 系統設定 - postgres_data: # 資料庫 + code-server-config: + code-server-cache: networks: - coder-net: - driver: bridge webproxy: - external: true #外部網橋 + external: true \ No newline at end of file