| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- #!/bin/bash
- # =============================================================================
- # Sub2API Docker Deployment Preparation Script
- # =============================================================================
- # This script prepares deployment files for Sub2API:
- # - Downloads docker-compose.local.yml and .env.example
- # - Generates secure secrets (JWT_SECRET, TOTP_ENCRYPTION_KEY, POSTGRES_PASSWORD)
- # - Creates necessary data directories
- #
- # After running this script, you can start services with:
- # docker-compose up -d
- # =============================================================================
- set -e
- # Colors for output
- RED='\033[0;31m'
- GREEN='\033[0;32m'
- YELLOW='\033[1;33m'
- BLUE='\033[0;34m'
- NC='\033[0m' # No Color
- # GitHub raw content base URL
- GITHUB_RAW_URL="https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy"
- # Print colored message
- print_info() {
- echo -e "${BLUE}[INFO]${NC} $1"
- }
- print_success() {
- echo -e "${GREEN}[SUCCESS]${NC} $1"
- }
- print_warning() {
- echo -e "${YELLOW}[WARNING]${NC} $1"
- }
- print_error() {
- echo -e "${RED}[ERROR]${NC} $1"
- }
- # Generate random secret
- generate_secret() {
- openssl rand -hex 32
- }
- # Check if command exists
- command_exists() {
- command -v "$1" >/dev/null 2>&1
- }
- # Main installation function
- main() {
- echo ""
- echo "=========================================="
- echo " Sub2API Deployment Preparation"
- echo "=========================================="
- echo ""
- # Check if openssl is available
- if ! command_exists openssl; then
- print_error "openssl is not installed. Please install openssl first."
- exit 1
- fi
- # Check if deployment already exists
- if [ -f "docker-compose.yml" ] && [ -f ".env" ]; then
- print_warning "Deployment files already exist in current directory."
- read -p "Overwrite existing files? (y/N): " -r
- echo
- if [[ ! $REPLY =~ ^[Yy]$ ]]; then
- print_info "Cancelled."
- exit 0
- fi
- fi
- # Download docker-compose.local.yml and save as docker-compose.yml
- print_info "Downloading docker-compose.yml..."
- if command_exists curl; then
- curl -sSL "${GITHUB_RAW_URL}/docker-compose.local.yml" -o docker-compose.yml
- elif command_exists wget; then
- wget -q "${GITHUB_RAW_URL}/docker-compose.local.yml" -O docker-compose.yml
- else
- print_error "Neither curl nor wget is installed. Please install one of them."
- exit 1
- fi
- print_success "Downloaded docker-compose.yml"
- # Download .env.example
- print_info "Downloading .env.example..."
- if command_exists curl; then
- curl -sSL "${GITHUB_RAW_URL}/.env.example" -o .env.example
- else
- wget -q "${GITHUB_RAW_URL}/.env.example" -O .env.example
- fi
- print_success "Downloaded .env.example"
- # Generate .env file with auto-generated secrets
- print_info "Generating secure secrets..."
- echo ""
- # Generate secrets
- JWT_SECRET=$(generate_secret)
- TOTP_ENCRYPTION_KEY=$(generate_secret)
- POSTGRES_PASSWORD=$(generate_secret)
- # Create .env from .env.example
- cp .env.example .env
- # Update .env with generated secrets (cross-platform compatible)
- if sed --version >/dev/null 2>&1; then
- # GNU sed (Linux)
- sed -i "s/^JWT_SECRET=.*/JWT_SECRET=${JWT_SECRET}/" .env
- sed -i "s/^TOTP_ENCRYPTION_KEY=.*/TOTP_ENCRYPTION_KEY=${TOTP_ENCRYPTION_KEY}/" .env
- sed -i "s/^POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=${POSTGRES_PASSWORD}/" .env
- else
- # BSD sed (macOS)
- sed -i '' "s/^JWT_SECRET=.*/JWT_SECRET=${JWT_SECRET}/" .env
- sed -i '' "s/^TOTP_ENCRYPTION_KEY=.*/TOTP_ENCRYPTION_KEY=${TOTP_ENCRYPTION_KEY}/" .env
- sed -i '' "s/^POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=${POSTGRES_PASSWORD}/" .env
- fi
- # Create data directories
- print_info "Creating data directories..."
- mkdir -p data postgres_data redis_data
- print_success "Created data directories"
- # Set secure permissions for .env file (readable/writable only by owner)
- chmod 600 .env
- echo ""
- # Display completion message
- echo "=========================================="
- echo " Preparation Complete!"
- echo "=========================================="
- echo ""
- echo "Generated secure credentials:"
- echo " POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}"
- echo " JWT_SECRET: ${JWT_SECRET}"
- echo " TOTP_ENCRYPTION_KEY: ${TOTP_ENCRYPTION_KEY}"
- echo ""
- print_warning "These credentials have been saved to .env file."
- print_warning "Please keep them secure and do not share publicly!"
- echo ""
- echo "Directory structure:"
- echo " docker-compose.yml - Docker Compose configuration"
- echo " .env - Environment variables (generated secrets)"
- echo " .env.example - Example template (for reference)"
- echo " data/ - Application data (will be created on first run)"
- echo " postgres_data/ - PostgreSQL data"
- echo " redis_data/ - Redis data"
- echo ""
- echo "Next steps:"
- echo " 1. (Optional) Edit .env to customize configuration"
- echo " 2. Start services:"
- echo " docker-compose up -d"
- echo ""
- echo " 3. View logs:"
- echo " docker-compose logs -f sub2api"
- echo ""
- echo " 4. Access Web UI:"
- echo " http://localhost:8080"
- echo ""
- print_info "If admin password is not set in .env, it will be auto-generated."
- print_info "Check logs for the generated admin password on first startup."
- echo ""
- }
- # Run main function
- main "$@"
|