|
#!/usr/bin/env bash |
|
set -euo pipefail |
|
|
|
USERNAME="${USERNAME:-codex}" |
|
USER_HOME="/home/${USERNAME}" |
|
|
|
export HOME="$USER_HOME" |
|
export USER="$USERNAME" |
|
export LOGNAME="$USERNAME" |
|
export XDG_CONFIG_HOME="$USER_HOME/.config" |
|
export SHELL="${SHELL:-/bin/bash}" |
|
export PATH="$USER_HOME/.local/bin:$USER_HOME/.local/share/mise/shims:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" |
|
|
|
mkdir -p \ |
|
"$USER_HOME/.codex" \ |
|
"$USER_HOME/.local/bin" \ |
|
"$USER_HOME/.local/share" \ |
|
"$USER_HOME/.cache" \ |
|
"$USER_HOME/.config" \ |
|
"$USER_HOME/.config/git" \ |
|
"$USER_HOME/.config/gh" \ |
|
"$USER_HOME/.vscode-server" \ |
|
"$USER_HOME/repos" |
|
|
|
# /home/codex は永続volumeとして扱う。 |
|
# dot dirs は権限ズレが起きやすいので補正する。 |
|
chown -R "$USERNAME:$USERNAME" \ |
|
"$USER_HOME/.codex" \ |
|
"$USER_HOME/.local" \ |
|
"$USER_HOME/.cache" \ |
|
"$USER_HOME/.config" \ |
|
"$USER_HOME/.vscode-server" || true |
|
|
|
chown "$USERNAME:$USERNAME" "$USER_HOME" "$USER_HOME/repos" || true |
|
|
|
if [ "$(id -un)" != "$USERNAME" ]; then |
|
exec gosu "$USERNAME" "$0" "$@" |
|
fi |
|
|
|
export HOME="$USER_HOME" |
|
export USER="$USERNAME" |
|
export LOGNAME="$USERNAME" |
|
export XDG_CONFIG_HOME="$USER_HOME/.config" |
|
export SHELL="${SHELL:-/bin/bash}" |
|
export PATH="$USER_HOME/.local/bin:$USER_HOME/.local/share/mise/shims:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" |
|
|
|
ensure_bashrc() { |
|
touch "$HOME/.bashrc" |
|
|
|
if ! grep -q 'mise activate bash' "$HOME/.bashrc"; then |
|
{ |
|
echo '' |
|
echo '# mise' |
|
echo 'if [ -x "$HOME/.local/bin/mise" ]; then' |
|
echo ' eval "$("$HOME/.local/bin/mise" activate bash)"' |
|
echo 'fi' |
|
} >> "$HOME/.bashrc" |
|
fi |
|
|
|
if ! grep -q 'XDG_CONFIG_HOME="$HOME/.config"' "$HOME/.bashrc"; then |
|
{ |
|
echo '' |
|
echo '# local environment' |
|
echo 'export USER="${USER:-codex}"' |
|
echo 'export LOGNAME="${LOGNAME:-codex}"' |
|
echo 'export XDG_CONFIG_HOME="$HOME/.config"' |
|
echo 'export PATH="$HOME/.local/bin:$HOME/.local/share/mise/shims:$PATH"' |
|
} >> "$HOME/.bashrc" |
|
fi |
|
} |
|
|
|
ensure_mise_and_node() { |
|
if [ ! -x "$HOME/.local/bin/mise" ]; then |
|
echo "Installing mise..." |
|
curl -fsSL https://mise.run | sh |
|
fi |
|
|
|
ensure_bashrc |
|
|
|
export PATH="$HOME/.local/bin:$HOME/.local/share/mise/shims:$PATH" |
|
|
|
if ! command -v node >/dev/null 2>&1; then |
|
echo "Installing Node.js via mise..." |
|
"$HOME/.local/bin/mise" use -g node@lts |
|
fi |
|
|
|
if command -v corepack >/dev/null 2>&1; then |
|
corepack enable || true |
|
fi |
|
} |
|
|
|
install_codex_if_needed() { |
|
if command -v codex >/dev/null 2>&1 && codex --version >/dev/null 2>&1; then |
|
return 0 |
|
fi |
|
|
|
echo "Installing Codex standalone..." |
|
|
|
curl -fsSL https://chatgpt.com/codex/install.sh -o /tmp/codex-install.sh |
|
sh /tmp/codex-install.sh < /dev/null |
|
rm -f /tmp/codex-install.sh |
|
} |
|
|
|
ensure_git_config_is_safe() { |
|
# ホスト由来の絶対パス include があると、git/gh が Permission denied で落ちることがある。 |
|
# 既知の Netlify helper include だけ削る。 |
|
if [ -f "$HOME/.gitconfig" ] && grep -q '/home/ubuntu/.config/netlify/helper/git-config' "$HOME/.gitconfig"; then |
|
echo "Removing stale Netlify Git config include from ~/.gitconfig..." |
|
cp "$HOME/.gitconfig" "$HOME/.gitconfig.bak.$(date +%Y%m%d-%H%M%S)" |
|
|
|
python3 - <<'PY' |
|
from pathlib import Path |
|
|
|
path = Path.home() / ".gitconfig" |
|
lines = path.read_text().splitlines() |
|
out = [] |
|
i = 0 |
|
|
|
while i < len(lines): |
|
stripped = lines[i].strip() |
|
|
|
if stripped.startswith("# This next lines include Netlify"): |
|
i += 1 |
|
continue |
|
|
|
if stripped == "[include]" and i + 1 < len(lines): |
|
next_stripped = lines[i + 1].strip() |
|
if next_stripped == "path = /home/ubuntu/.config/netlify/helper/git-config": |
|
i += 2 |
|
continue |
|
|
|
out.append(lines[i]) |
|
i += 1 |
|
|
|
path.write_text("\n".join(out).rstrip() + "\n") |
|
PY |
|
fi |
|
} |
|
|
|
ensure_mise_and_node |
|
install_codex_if_needed |
|
ensure_git_config_is_safe |
|
|
|
exec "$@" |