テキストエディタcode-server(VS Code)を導入

開発環境としてテキストエディタもWebブラウザから使えると便利です。
これにはVS Code(Visual Studio Code)をWebブラウザ上で動作させるオープンソースのツール「code-server」がベストでしょう。

Dockerでインストールする

以下をコピペすればインストールされます。

#!/bin/bash
# ============================================================
#  Code-Server Docker版 セットアップ + 日本語化
#  対象OS: Ubuntu 25.10
# ============================================================

set -euo pipefail

INSTALL_DIR="/opt/docker/codeserver"

GREEN='\033[0;32m'; CYAN='\033[0;36m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; NC='\033[0m'
info()    { echo -e "${CYAN}[INFO]${NC} $*"; }
success() { echo -e "${GREEN}[OK]${NC}   $*"; }
warn()    { echo -e "${YELLOW}[WARN]${NC} $*"; }
error()   { echo -e "${RED}[ERR]${NC}  $*"; exit 1; }

[[ $EUID -ne 0 ]] && error "root権限で実行してください: sudo bash $0"

if ! docker compose version &>/dev/null; then
  error "docker compose が見つかりません。先にインストールしてください。"
fi
success "docker compose 確認済み"

REAL_USER="${SUDO_USER:-$(logname 2>/dev/null || echo $USER)}"
PUID=$(id -u "$REAL_USER" 2>/dev/null || echo 1000)
PGID=$(id -g "$REAL_USER" 2>/dev/null || echo 1000)

# --- パスワード自動生成 ---
info "パスワードを自動生成中..."
PASSWORD=$(openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 32)
HASHED_PASSWORD=$(echo -n "$PASSWORD" | sha256sum | cut -d' ' -f1)

# --- ディレクトリ作成 ---
info "ディレクトリを作成中: $INSTALL_DIR"
mkdir -p "$INSTALL_DIR"/{config,workspace}

# --- ★ 日本語化のキモ: argv.json を事前に配置 ---
info "argv.json (日本語化設定) を配置中..."
ARGV_DIR="$INSTALL_DIR/config/data/User"
mkdir -p "$ARGV_DIR"
cat > "$ARGV_DIR/argv.json" <<'EOF'
{
  "locale": "ja"
}
EOF
success "argv.json 配置完了"

# --- .env 生成 ---
info ".env を生成中..."
cat > "$INSTALL_DIR/.env" <<EOF
# 自動生成: $(date '+%Y-%m-%d %H:%M:%S')
PASSWORD=${PASSWORD}
HASHED_PASSWORD=${HASHED_PASSWORD}
HOST_PORT=8080
TZ=Asia/Tokyo
PUID=${PUID}
PGID=${PGID}
EOF
chmod 600 "$INSTALL_DIR/.env"
success ".env 生成完了"

# --- docker-compose.yml 生成 ---
info "docker-compose.yml を生成中..."
cat > "$INSTALL_DIR/docker-compose.yml" <<'COMPOSE'
services:
  code-server:
    image: lscr.io/linuxserver/code-server:latest
    container_name: code-server
    restart: unless-stopped
    environment:
      - PUID=${PUID}
      - PGID=${PGID}
      - TZ=${TZ}
      - HASHED_PASSWORD=${HASHED_PASSWORD}
      - DEFAULT_WORKSPACE=/workspace
      # ★ コンテナ内ロケールも日本語に
      - LANG=ja_JP.UTF-8
      - LC_ALL=ja_JP.UTF-8
    ports:
      - "${HOST_PORT}:8443"
    volumes:
      - ./config:/config
      - ./workspace:/workspace
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8443"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 20s
COMPOSE
success "docker-compose.yml 生成完了"

# --- Japanese Language Pack をコンテナ起動前に拡張機能フォルダへ配置 ---
# (起動後に code-server --install-extension を実行する方式)
info "起動後に Language Pack を自動インストールする設定を追加中..."
cat > "$INSTALL_DIR/install-ja-pack.sh" <<'SH'
#!/bin/bash
# コンテナ内で Language Pack をインストールするスクリプト
code-server --install-extension MS-CEINTL.vscode-language-pack-ja --force
echo "Japanese Language Pack のインストール完了"
SH
chmod +x "$INSTALL_DIR/install-ja-pack.sh"

# --- ファイアウォール ---
if ufw status 2>/dev/null | grep -q "Status: active"; then
  info "ufw でポート 8080 を開放中..."
  ufw allow 8080/tcp
  success "ポート開放済み"
fi

# --- コンテナ起動 ---
info "コンテナを起動中..."
cd "$INSTALL_DIR"
docker compose pull
docker compose up -d

# --- 起動待ち ---
info "起動確認中 (最大40秒)..."
for i in $(seq 1 13); do
  if curl -sf http://localhost:8080 &>/dev/null; then
    break
  fi
  echo -n "."
  sleep 3
done
echo ""

# --- Language Pack をコンテナ内でインストール ---
info "コンテナ内で Japanese Language Pack をインストール中..."
docker exec code-server \
  code-server --install-extension MS-CEINTL.vscode-language-pack-ja --force \
  2>/dev/null && success "Language Pack インストール完了" \
  || warn "Language Pack のインストールに失敗しました(ブラウザから手動でインストールしてください)"

# --- コンテナ再起動(Language Pack を反映) ---
info "設定を反映するためコンテナを再起動中..."
docker compose restart
sleep 5

# --- 完了メッセージ ---
HOST_IP=$(hostname -I | awk '{print $1}')
echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}  Code-Server (Docker版) セットアップ完了!${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
echo -e "  🌐 アクセスURL  : ${CYAN}http://${HOST_IP}:8080${NC}"
echo -e "  🔑 パスワード   : ${YELLOW}${PASSWORD}${NC}"
echo ""
echo -e "  📁 インストール先: ${INSTALL_DIR}"
echo -e "  📄 設定ファイル  : ${INSTALL_DIR}/.env"
echo ""
echo -e "  ⚠  ブラウザのキャッシュをクリアしてアクセスしてください"
echo -e "     (Ctrl+Shift+R または Cmd+Shift+R)"
echo ""
echo -e "  停止    : ${CYAN}cd $INSTALL_DIR && docker compose down${NC}"
echo -e "  再起動  : ${CYAN}cd $INSTALL_DIR && docker compose restart${NC}"
echo -e "  ログ確認: ${CYAN}cd $INSTALL_DIR && docker compose logs -f${NC}"
echo ""
echo -e "${YELLOW}  ⚠ 本番公開時はリバースプロキシ + HTTPS を推奨します${NC}"
echo ""

http://ホスト名:8080にアクセスしてパスワードを入力したら使えます。

テーマの変更は、左上のメニューから「ファイル」-「ユーザー設定」-「テーマ」-「配色テーマ」から行えます。もしくは左下の「設定」-「テーマ」-「配色テーマ」から。

Dockerを使わず直接インストールする

ローカルファイルを扱ったりするなら、直接インストールしておいたほうが良いですね。

#!/bin/bash
# ============================================================
#  Code-Server ネイティブインストール + 日本語化
#  対象OS: Ubuntu 25.10 (Docker不使用)
# ============================================================

set -euo pipefail

GREEN='\033[0;32m'; CYAN='\033[0;36m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; NC='\033[0m'
info()    { echo -e "${CYAN}[INFO]${NC} $*"; }
success() { echo -e "${GREEN}[OK]${NC}   $*"; }
warn()    { echo -e "${YELLOW}[WARN]${NC} $*"; }
error()   { echo -e "${RED}[ERR]${NC}  $*"; exit 1; }

# --- root チェック ---
[[ $EUID -ne 0 ]] && error "root権限で実行してください: sudo bash $0"

# 実行ユーザーを特定
REAL_USER="${SUDO_USER:-$(logname 2>/dev/null || echo $USER)}"
REAL_HOME=$(getent passwd "$REAL_USER" | cut -d: -f6)
info "インストール対象ユーザー: $REAL_USER ($REAL_HOME)"

# --- パスワード自動生成 ---
info "パスワードを自動生成中..."
PASSWORD=$(openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 32)

# --- 依存パッケージ ---
info "依存パッケージをインストール中..."
apt-get update -qq
apt-get install -y -qq curl wget git build-essential locales

# --- 日本語ロケール ---
info "日本語ロケールを設定中..."
locale-gen ja_JP.UTF-8
update-locale LANG=ja_JP.UTF-8 LC_ALL=ja_JP.UTF-8
success "日本語ロケール設定完了"

# --- 最新バージョン取得 ---
info "最新バージョンを確認中..."
LATEST=$(curl -fsSL https://api.github.com/repos/coder/code-server/releases/latest \
  | grep '"tag_name"' | sed 's/.*"v\([^"]*\)".*/\1/')
info "最新バージョン: v${LATEST}"

# --- ダウンロード & インストール ---
DEB_URL="https://github.com/coder/code-server/releases/download/v${LATEST}/code-server_${LATEST}_amd64.deb"
info "ダウンロード中: $DEB_URL"
wget -q --show-progress -O /tmp/code-server.deb "$DEB_URL"
dpkg -i /tmp/code-server.deb
rm /tmp/code-server.deb
success "code-server v${LATEST} インストール完了"

# --- config.yaml 生成 ---
CONFIG_DIR="$REAL_HOME/.config/code-server"
mkdir -p "$CONFIG_DIR"
cat > "$CONFIG_DIR/config.yaml" <<EOF
bind-addr: 0.0.0.0:8080
auth: password
password: ${PASSWORD}
cert: false
EOF
chown -R "$REAL_USER:$REAL_USER" "$CONFIG_DIR"
chmod 600 "$CONFIG_DIR/config.yaml"
success "config.yaml 生成完了"

# --- 日本語化設定 ---
info "日本語化設定を適用中..."
VSCODE_DIR="$REAL_HOME/.local/share/code-server/User"
mkdir -p "$VSCODE_DIR"

# ★ ポイント: argv.json で locale を指定(settings.json では効かない)
cat > "$VSCODE_DIR/argv.json" <<'EOF'
{
  "locale": "ja"
}
EOF

# settings.json(エディタの基本設定)
cat > "$VSCODE_DIR/settings.json" <<'EOF'
{
  "editor.fontSize": 14,
  "editor.tabSize": 2,
  "editor.wordWrap": "on",
  "terminal.integrated.fontSize": 13
}
EOF

chown -R "$REAL_USER:$REAL_USER" "$REAL_HOME/.local/share/code-server" 2>/dev/null || true
success "日本語化設定完了 (argv.json)"

# --- Japanese Language Pack を事前インストール ---
info "Japanese Language Pack をインストール中..."
sudo -u "$REAL_USER" \
  VSCODE_APPDATA="$REAL_HOME/.local/share/code-server" \
  code-server --install-extension MS-CEINTL.vscode-language-pack-ja --force \
  2>/dev/null && success "Language Pack インストール完了" \
  || warn "Language Pack のインストールに失敗しました(起動後に手動で入れてください)"

# --- systemd サービス登録 ---
info "systemd サービスを登録中..."
cat > /etc/systemd/system/code-server.service <<EOF
[Unit]
Description=code-server (VS Code in Browser)
After=network.target

[Service]
Type=exec
User=${REAL_USER}
WorkingDirectory=${REAL_HOME}
ExecStart=/usr/bin/code-server
Restart=always
RestartSec=5
Environment=LANG=ja_JP.UTF-8
Environment=LC_ALL=ja_JP.UTF-8
Environment=HOME=${REAL_HOME}

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable code-server
systemctl restart code-server
success "systemd サービス登録・起動完了"

# --- ファイアウォール ---
if ufw status 2>/dev/null | grep -q "Status: active"; then
  info "ufw でポート 8080 を開放中..."
  ufw allow 8080/tcp
  success "ポート開放済み"
fi

# --- 起動確認 ---
info "起動確認中..."
sleep 4
if systemctl is-active --quiet code-server; then
  success "code-server 正常起動"
else
  warn "起動に問題がある可能性があります"
  journalctl -u code-server -n 20 --no-pager
fi

# --- 完了メッセージ ---
HOST_IP=$(hostname -I | awk '{print $1}')
echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}  Code-Server セットアップ完了!${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
echo -e "  🌐 アクセスURL  : ${CYAN}http://${HOST_IP}:8080${NC}"
echo -e "  🔑 パスワード   : ${YELLOW}${PASSWORD}${NC}"
echo ""
echo -e "  📄 設定ファイル : ${CONFIG_DIR}/config.yaml"
echo ""
echo -e "  ⚠  ブラウザのキャッシュをクリアしてアクセスしてください"
echo -e "     (Ctrl+Shift+R または Cmd+Shift+R)"
echo ""
echo -e "  起動    : ${CYAN}sudo systemctl start code-server${NC}"
echo -e "  停止    : ${CYAN}sudo systemctl stop code-server${NC}"
echo -e "  ログ確認: ${CYAN}journalctl -u code-server -f${NC}"
echo ""
echo -e "${YELLOW}  ⚠ 本番公開時はリバースプロキシ + HTTPS を推奨します${NC}"
echo ""
タイトルとURLをコピーしました