Files
aitbc/scripts/deploy/deploy.sh
aitbc e4f1a96172
Some checks failed
Blockchain Synchronization Verification / sync-verification (push) Failing after 8s
CLI Tests / test-cli (push) Successful in 10s
Contract Performance Benchmarks / benchmark-gas-usage (push) Successful in 1m22s
Contract Performance Benchmarks / benchmark-execution-time (push) Successful in 1m11s
Contract Performance Benchmarks / benchmark-throughput (push) Successful in 1m13s
Cross-Chain Functionality Tests / test-cross-chain-sync (push) Failing after 5s
Cross-Chain Functionality Tests / test-cross-chain-transactions (push) Successful in 5s
Cross-Chain Functionality Tests / test-cross-chain-bridge (push) Has been skipped
Cross-Chain Functionality Tests / test-multi-chain-consensus (push) Failing after 3s
Cross-Chain Functionality Tests / aggregate-results (push) Has been skipped
Cross-Node Transaction Testing / transaction-test (push) Successful in 5s
Deploy to Testnet / deploy-testnet (push) Successful in 1m14s
Contract Performance Benchmarks / compare-benchmarks (push) Has been cancelled
Documentation Validation / validate-docs (push) Failing after 10s
Multi-Node Stress Testing / stress-test (push) Has been cancelled
Node Failover Simulation / failover-test (push) Has been cancelled
Security Scanning / security-scan (push) Has been cancelled
Smart Contract Tests / test-solidity (map[name:aitbc-contracts path:contracts]) (push) Has been cancelled
Smart Contract Tests / test-solidity (map[name:aitbc-token path:packages/solidity/aitbc-token]) (push) Has been cancelled
Smart Contract Tests / test-foundry (push) Has been cancelled
Smart Contract Tests / lint-solidity (push) Has been cancelled
Smart Contract Tests / deploy-contracts (push) Has been cancelled
Documentation Validation / validate-policies-strict (push) Successful in 3s
Integration Tests / test-service-integration (push) Failing after 45s
Multi-Chain Island Architecture Tests / test-multi-chain-island (push) Failing after 2s
Multi-Node Blockchain Health Monitoring / health-check (push) Successful in 5s
P2P Network Verification / p2p-verification (push) Successful in 3s
Production Tests / Production Integration Tests (push) Failing after 7s
Python Tests / test-python (push) Failing after 46s
Staking Tests / test-staking-service (push) Failing after 2s
Staking Tests / test-staking-integration (push) Has been skipped
Staking Tests / test-staking-contract (push) Has been skipped
Staking Tests / run-staking-test-runner (push) Has been skipped
Systemd Sync / sync-systemd (push) Successful in 21s
API Endpoint Tests / test-api-endpoints (push) Failing after 12m19s
ci: standardize pytest invocation and add security scanning
- Changed pytest calls to use `venv/bin/python -m pytest` with explicit config
- Added `--rootdir "$PWD"` and `--import-mode=importlib` for consistent imports
- Fixed PYTHONPATH to use absolute paths with $PWD prefix
- Added smart contract security scanning for Solidity files
- Added Circom circuit security checks for ZK proof circuits
- Added ZK proof implementation security validation
- Added contracts/** to security scanning workflow
2026-05-11 13:46:42 +02:00

433 lines
13 KiB
Bash
Executable File

#!/bin/bash
# AITBC Systemd Deployment Script
# One-command setup for AITBC services using systemd
# This script handles automated deployment of AITBC services on Linux servers
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../utils/deploy_common.sh"
# Configuration
REPO_ROOT="${REPO_ROOT:-/opt/aitbc}"
VENV_DIR="$REPO_ROOT/venv"
PYTHON_VERSION="3.13"
BACKUP_DIR="$REPO_ROOT/.backup"
# Check prerequisites
check_prerequisites() {
log "Checking system prerequisites..."
check_root
# Check Linux distribution
if [[ ! -f /etc/os-release ]]; then
error "Cannot detect Linux distribution"
fi
source /etc/os-release
log "Detected OS: $PRETTY_NAME"
# Check Python version
require_command python3
PYTHON_VER=$(python3 --version | awk '{print $2}')
log "Python version: $PYTHON_VER"
require_min_version "$PYTHON_VER" "$PYTHON_VERSION" "Python"
# Check systemd
require_command systemctl
# Check required system tools
require_commands git curl jq
success "Prerequisites check passed"
}
# Install system dependencies
install_dependencies() {
log "Installing system dependencies..."
if [[ "$ID" == "ubuntu" ]] || [[ "$ID" == "debian" ]]; then
apt-get update
apt-get install -y \
python3-venv \
python3-dev \
build-essential \
libssl-dev \
libffi-dev \
postgresql \
postgresql-contrib \
redis-server \
nginx \
jq \
curl \
git
elif [[ "$ID" == "centos" ]] || [[ "$ID" == "rhel" ]] || [[ "$ID" == "fedora" ]]; then
dnf install -y \
python3-venv \
python3-devel \
gcc \
openssl-devel \
libffi-devel \
postgresql-server \
postgresql-contrib \
redis \
nginx \
jq \
curl \
git
else
warning "Unsupported distribution. Please install dependencies manually"
return 0
fi
success "System dependencies installed"
}
# Setup repository
setup_repository() {
log "Setting up repository..."
# Create backup of existing deployment
if [[ -d "$REPO_ROOT" ]]; then
log "Creating backup of existing deployment..."
BACKUP_TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_PATH="$BACKUP_DIR/backup_$BACKUP_TIMESTAMP"
mkdir -p "$BACKUP_DIR"
cp -r "$REPO_ROOT" "$BACKUP_PATH" || warning "Backup failed, continuing anyway"
log "Backup created at: $BACKUP_PATH"
fi
# Clone or update repository
if [[ -d "$REPO_ROOT/.git" ]]; then
log "Updating existing repository..."
cd "$REPO_ROOT"
git pull || warning "Git pull failed, continuing with existing code"
else
log "Cloning repository..."
# REPO_URL should be set as environment variable
REPO_URL="${REPO_URL:-https://github.com/your-org/aitbc.git}"
git clone "$REPO_URL" "$REPO_ROOT"
fi
success "Repository setup completed"
}
# Create virtual environment
create_venv() {
log "Creating Python virtual environment..."
if [[ -d "$VENV_DIR" ]]; then
log "Virtual environment already exists, recreating..."
rm -rf "$VENV_DIR"
fi
python3 -m venv "$VENV_DIR"
success "Virtual environment created"
}
# Install Python dependencies
install_python_dependencies() {
log "Installing Python dependencies..."
# Activate virtual environment
source "$VENV_DIR/bin/activate"
# Upgrade pip
pip install --upgrade pip setuptools wheel
# Install requirements
if [[ -f "$REPO_ROOT/requirements.txt" ]]; then
pip install -r "$REPO_ROOT/requirements.txt"
else
warning "requirements.txt not found, installing basic dependencies"
pip install fastapi uvicorn sqlmodel alembic pydantic httpx requests
fi
success "Python dependencies installed"
}
# Configure environment
configure_environment() {
log "Configuring environment variables..."
# Create /etc/aitbc directory
mkdir -p /etc/aitbc
# Setup node.env if it doesn't exist
if [[ ! -f /etc/aitbc/node.env ]] && [[ -f "$REPO_ROOT/examples/node.env.example" ]]; then
cp "$REPO_ROOT/examples/node.env.example" /etc/aitbc/node.env
warning "Created /etc/aitbc/node.env from template. Please edit with node-specific values"
fi
# Generate unique node IDs if not set
if [[ -f /etc/aitbc/node.env ]]; then
if grep -q "node-<unique-uuid-here>" /etc/aitbc/node.env; then
log "Generating unique node IDs..."
UUID=$(uuidgen | tr -d '-')
sed -i "s/node-<unique-uuid-here>/node-$UUID/g" /etc/aitbc/node.env
sed -i "s/ait1<unique-uuid-here>/ait1$UUID/g" /etc/aitbc/node.env
log "Generated node IDs with UUID: $UUID"
fi
fi
# Setup blockchain.env if it doesn't exist
if [[ ! -f /etc/aitbc/blockchain.env ]]; then
if [[ -f "$REPO_ROOT/examples/env.example" ]]; then
# Extract relevant blockchain configuration from examples/env.example
grep -E "^(chain_id|CHAIN_ID|rpc_bind_host|rpc_bind_port|p2p_bind_host|p2p_bind_port|enable_block_production|block_time_seconds|proposer_id)" "$REPO_ROOT/examples/env.example" > /etc/aitbc/blockchain.env || true
fi
# Add defaults if file is empty
if [[ ! -s /etc/aitbc/blockchain.env ]]; then
cat > /etc/aitbc/blockchain.env << EOF
# Blockchain Configuration
chain_id=ait-testnet
rpc_bind_host=0.0.0.0
rpc_bind_port=8006
p2p_bind_host=0.0.0.0
p2p_bind_port=7070
enable_block_production=true
EOF
fi
fi
# Setup secrets directory
mkdir -p /run/aitbc/secrets
touch /run/aitbc/secrets/.env
success "Environment configuration completed"
}
# Initialize databases
initialize_databases() {
log "Initializing databases..."
# Start PostgreSQL if not running
if systemctl is-active --quiet postgresql || systemctl is-active --quiet postgresql@13-main; then
log "PostgreSQL is already running"
else
log "Starting PostgreSQL..."
systemctl start postgresql || systemctl start postgresql@13-main || warning "Failed to start PostgreSQL"
fi
# Create databases if they don't exist
if command -v psql &> /dev/null; then
for db in aitbc aitbc_coordinator aitbc_marketplace; do
if ! sudo -u postgres psql -lqt | cut -d \| -f 1 | grep -qw $db; then
log "Creating database: $db"
sudo -u postgres createdb $db || warning "Failed to create database $db"
fi
done
fi
# Start Redis if not running
if systemctl is-active --quiet redis-server || systemctl is-active --quiet redis; then
log "Redis is already running"
else
log "Starting Redis..."
systemctl start redis-server || systemctl start redis || warning "Failed to start Redis"
fi
success "Database initialization completed"
}
# Setup systemd services
setup_systemd_services() {
log "Setting up systemd services..."
# Link systemd service files
if [[ -f "$REPO_ROOT/scripts/utils/link-systemd.sh" ]]; then
bash "$REPO_ROOT/scripts/utils/link-systemd.sh"
else
# Manual linking
log "Linking systemd service files..."
mkdir -p /etc/systemd/system
for service in "$REPO_ROOT/systemd"/*.service; do
if [[ -f "$service" ]]; then
ln -sf "$service" "/etc/systemd/system/$(basename $service)"
fi
done
fi
# Reload systemd
systemctl daemon-reload
success "Systemd services setup completed"
}
# Start services in dependency order
start_services() {
log "Starting AITBC services..."
# Define service startup order
SERVICES=(
"postgresql"
"redis-server"
"aitbc-blockchain-p2p"
"aitbc-blockchain-node"
"aitbc-blockchain-rpc"
"aitbc-coordinator-api"
"aitbc-exchange-api"
"aitbc-wallet"
"aitbc-agent-daemon"
"aitbc-agent-coordinator"
"aitbc-marketplace"
)
for service in "${SERVICES[@]}"; do
log "Starting $service..."
if systemctl list-unit-files | grep -q "^$service.service"; then
systemctl enable "$service" 2>/dev/null || true
systemctl start "$service" || warning "Failed to start $service"
sleep 2
else
log "$service not found, skipping"
fi
done
success "Services started"
}
# Run health checks
run_health_checks() {
log "Running health checks..."
# Wait for services to be ready
log "Waiting for services to stabilize..."
sleep 10
# Check service status
FAILED_SERVICES=()
for service in aitbc-blockchain-node aitbc-blockchain-rpc aitbc-coordinator-api; do
if systemctl is-active --quiet "$service"; then
success "$service is running"
else
error "$service is not running"
FAILED_SERVICES+=("$service")
fi
done
# Check API endpoints if available
if command -v curl &> /dev/null; then
log "Checking API endpoints..."
# Check blockchain RPC
if curl -sf http://localhost:8006/health > /dev/null 2>&1; then
success "Blockchain RPC health check passed"
else
warning "Blockchain RPC health check failed"
fi
# Check coordinator API
if curl -sf http://localhost:8011/health > /dev/null 2>&1; then
success "Coordinator API health check passed"
else
warning "Coordinator API health check failed"
fi
fi
if [[ ${#FAILED_SERVICES[@]} -gt 0 ]]; then
error "Some services failed to start: ${FAILED_SERVICES[*]}"
fi
success "Health checks completed"
}
# Rollback deployment
rollback_deployment() {
log "Rolling back deployment..."
# Find latest backup
LATEST_BACKUP=$(ls -t "$BACKUP_DIR"/backup_* 2>/dev/null | head -1)
if [[ -z "$LATEST_BACKUP" ]]; then
error "No backup found for rollback"
fi
log "Restoring from: $LATEST_BACKUP"
# Stop services
log "Stopping services..."
for service in aitbc-*; do
systemctl stop "$service" 2>/dev/null || true
done
# Restore backup
rm -rf "$REPO_ROOT"
cp -r "$LATEST_BACKUP" "$REPO_ROOT"
# Restart services
start_services
success "Rollback completed"
}
# Display deployment status
display_status() {
log "Deployment Status"
echo "=================="
echo "Repository: $REPO_ROOT"
echo "Virtual Environment: $VENV_DIR"
echo "Python: $(python3 --version)"
echo ""
echo "Service Status:"
systemctl list-units --type=service --state=running | grep aitbc || echo "No AITBC services running"
echo ""
echo "Next Steps:"
echo "1. Edit /etc/aitbc/blockchain.env with blockchain configuration"
echo "2. Edit /etc/aitbc/node.env with node-specific values"
echo "3. Restart services: systemctl restart aitbc-*"
echo "4. Check logs: journalctl -u aitbc-blockchain-node -f"
echo "5. Run health checks: $REPO_ROOT/scripts/monitoring/health_check.sh"
}
# Main deployment function
main() {
local COMMAND="${1:-deploy}"
case "$COMMAND" in
"deploy")
log "Starting AITBC deployment..."
check_prerequisites
install_dependencies
setup_repository
create_venv
install_python_dependencies
configure_environment
initialize_databases
setup_systemd_services
start_services
run_health_checks
display_status
success "Deployment completed successfully!"
;;
"rollback")
rollback_deployment
;;
"status")
display_status
;;
"health-check")
run_health_checks
;;
*)
echo "Usage: $0 {deploy|rollback|status|health-check}"
echo ""
echo "Commands:"
echo " deploy - Full deployment of AITBC services"
echo " rollback - Rollback to previous deployment"
echo " status - Display deployment status"
echo " health-check - Run health checks on services"
exit 1
;;
esac
}
# Handle script interruption
trap 'error "Script interrupted"' INT TERM
# Run main function
main "$@"