383 lines
9.5 KiB
Plaintext
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
|
|
}
|
|
}
|