Files
debian-first-boot-setup/costumize.sh

256 lines
7.5 KiB
Bash
Executable File

#!/bin/bash
# Server Customization Script
# Run this script to set hostname and create Git deploy keys
set -euo pipefail
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Logging functions
log() {
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}"
}
warn() {
echo -e "${YELLOW}[WARNING] $1${NC}"
}
error() {
echo -e "${RED}[ERROR] $1${NC}"
exit 1
}
# Check if running as non-root user
check_user() {
if [[ $EUID -eq 0 ]]; then
error "This script should be run as a regular user (not root)"
fi
}
# Set server hostname
set_hostname() {
echo ""
echo -e "${BLUE}=== Server Hostname Configuration ===${NC}"
local current_hostname=$(hostname)
echo "Current hostname: $current_hostname"
echo ""
read -p "Enter hostname for this server (press Enter to keep '$current_hostname'): " new_hostname
# If empty, keep current hostname
if [[ -z "$new_hostname" ]]; then
log "Keeping current hostname: $current_hostname"
return 0
fi
# Validate hostname format
if [[ ! "$new_hostname" =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$ ]]; then
error "Invalid hostname format. Use only letters, numbers, and hyphens."
fi
log "Setting hostname to: $new_hostname"
# Update /etc/hosts first to avoid hostname resolution issues
sudo sed -i "s/127.0.1.1.*/127.0.1.1\t$new_hostname/" /etc/hosts
# Add entry if it doesn't exist
if ! grep -q "127.0.1.1" /etc/hosts; then
echo -e "127.0.1.1\t$new_hostname" | sudo tee -a /etc/hosts
fi
# Update hostname after /etc/hosts is configured
sudo hostnamectl set-hostname "$new_hostname"
log "Hostname updated successfully"
echo "New hostname: $(hostname)"
return 0
}
# Create Git deploy keys
create_deploy_keys() {
echo ""
echo -e "${BLUE}=== Git Deploy Keys Setup ===${NC}"
echo "Deploy keys allow secure Git access for deployments and automation."
echo ""
read -p "How many Git deploy keys would you like to create? (0-10): " num_keys
# Validate number
if ! [[ "$num_keys" =~ ^[0-9]+$ ]] || [ "$num_keys" -lt 0 ] || [ "$num_keys" -gt 10 ]; then
error "Please enter a number between 0 and 10"
fi
if [ "$num_keys" -eq 0 ]; then
log "No deploy keys will be created"
return
fi
local server_name=$(hostname)
local created_keys=()
# Create SSH directory if it doesn't exist
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# Create each deploy key
for ((i=1; i<=num_keys; i++)); do
echo ""
echo -e "${YELLOW}--- Deploy Key $i of $num_keys ---${NC}"
while true; do
read -p "Enter project name for deploy key $i: " project_name
if [[ -z "$project_name" ]]; then
echo -e "${RED}Project name cannot be empty${NC}"
continue
fi
# Sanitize project name (remove spaces, special chars)
project_name=$(echo "$project_name" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9-]//g')
if [[ -z "$project_name" ]]; then
echo -e "${RED}Invalid project name. Use only letters, numbers, and hyphens.${NC}"
continue
fi
# Check if key already exists
if [[ -f ~/.ssh/deploy_key_$project_name ]]; then
echo -e "${RED}Deploy key for project '$project_name' already exists${NC}"
continue
fi
break
done
local key_file="~/.ssh/deploy_key_$project_name"
local comment="deploy-key-$project_name-$server_name"
log "Creating deploy key for project: $project_name"
# Generate SSH key
ssh-keygen -t ed25519 -f ~/.ssh/deploy_key_$project_name -C "$comment" -N ""
# Set proper permissions
chmod 600 ~/.ssh/deploy_key_$project_name
chmod 644 ~/.ssh/deploy_key_$project_name.pub
created_keys+=("$project_name")
log "Deploy key created: ~/.ssh/deploy_key_$project_name"
done
# Configure SSH config
configure_ssh_config "${created_keys[@]}"
# Show public keys and instructions
show_deploy_instructions "${created_keys[@]}"
}
# Configure SSH config file
configure_ssh_config() {
local projects=("$@")
local ssh_config="$HOME/.ssh/config"
log "Configuring SSH config..."
# Backup existing config
if [[ -f "$ssh_config" ]]; then
cp "$ssh_config" "$ssh_config.backup.$(date +%Y%m%d_%H%M%S)"
fi
echo ""
read -p "Enter your Git server domain (e.g., git.example.com): " git_domain
if [[ -z "$git_domain" ]]; then
error "Git server domain cannot be empty"
fi
# Add SSH config entries
for project in "${projects[@]}"; do
echo "" >> "$ssh_config"
echo "Host gitea-$project" >> "$ssh_config"
echo " HostName $git_domain" >> "$ssh_config"
echo " User git" >> "$ssh_config"
echo " Port 22" >> "$ssh_config"
echo " IdentityFile ~/.ssh/deploy_key_$project" >> "$ssh_config"
echo " IdentitiesOnly yes" >> "$ssh_config"
done
chmod 600 "$ssh_config"
log "SSH config updated with ${#projects[@]} deploy key entries"
}
# Show deploy key public keys and usage instructions
show_deploy_instructions() {
local projects=("$@")
echo ""
echo -e "${BLUE}=== Deploy Keys Created ===${NC}"
echo ""
for project in "${projects[@]}"; do
echo -e "${YELLOW}--- Project: $project ---${NC}"
echo "Public key (copy this to your Git server):"
echo ""
cat ~/.ssh/deploy_key_$project.pub
echo ""
echo -e "${GREEN}Add this key to your Git repository's deploy keys section${NC}"
echo ""
echo "Clone/configure repository:"
echo -e "${YELLOW}# For new clones:${NC}"
echo "git clone git@gitea-$project:username/repository.git"
echo ""
echo -e "${YELLOW}# For existing repos, update the remote:${NC}"
echo "git remote set-url origin git@gitea-$project:username/repository.git"
echo ""
echo "================================"
echo ""
done
echo -e "${BLUE}=== Important Notes ===${NC}"
echo "• Deploy keys are stored in ~/.ssh/deploy_key_<project>"
echo "• SSH config entries created as 'gitea-<project>'"
echo "• Replace 'username/repository.git' with your actual repository path"
echo "• Keys are ready for use after adding public keys to your Git server"
echo ""
echo -e "${GREEN}Setup completed successfully!${NC}"
}
# Main function
main() {
echo -e "${BLUE}=== Server Customization Script ===${NC}"
echo "This script will:"
echo "1. Optionally set server hostname"
echo "2. Create Git deploy keys"
echo "3. Configure SSH for Git repositories"
echo ""
read -p "Continue with server customization? (y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "Customization cancelled."
exit 0
fi
# Check prerequisites
check_user
# Set hostname
set_hostname
# Create deploy keys
create_deploy_keys
echo ""
echo -e "${GREEN}Server customization completed!${NC}"
echo -e "${YELLOW}You may need to log out and back in to see the hostname change.${NC}"
}
main "$@"