Files
proxmox-lxc-shell-commands/proxmox-lxc-gitea.sh
DevOps 8c67ae01f3 feat: Immich, Outline, Gitea LXC 설치 스크립트 추가
- proxmox-lxc-immich.sh: 사진/동영상 관리 (Google Photos 대안)
- proxmox-lxc-outline.sh: 팀 위키/문서 관리 (Notion 대안)
- proxmox-lxc-gitea.sh: 경량 Git 서버 (GitHub/GitLab 대안)

모든 스크립트: Docker-in-LXC, PostgreSQL, systemd 서비스 등록

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 23:46:52 +09:00

273 lines
8.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# Gitea LXC Installation Script
# Description: Lightweight self-hosted Git service (GitHub/GitLab alternative)
# OS: Debian 12 (Bookworm) - Auto-detected latest version
# Ports: Web UI: 3000, SSH: 2222
# Repository: https://github.com/go-gitea/gitea
# Last Updated: 2026-01-05
set -euo pipefail
#################################################################
# Configuration Variables
#################################################################
CT_ID=${CT_ID:-25001}
CT_HOSTNAME=${CT_HOSTNAME:-"gitea"}
CT_CORES=${CT_CORES:-2}
CT_MEMORY=${CT_MEMORY:-2048}
CT_SWAP=${CT_SWAP:-1024}
CT_DISK_SIZE=${CT_DISK_SIZE:-20}
CT_IP=${CT_IP:-"dhcp"}
CT_GATEWAY=${CT_GATEWAY:-""}
CT_BRIDGE=${CT_BRIDGE:-"vmbr0"}
CT_NAMESERVER=${CT_NAMESERVER:-"8.8.8.8"}
CT_STORAGE=${CT_STORAGE:-"local-lvm"}
TEMPLATE_STORAGE=${TEMPLATE_STORAGE:-"local"}
DEBIAN_VERSION="12"
TEMPLATE_NAME=""
# Application Configuration
GITEA_PORT=${GITEA_PORT:-3000}
GITEA_SSH_PORT=${GITEA_SSH_PORT:-2222}
GITEA_VERSION=${GITEA_VERSION:-"latest"}
POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-"$(openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 20)"}
CT_ONBOOT=${CT_ONBOOT:-1}
CT_UNPRIVILEGED=${CT_UNPRIVILEGED:-0}
CT_FEATURES=${CT_FEATURES:-"keyctl=1,nesting=1"}
#################################################################
# Color Output Functions
#################################################################
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
info() { echo -e "${BLUE}[INFO]${NC} $1"; }
success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; }
#################################################################
# Functions
#################################################################
check_root() {
[[ $EUID -ne 0 ]] && error "This script must be run as root" && exit 1
}
check_proxmox() {
command -v pct &> /dev/null || { error "Run on Proxmox VE host"; exit 1; }
}
check_container_exists() {
pct status "$CT_ID" &> /dev/null && { error "Container $CT_ID exists"; exit 1; }
}
detect_and_download_template() {
info "Updating template database..."
pveam update 2>&1 || true
local available_template
available_template=$(pveam available --section system 2>/dev/null | grep "debian-${DEBIAN_VERSION}" | grep "standard" | tail -1 | awk '{print $2}')
[[ -z "$available_template" ]] && error "No Debian ${DEBIAN_VERSION} template found" && exit 1
TEMPLATE_NAME="$available_template"
info "Found template: $TEMPLATE_NAME"
pveam list "$TEMPLATE_STORAGE" 2>/dev/null | grep -q "$TEMPLATE_NAME" || pveam download "$TEMPLATE_STORAGE" "$TEMPLATE_NAME" 2>&1
success "Template ready"
}
create_container() {
info "Creating LXC container $CT_ID ($CT_HOSTNAME)..."
local net_config="name=eth0,bridge=${CT_BRIDGE},ip=${CT_IP}"
[[ "$CT_IP" != "dhcp" ]] && [[ -n "$CT_GATEWAY" ]] && net_config="${net_config},gw=${CT_GATEWAY}"
pct create "$CT_ID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE_NAME}" \
--hostname "$CT_HOSTNAME" --cores "$CT_CORES" --memory "$CT_MEMORY" --swap "$CT_SWAP" \
--rootfs "${CT_STORAGE}:${CT_DISK_SIZE}" --net0 "$net_config" --nameserver "$CT_NAMESERVER" \
--onboot "$CT_ONBOOT" --unprivileged "$CT_UNPRIVILEGED" --features "$CT_FEATURES" --ostype debian || exit 1
success "Container created"
}
start_container() {
info "Starting container..."
pct start "$CT_ID" && sleep 5
success "Container started"
}
install_docker() {
info "Installing Docker..."
pct exec "$CT_ID" -- bash -c "apt-get update -qq"
pct exec "$CT_ID" -- bash -c "DEBIAN_FRONTEND=noninteractive apt-get install -y -qq ca-certificates curl gnupg"
pct exec "$CT_ID" -- bash -c "install -m 0755 -d /etc/apt/keyrings"
pct exec "$CT_ID" -- bash -c "curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc"
pct exec "$CT_ID" -- bash -c "chmod a+r /etc/apt/keyrings/docker.asc"
pct exec "$CT_ID" -- bash -c 'echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null'
pct exec "$CT_ID" -- bash -c "apt-get update -qq"
pct exec "$CT_ID" -- bash -c "DEBIAN_FRONTEND=noninteractive apt-get install -y -qq docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin"
pct exec "$CT_ID" -- bash -c "systemctl enable docker && systemctl start docker"
sleep 3
success "Docker installed"
}
install_gitea() {
info "Installing Gitea..."
pct exec "$CT_ID" -- bash -c "mkdir -p /opt/gitea/{data,postgres}"
# Create docker-compose.yml
pct exec "$CT_ID" -- bash -c "cat > /opt/gitea/docker-compose.yml << 'EOF'
services:
gitea:
image: gitea/gitea:latest
container_name: gitea
restart: always
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=postgres
- GITEA__database__HOST=postgres:5432
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=\${POSTGRES_PASSWORD}
- GITEA__server__HTTP_PORT=3000
- GITEA__server__SSH_PORT=2222
- GITEA__server__SSH_LISTEN_PORT=22
- GITEA__service__DISABLE_REGISTRATION=false
ports:
- \"\${GITEA_PORT:-3000}:3000\"
- \"\${GITEA_SSH_PORT:-2222}:22\"
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
depends_on:
postgres:
condition: service_healthy
networks:
- gitea-network
postgres:
image: postgres:15-alpine
container_name: gitea-postgres
restart: always
environment:
POSTGRES_USER: gitea
POSTGRES_PASSWORD: \${POSTGRES_PASSWORD}
POSTGRES_DB: gitea
volumes:
- ./postgres:/var/lib/postgresql/data
healthcheck:
test: [\"CMD-SHELL\", \"pg_isready -U gitea -d gitea\"]
interval: 10s
timeout: 5s
retries: 5
networks:
- gitea-network
networks:
gitea-network:
driver: bridge
EOF"
# Create .env file
pct exec "$CT_ID" -- bash -c "cat > /opt/gitea/.env << 'EOF'
GITEA_PORT=${GITEA_PORT}
GITEA_SSH_PORT=${GITEA_SSH_PORT}
POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
EOF"
info "Starting Gitea containers..."
pct exec "$CT_ID" -- bash -c "cd /opt/gitea && docker compose up -d"
info "Waiting for Gitea to start (1-2 minutes)..."
local max_attempts=30
local attempt=1
while [[ $attempt -le $max_attempts ]]; do
if pct exec "$CT_ID" -- bash -c "curl -s -o /dev/null -w '%{http_code}' http://localhost:${GITEA_PORT}/" | grep -q "200\|302"; then
success "Gitea is running!"
break
fi
echo -n "."
sleep 5
((attempt++))
done
echo ""
success "Gitea installed"
}
create_gitea_service() {
pct exec "$CT_ID" -- bash -c 'cat > /etc/systemd/system/gitea.service << EOF
[Unit]
Description=Gitea Git Service
Requires=docker.service
After=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/gitea
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
TimeoutStartSec=180
[Install]
WantedBy=multi-user.target
EOF'
pct exec "$CT_ID" -- bash -c "systemctl daemon-reload && systemctl enable gitea"
success "Gitea service created"
}
verify_installation() {
local container_ip
container_ip=$(pct exec "$CT_ID" -- bash -c "hostname -I | awk '{print \$1}'" 2>/dev/null || echo "unknown")
echo ""
echo "================================================================"
echo -e "${GREEN}Gitea Installation Complete!${NC}"
echo "================================================================"
echo "Container ID: $CT_ID | Hostname: $CT_HOSTNAME | IP: $container_ip"
echo ""
echo "Web UI: http://${container_ip}:${GITEA_PORT}"
echo "SSH Clone: ssh://git@${container_ip}:${GITEA_SSH_PORT}/<user>/<repo>.git"
echo ""
echo "First time setup:"
echo " 1. Open the web UI to complete installation wizard"
echo " 2. Create admin account"
echo " 3. Configure SSH keys for Git operations"
echo ""
echo "Commands:"
echo " pct exec $CT_ID -- docker compose -f /opt/gitea/docker-compose.yml logs -f"
echo " pct exec $CT_ID -- docker compose -f /opt/gitea/docker-compose.yml ps"
echo ""
echo "Data location: /opt/gitea/data"
echo "================================================================"
}
main() {
echo "================================================================"
echo "Gitea LXC Installation Script"
echo "================================================================"
check_root
check_proxmox
check_container_exists
detect_and_download_template
create_container
start_container
install_docker
install_gitea
create_gitea_service
verify_installation
}
main "$@"