LXDコンテナ内にCode-Server、TailscaleでHTTPS化

Code-ServerもLXDコンテナ内にセットアップして、Tailscale Serve機能でHTTPS化しておくと便利に使えそうです。/optあたりをマウントすれば、ホスト環境を汚さずかつスクリプト編集もしやすそうです。LXD内でLXDを運用する場合にも有効そう。
今回はTailscale内からのアクセスのみ受け付ける設定にしているので、パスワードはひとまず「9999」に設定しています。ご自身の環境に応じて変更してください。

LXDコンテナ内にインストール

LXDコンテナ内で以下を貼り付けるだけ。

#!/bin/bash
# ============================================================
#  Code-Server インストール(LXDコンテナ / Tailscale HTTPS版)
#  前提:
#    - Ubuntu 24.04 LXDコンテナ内で実行
#    - tailscale up 済み(tailscale serve でHTTPS化)
#    - 実行: sudo bash install-codeserver.sh
# ============================================================

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}   $*"; }
error()   { echo -e "${RED}[ERR]${NC}  $*"; exit 1; }

[[ $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)"

PASSWORD="9999"

# --- 依存パッケージ ---
info "依存パッケージをインストール中..."
apt-get update -qq
apt-get install -y -qq curl wget
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 "ダウンロード中..."
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 生成 ---
# Tailscale serveがlocalhostにプロキシするため bind-addr は 127.0.0.1 に限定
CONFIG_DIR="$REAL_HOME/.config/code-server"
mkdir -p "$CONFIG_DIR"
cat > "$CONFIG_DIR/config.yaml" <<EOF
bind-addr: 127.0.0.1:8089
auth: password
password: ${PASSWORD}
cert: false
EOF
chown -R "$REAL_USER:$REAL_USER" "$CONFIG_DIR"
chmod 600 "$CONFIG_DIR/config.yaml"
success "config.yaml 生成完了(127.0.0.1:8089 でローカルのみ待受)"

# --- argv.json: 日本語化 ---
info "argv.json を配置中..."
VSCODE_DIR="$REAL_HOME/.local/share/code-server/User"
mkdir -p "$VSCODE_DIR"
cat > "$VSCODE_DIR/argv.json" <<'EOF'
{
  "locale": "ja"
}
EOF
chown -R "$REAL_USER:$REAL_USER" "$REAL_HOME/.local/share/code-server"
success "argv.json 配置完了"

# --- 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=HOME=${REAL_HOME}

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable code-server
systemctl restart code-server
success "systemd サービス登録・起動完了"

# --- Tailscale serve 設定(HTTPS → localhost:8089)---
info "Tailscale serve を設定中..."
tailscale serve --bg http://127.0.0.1:8089
success "Tailscale serve 設定完了"

# --- 起動確認 ---
info "起動確認中..."
sleep 4
systemctl is-active --quiet code-server && success "code-server 正常起動" \
  || { echo ""; journalctl -u code-server -n 20 --no-pager; error "code-server の起動に失敗しました"; }

# --- 完了メッセージ ---
TS_HOSTNAME=$(tailscale serve status 2>/dev/null | grep -o 'https://[^/]*' | head -1 | sed 's|https://||' || true)
echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}  Code-Server インストール完了!${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
if [[ -n "$TS_HOSTNAME" ]]; then
  echo -e "  🌐 アクセスURL : ${CYAN}https://${TS_HOSTNAME}${NC}"
else
  echo -e "  🌐 アクセスURL : ${CYAN}https://<tailscaleホスト名>${NC}"
  echo -e "     ※ tailscale status で確認してください"
fi
echo -e "  🔑 パスワード  : ${YELLOW}${PASSWORD}${NC}"
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 -e "  serve確認: ${CYAN}tailscale serve status${NC}"
echo ""

日本語化する

拡張機能で以下を検索してインストールします。

Japanese Language Pack

インストール後にブラウザをリロードすれば日本語化されます。

パスワードを変更する


パスワードを変更したい場合は下記ファイルを編集してリスタート。

nano /root/.config/code-server/config.yaml
systemctl restart code-server

ホストの/optをマウントして利用

/optをマウントする場合はホスト側で下記を実行します。

lxc config device add <コンテナ名> opt disk source=/opt path=/opt
lxc config set <コンテナ名> raw.idmap "both 1000 1000"

LXDコンテナ内でLXDコンテナ操作を行う

#!/bin/bash
set -e
# LXD インストール
sudo snap install lxd --channel=latest/stable
# 初期化
sudo lxd init --minimal
# HTTPS API を有効化
sudo lxc config set core.https_address :8443
# UI 有効化
sudo snap set lxd ui.enable=true
sudo systemctl reload snap.lxd.daemon
# ユーザーを lxd グループに追加
sudo usermod -aG lxd $USER
echo ""
echo "=========================================="
echo " LXD-UI セットアップ完了"
echo "=========================================="
echo " アクセス先:"
echo "   https://$(hostname):8443"
echo "=========================================="
echo ""
echo "※ グループ変更を反映するため、一度ログアウト&再ログインしてください"
タイトルとURLをコピーしました