171 lines
5.3 KiB
Bash
Executable File
171 lines
5.3 KiB
Bash
Executable File
#!/bin/bash
|
|
# LXC Deployment Script for ChainID 138 Explorer Platform
|
|
# This script automates the deployment process
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
PROJECT_ROOT="$( cd "$SCRIPT_DIR/../.." && pwd )"
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Configuration
|
|
CONTAINER_ID="${CONTAINER_ID:-100}"
|
|
CONTAINER_HOSTNAME="${CONTAINER_HOSTNAME:-explorer-prod}"
|
|
DOMAIN="${DOMAIN:-explorer.d-bis.org}"
|
|
SKIP_CONTAINER_CREATION="${SKIP_CONTAINER_CREATION:-false}"
|
|
|
|
echo -e "${GREEN}=== ChainID 138 Explorer Platform - LXC Deployment ===${NC}"
|
|
echo ""
|
|
|
|
# Check if running on Proxmox host
|
|
if ! command -v pct &> /dev/null; then
|
|
echo -e "${RED}Error: This script must be run on a Proxmox host${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# Phase 1: Create LXC Container
|
|
if [ "$SKIP_CONTAINER_CREATION" != "true" ]; then
|
|
echo -e "${YELLOW}Phase 1: Creating LXC Container...${NC}"
|
|
|
|
# Check if container already exists
|
|
if pct list | grep -q "^$CONTAINER_ID "; then
|
|
echo -e "${YELLOW}Container $CONTAINER_ID already exists. Skipping creation.${NC}"
|
|
echo "Set SKIP_CONTAINER_CREATION=true to skip this check."
|
|
read -p "Do you want to continue with existing container? (y/N): " -n 1 -r
|
|
echo
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
exit 1
|
|
fi
|
|
else
|
|
echo "Creating container $CONTAINER_ID..."
|
|
pct create $CONTAINER_ID \
|
|
local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \
|
|
--hostname $CONTAINER_HOSTNAME \
|
|
--memory 16384 \
|
|
--cores 4 \
|
|
--swap 4096 \
|
|
--storage local-lvm \
|
|
--rootfs local-lvm:100 \
|
|
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
|
|
--unprivileged 0 \
|
|
--features nesting=1 \
|
|
--start 1
|
|
|
|
echo "Waiting for container to start..."
|
|
sleep 5
|
|
fi
|
|
fi
|
|
|
|
# Phase 2: Initial Container Setup
|
|
echo -e "${YELLOW}Phase 2: Initial Container Setup...${NC}"
|
|
|
|
cat << 'INITSCRIPT' | pct exec $CONTAINER_ID bash
|
|
set -e
|
|
|
|
# Update system
|
|
apt update && apt upgrade -y
|
|
|
|
# Install essential packages
|
|
apt install -y curl wget git vim net-tools ufw fail2ban \
|
|
unattended-upgrades apt-transport-https ca-certificates \
|
|
gnupg lsb-release software-properties-common
|
|
|
|
# Set timezone
|
|
timedatectl set-timezone UTC
|
|
|
|
# Create deployment user
|
|
if ! id "explorer" &>/dev/null; then
|
|
adduser --disabled-password --gecos "" explorer
|
|
usermod -aG sudo explorer
|
|
echo "explorer ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
|
|
fi
|
|
INITSCRIPT
|
|
|
|
echo -e "${GREEN}✓ Container setup complete${NC}"
|
|
|
|
# Phase 3: Install Dependencies
|
|
echo -e "${YELLOW}Phase 3: Installing Dependencies...${NC}"
|
|
|
|
cat << 'DEPSCRIPT' | pct exec $CONTAINER_ID bash
|
|
set -e
|
|
|
|
# Install Go
|
|
if ! command -v go &> /dev/null; then
|
|
cd /tmp
|
|
wget -q https://go.dev/dl/go1.21.6.linux-amd64.tar.gz
|
|
rm -rf /usr/local/go
|
|
tar -C /usr/local -xzf go1.21.6.linux-amd64.tar.gz
|
|
echo 'export PATH=$PATH:/usr/local/go/bin' >> /etc/profile
|
|
export PATH=$PATH:/usr/local/go/bin
|
|
fi
|
|
|
|
# Install Node.js
|
|
if ! command -v node &> /dev/null; then
|
|
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
|
|
apt install -y nodejs
|
|
fi
|
|
|
|
# Install Docker
|
|
if ! command -v docker &> /dev/null; then
|
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
|
|
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
|
|
apt update
|
|
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
|
|
systemctl enable docker
|
|
systemctl start docker
|
|
usermod -aG docker explorer
|
|
fi
|
|
|
|
# Install PostgreSQL
|
|
if ! command -v psql &> /dev/null; then
|
|
sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
|
|
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
|
|
apt update
|
|
apt install -y postgresql-16 postgresql-contrib-16
|
|
fi
|
|
|
|
# Install Nginx
|
|
if ! command -v nginx &> /dev/null; then
|
|
apt install -y nginx
|
|
fi
|
|
|
|
# Install cloudflared
|
|
if ! command -v cloudflared &> /dev/null; then
|
|
cd /tmp
|
|
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
|
|
dpkg -i cloudflared-linux-amd64.deb || apt install -f -y
|
|
fi
|
|
DEPSCRIPT
|
|
|
|
echo -e "${GREEN}✓ Dependencies installed${NC}"
|
|
|
|
# Phase 4: Deploy Application
|
|
echo -e "${YELLOW}Phase 4: Deploying Application...${NC}"
|
|
|
|
# Copy project files to container (assuming git clone on host)
|
|
echo "Note: You'll need to clone the repository inside the container or copy files"
|
|
echo "For now, the script will prepare the structure"
|
|
|
|
cat << 'APPSCRIPT' | pct exec $CONTAINER_ID bash -s
|
|
set -e
|
|
mkdir -p /home/explorer/explorer-monorepo
|
|
chown explorer:explorer /home/explorer/explorer-monorepo
|
|
APPSCRIPT
|
|
|
|
echo -e "${YELLOW}Please complete the deployment manually:${NC}"
|
|
echo "1. Clone repository inside container: pct exec $CONTAINER_ID"
|
|
echo "2. Copy .env file and configure"
|
|
echo "3. Run migrations"
|
|
echo "4. Build applications"
|
|
echo "5. Configure services"
|
|
echo ""
|
|
echo "See DEPLOYMENT_GUIDE.md for complete instructions"
|
|
|
|
echo -e "${GREEN}=== Deployment Script Complete ===${NC}"
|
|
|