Enhance Docker setup and scripts by adding default environment variables for BGP configuration, improving the update process with safe and quick update options, and implementing testing capabilities in the prefix loader script. Update start.sh to include permission checks and network connectivity validation during ExaBGP startup.
Build and Push Docker Image / build (push) Successful in 3m18s
Build and Push Docker Image / build (push) Successful in 3m18s
This commit is contained in:
@@ -45,6 +45,15 @@ docker run -d `
|
||||
-e BGP_KEEPALIVE=30 `
|
||||
git.shts.su/infra/bgp-server:latest
|
||||
|
||||
# Простой запуск с настройками по умолчанию
|
||||
docker run -d `
|
||||
--name bgp-server `
|
||||
--restart unless-stopped `
|
||||
-p 179:179 `
|
||||
-v ${PWD}/data:/app/data:ro `
|
||||
-v ${PWD}/logs:/app/logs `
|
||||
git.shts.su/infra/bgp-server:latest
|
||||
|
||||
# Пример с кастомными настройками
|
||||
docker run -d `
|
||||
--name bgp-server-custom `
|
||||
@@ -178,6 +187,32 @@ docker logs bgp-server
|
||||
docker logs -f bgp-server
|
||||
```
|
||||
|
||||
### Обновление контейнера
|
||||
|
||||
```powershell
|
||||
# Безопасное обновление (рекомендуется)
|
||||
docker stop bgp-server
|
||||
docker rm bgp-server
|
||||
docker pull git.shts.su/infra/bgp-server:latest
|
||||
docker run -d `
|
||||
--name bgp-server `
|
||||
--restart unless-stopped `
|
||||
-p 179:179 `
|
||||
-v ${PWD}/data:/app/data:ro `
|
||||
-v ${PWD}/logs:/app/logs `
|
||||
git.shts.su/infra/bgp-server:latest
|
||||
|
||||
# Быстрое обновление (если настройки не изменились)
|
||||
docker pull git.shts.su/infra/bgp-server:latest
|
||||
docker restart bgp-server
|
||||
|
||||
# Использование скрипта обновления
|
||||
.\scripts\update-container.ps1
|
||||
|
||||
# Принудительное обновление без подтверждения
|
||||
.\scripts\update-container.ps1 -Force
|
||||
```
|
||||
|
||||
### Обновление префиксов
|
||||
|
||||
```powershell
|
||||
|
||||
+10
-1
@@ -29,5 +29,14 @@ WORKDIR /app
|
||||
# Открытие BGP порта
|
||||
EXPOSE 179
|
||||
|
||||
# Установка переменных окружения по умолчанию
|
||||
ENV BGP_LOCAL_AS=65000
|
||||
ENV BGP_ROUTER_ID=192.168.1.100
|
||||
ENV BGP_NEIGHBOR_IP=192.168.1.1
|
||||
ENV BGP_NEIGHBOR_AS=65001
|
||||
ENV BGP_HOLD_TIME=90
|
||||
ENV BGP_KEEPALIVE=30
|
||||
ENV BGP_LOG_LEVEL=INFO
|
||||
|
||||
# Команда запуска
|
||||
CMD ["/app/scripts/start.sh"]
|
||||
ENTRYPOINT ["/app/scripts/start.sh"]
|
||||
@@ -123,6 +123,13 @@ def withdraw_prefixes(prefixes: Set[str]):
|
||||
|
||||
def main():
|
||||
"""Основная функция"""
|
||||
# Проверка тестового режима
|
||||
if len(sys.argv) > 1 and sys.argv[1] == '--test':
|
||||
print("Testing prefix loader...")
|
||||
prefixes = load_all_prefixes()
|
||||
print(f"Found {len(prefixes)} prefixes: {list(prefixes)}")
|
||||
return
|
||||
|
||||
log_message("Starting prefix loader...")
|
||||
|
||||
# Создание директории для логов
|
||||
|
||||
+40
-2
@@ -40,8 +40,18 @@ echo "Prefixes file content:"
|
||||
cat /app/data/prefixes.txt
|
||||
echo "---"
|
||||
|
||||
# Проверка прав доступа к файлам
|
||||
echo "Checking file permissions:"
|
||||
ls -la /app/data/
|
||||
ls -la /app/scripts/
|
||||
echo "---"
|
||||
|
||||
# Генерация конфигурации из переменных окружения
|
||||
echo "Generating ExaBGP configuration from environment variables..."
|
||||
echo "Environment variables:"
|
||||
env | grep BGP_ || echo "No BGP_ variables found"
|
||||
echo "---"
|
||||
|
||||
python3 /app/scripts/generate_config.py
|
||||
|
||||
# Проверка конфигурации
|
||||
@@ -51,13 +61,29 @@ cat /app/exabgp.conf
|
||||
echo "---"
|
||||
exabgp --validate /app/exabgp.conf
|
||||
|
||||
# Тестовый запуск скрипта загрузки префиксов
|
||||
echo "Testing prefix loader script..."
|
||||
python3 /app/scripts/load_prefixes.py --test 2>&1 || echo "Prefix loader test failed (this is normal)"
|
||||
echo "---"
|
||||
|
||||
# Проверка сетевого подключения
|
||||
echo "Checking network connectivity..."
|
||||
NEIGHBOR_IP=${BGP_NEIGHBOR_IP:-192.168.1.1}
|
||||
if ping -c 1 $NEIGHBOR_IP > /dev/null 2>&1; then
|
||||
echo "Network connectivity to $NEIGHBOR_IP: OK"
|
||||
else
|
||||
echo "Warning: Cannot reach $NEIGHBOR_IP. BGP session may not establish."
|
||||
fi
|
||||
|
||||
# Запуск ExaBGP в фоновом режиме с логированием
|
||||
echo "Starting ExaBGP..."
|
||||
LOG_LEVEL=${BGP_LOG_LEVEL:-INFO}
|
||||
exabgp --log.level $LOG_LEVEL /app/exabgp.conf > /app/logs/exabgp.log 2>&1 &
|
||||
|
||||
# Запуск с подробным логированием в режиме демона
|
||||
exabgp --log.level $LOG_LEVEL --daemon /app/exabgp.conf > /app/logs/exabgp.log 2>&1 &
|
||||
EXABGP_PID=$!
|
||||
|
||||
# Сохранение PID
|
||||
EXABGP_PID=$!
|
||||
echo $EXABGP_PID > /app/logs/exabgp.pid
|
||||
|
||||
# Ожидание запуска
|
||||
@@ -66,8 +92,15 @@ sleep 5
|
||||
# Проверка статуса
|
||||
if kill -0 $EXABGP_PID 2>/dev/null; then
|
||||
echo "ExaBGP started successfully with PID: $EXABGP_PID"
|
||||
echo "Recent logs:"
|
||||
tail -10 /app/logs/exabgp.log
|
||||
else
|
||||
echo "Failed to start ExaBGP"
|
||||
echo "Full logs:"
|
||||
cat /app/logs/exabgp.log
|
||||
echo "---"
|
||||
echo "Process status:"
|
||||
ps aux | grep exabgp || echo "No exabgp process found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -84,4 +117,9 @@ cleanup() {
|
||||
trap cleanup SIGTERM SIGINT
|
||||
|
||||
# Ожидание завершения
|
||||
echo "Waiting for ExaBGP to run..."
|
||||
echo "Process status:"
|
||||
ps aux | grep exabgp || echo "No exabgp process found"
|
||||
echo "---"
|
||||
|
||||
wait $EXABGP_PID
|
||||
@@ -0,0 +1,92 @@
|
||||
# Скрипт для безопасного обновления BGP Server контейнера
|
||||
|
||||
param(
|
||||
[string]$ContainerName = "bgp-server",
|
||||
[string]$ImageName = "git.shts.su/infra/bgp-server:latest",
|
||||
[string]$DataPath = "./data",
|
||||
[string]$LogsPath = "./logs",
|
||||
[switch]$Force
|
||||
)
|
||||
|
||||
Write-Host "=== BGP Server Container Update Script ===" -ForegroundColor Green
|
||||
|
||||
# Проверка существования контейнера
|
||||
$containerExists = docker ps -a --filter "name=$ContainerName" --format "table {{.Names}}" | Select-String $ContainerName
|
||||
|
||||
if ($containerExists) {
|
||||
Write-Host "Found existing container: $ContainerName" -ForegroundColor Yellow
|
||||
|
||||
if (-not $Force) {
|
||||
$response = Read-Host "Do you want to update the container? (y/N)"
|
||||
if ($response -ne "y" -and $response -ne "Y") {
|
||||
Write-Host "Update cancelled." -ForegroundColor Red
|
||||
exit 0
|
||||
}
|
||||
}
|
||||
|
||||
# Остановка и удаление старого контейнера
|
||||
Write-Host "Stopping container..." -ForegroundColor Yellow
|
||||
docker stop $ContainerName
|
||||
|
||||
Write-Host "Removing container..." -ForegroundColor Yellow
|
||||
docker rm $ContainerName
|
||||
} else {
|
||||
Write-Host "No existing container found. Creating new one..." -ForegroundColor Green
|
||||
}
|
||||
|
||||
# Создание директорий если не существуют
|
||||
if (-not (Test-Path $DataPath)) {
|
||||
Write-Host "Creating data directory: $DataPath" -ForegroundColor Yellow
|
||||
New-Item -ItemType Directory -Path $DataPath -Force | Out-Null
|
||||
}
|
||||
|
||||
if (-not (Test-Path $LogsPath)) {
|
||||
Write-Host "Creating logs directory: $LogsPath" -ForegroundColor Yellow
|
||||
New-Item -ItemType Directory -Path $LogsPath -Force | Out-Null
|
||||
}
|
||||
|
||||
# Загрузка нового образа
|
||||
Write-Host "Pulling latest image..." -ForegroundColor Yellow
|
||||
docker pull $ImageName
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "Failed to pull image. Exiting." -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Запуск нового контейнера
|
||||
Write-Host "Starting new container..." -ForegroundColor Yellow
|
||||
$currentPath = Get-Location
|
||||
$dataVolume = "${currentPath}\${DataPath}:/app/data:ro"
|
||||
$logsVolume = "${currentPath}\${LogsPath}:/app/logs"
|
||||
|
||||
docker run -d `
|
||||
--name $ContainerName `
|
||||
--restart unless-stopped `
|
||||
-p 179:179 `
|
||||
-v $dataVolume `
|
||||
-v $logsVolume `
|
||||
$ImageName
|
||||
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
Write-Host "Container started successfully!" -ForegroundColor Green
|
||||
|
||||
# Ожидание запуска
|
||||
Write-Host "Waiting for container to start..." -ForegroundColor Yellow
|
||||
Start-Sleep -Seconds 5
|
||||
|
||||
# Проверка статуса
|
||||
$status = docker ps --filter "name=$ContainerName" --format "table {{.Status}}"
|
||||
Write-Host "Container status: $status" -ForegroundColor Cyan
|
||||
|
||||
# Показ логов
|
||||
Write-Host "Recent logs:" -ForegroundColor Cyan
|
||||
docker logs --tail=10 $ContainerName
|
||||
|
||||
Write-Host "`nContainer update completed successfully!" -ForegroundColor Green
|
||||
Write-Host "To view logs: docker logs -f $ContainerName" -ForegroundColor Cyan
|
||||
Write-Host "To check status: docker ps" -ForegroundColor Cyan
|
||||
} else {
|
||||
Write-Host "Failed to start container. Check the error above." -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
Reference in New Issue
Block a user