2025-10-07 10:32:04 +01:00

383 lines
9.5 KiB
Plaintext

# Gitea Service Management
#
# Start, stop, and manage Gitea service (local mode)
#
# Version: 1.0.0
use api_client.nu get-gitea-config
# Check if Docker is available
def has-docker [] -> bool {
(^docker --version | complete).exit_code == 0
}
# Check if Gitea Docker container is running
def is-gitea-docker-running [] -> bool {
let config = get-gitea-config
if $config.mode != "local" or $config.local.deployment != "docker" {
return false
}
let container_name = $config.local.docker.container_name
let result = ^docker ps --filter $"name=($container_name)" --format "{{.Names}}" | complete
($result.stdout | str trim) == $container_name
}
# Start Gitea via Docker
export def start-gitea-docker [
--detach: bool = true
] -> bool {
let config = get-gitea-config
if $config.mode != "local" {
error make {
msg: "Gitea is configured in remote mode"
help: "Cannot start remote Gitea instance"
}
}
if $config.local.deployment != "docker" {
error make {
msg: "Gitea is configured for binary deployment"
help: "Use start-gitea-binary instead"
}
}
if not (has-docker) {
error make {
msg: "Docker is not available"
help: "Install Docker to use Docker deployment mode"
}
}
# Check if already running
if (is-gitea-docker-running) {
print "Gitea is already running"
return true
}
let docker_config = $config.local.docker
let port = $config.local.port
let ssh_port = $docker_config.ssh_port
let data_dir = $config.local.data_dir | path expand
# Create data directory
mkdir $data_dir
# Build environment variables
let env_vars = $docker_config.environment
| items {|k, v| ["-e" $"($k)=($v)"]}
| flatten
# Build volume mounts
let volumes = $docker_config.volumes
| each {|v|
if ($v | str starts-with "gitea-data:") {
# Replace named volume with local path
let vol_path = $v | str replace "gitea-data:" $"($data_dir):"
["-v" $vol_path]
} else {
["-v" $v]
}
}
| flatten
# Start container
let cmd_parts = [
"docker" "run"
"--name" $docker_config.container_name
"-p" $"($port):3000"
"-p" $"($ssh_port):22"
]
| append $env_vars
| append $volumes
| append ["--restart" $docker_config.restart_policy]
let cmd_parts_final = if $detach {
$cmd_parts | append ["-d" $docker_config.image]
} else {
$cmd_parts | append $docker_config.image
}
print $"Starting Gitea Docker container..."
^docker ...$cmd_parts_final
# Wait for Gitea to be ready
if $detach {
print "Waiting for Gitea to start..."
sleep 5sec
# Check if running
if (is-gitea-docker-running) {
print $"✓ Gitea started successfully"
print $" URL: http://localhost:($port)"
print $" SSH port: ($ssh_port)"
true
} else {
error make {
msg: "Gitea failed to start"
help: "Check Docker logs: docker logs ($docker_config.container_name)"
}
}
} else {
true
}
}
# Stop Gitea Docker container
export def stop-gitea-docker [
--remove: bool = false
] -> bool {
let config = get-gitea-config
if not (is-gitea-docker-running) {
print "Gitea is not running"
return true
}
let container_name = $config.local.docker.container_name
print $"Stopping Gitea Docker container..."
^docker stop $container_name
if $remove {
^docker rm $container_name
print $"✓ Gitea container stopped and removed"
} else {
print $"✓ Gitea container stopped"
}
true
}
# Start Gitea binary
export def start-gitea-binary [] -> bool {
let config = get-gitea-config
if $config.mode != "local" {
error make {
msg: "Gitea is configured in remote mode"
}
}
if $config.local.deployment != "binary" {
error make {
msg: "Gitea is configured for Docker deployment"
help: "Use start-gitea-docker instead"
}
}
let binary_path = $config.local.binary.binary_path | path expand
let config_path = $config.local.binary.config_path | path expand
if not ($binary_path | path exists) {
error make {
msg: $"Gitea binary not found: ($binary_path)"
help: "Install Gitea binary or use Docker deployment"
}
}
# Start Gitea
print $"Starting Gitea from binary: ($binary_path)"
^$binary_path --config $config_path web
true
}
# Start Gitea (auto-detect mode)
export def start-gitea [] -> bool {
let config = get-gitea-config
if $config.mode == "remote" {
error make {
msg: "Gitea is configured in remote mode"
help: "Cannot start remote Gitea instance"
}
}
if $config.local.deployment == "docker" {
start-gitea-docker
} else {
start-gitea-binary
}
}
# Stop Gitea
export def stop-gitea [] -> bool {
let config = get-gitea-config
if $config.mode == "remote" {
error make {
msg: "Gitea is configured in remote mode"
}
}
if $config.local.deployment == "docker" {
stop-gitea-docker
} else {
# For binary, need to find and kill process
# This is platform-specific
print "Stopping Gitea binary..."
try {
^pkill -f "gitea.*web"
print "✓ Gitea stopped"
true
} catch {
print "⚠️ Could not stop Gitea (may not be running)"
false
}
}
}
# Get Gitea status
export def get-gitea-status [] -> record {
let config = get-gitea-config
if $config.mode == "remote" {
# For remote, check if accessible
let health = check-gitea-health $config
{
mode: "remote"
url: $config.remote.url
accessible: $health
running: $health
}
} else {
# For local, check if running
if $config.local.deployment == "docker" {
let running = is-gitea-docker-running
{
mode: "local"
deployment: "docker"
container_name: $config.local.docker.container_name
running: $running
port: $config.local.port
url: $"http://localhost:($config.local.port)"
}
} else {
# For binary, check if process is running
let running = try {
^pgrep -f "gitea.*web" | complete | get exit_code
} catch {
1
} == 0
{
mode: "local"
deployment: "binary"
binary_path: $config.local.binary.binary_path
running: $running
port: $config.local.port
url: $"http://localhost:($config.local.port)"
}
}
}
}
# Check Gitea health
export def check-gitea-health [
gitea_config?: record
] -> bool {
let config = if ($gitea_config | is-empty) {
get-gitea-config
} else {
$gitea_config
}
let url = if $config.mode == "local" {
$"http://localhost:($config.local.port)"
} else {
$config.remote.url
}
# Check if Gitea is accessible
try {
let response = http get $"($url)/api/healthz"
true
} catch {
false
}
}
# Install Gitea binary
export def install-gitea [
version?: string = "latest"
--install-dir: string = "/usr/local/bin"
] -> bool {
let os = ^uname -s | str downcase
let arch = ^uname -m
# Map architecture
let gitea_arch = if $arch == "x86_64" {
"amd64"
} else if $arch == "aarch64" or $arch == "arm64" {
"arm64"
} else {
$arch
}
# Get latest version if not specified
let gitea_version = if $version == "latest" {
# Fetch latest from GitHub API
let releases = http get "https://api.github.com/repos/go-gitea/gitea/releases/latest"
$releases.tag_name | str replace "v" ""
} else {
$version
}
let download_url = $"https://dl.gitea.com/gitea/($gitea_version)/gitea-($gitea_version)-($os)-($gitea_arch)"
print $"Downloading Gitea ($gitea_version)..."
let temp_file = $"/tmp/gitea-($gitea_version)"
^curl -L -o $temp_file $download_url
# Make executable
^chmod +x $temp_file
# Move to install directory
let install_path = $"($install_dir)/gitea"
print $"Installing to ($install_path)..."
^sudo mv $temp_file $install_path
print $"✓ Gitea ($gitea_version) installed successfully"
print $" Path: ($install_path)"
true
}
# Restart Gitea
export def restart-gitea [] -> bool {
stop-gitea
sleep 2sec
start-gitea
}
# Get Gitea logs (Docker only)
export def get-gitea-logs [
--lines: int = 100
--follow: bool = false
] -> nothing {
let config = get-gitea-config
if $config.mode != "local" or $config.local.deployment != "docker" {
error make {
msg: "Logs only available for Docker deployment"
}
}
let container_name = $config.local.docker.container_name
if $follow {
^docker logs -f --tail $lines $container_name
} else {
^docker logs --tail $lines $container_name
}
}