2026-05-04 07:28:30 +00:00
|
|
|
#!/bin/bash
|
|
|
|
|
set -e
|
|
|
|
|
|
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
|
cd "$SCRIPT_DIR"
|
|
|
|
|
|
2026-05-04 13:11:46 +00:00
|
|
|
VARS_FILE="server.pkrvars.hcl"
|
|
|
|
|
|
|
|
|
|
collect_values() {
|
|
|
|
|
echo "=== Server Configuration ==="
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
read -p "Base domain: " BASE_DOMAIN
|
|
|
|
|
|
|
|
|
|
read -p "SSH public key path [~/.ssh/id_ed25519.pub]: " PUBKEY_PATH
|
|
|
|
|
PUBKEY_PATH="${PUBKEY_PATH:-$HOME/.ssh/id_ed25519.pub}"
|
|
|
|
|
if [ ! -f "$PUBKEY_PATH" ]; then
|
|
|
|
|
echo "Warning: $PUBKEY_PATH not found, leaving SSH key empty"
|
|
|
|
|
SSH_PUBKEY=""
|
|
|
|
|
else
|
|
|
|
|
SSH_PUBKEY=$(cat "$PUBKEY_PATH")
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
|
echo "--- JuiceFS / Nextcloud Storage ---"
|
|
|
|
|
read -p "S3 endpoint (e.g. https://s3.amazonaws.com): " JUICEFS_S3_ENDPOINT
|
|
|
|
|
read -p "S3 bucket name: " JUICEFS_S3_BUCKET
|
|
|
|
|
read -p "S3 access key: " JUICEFS_S3_ACCESS_KEY
|
|
|
|
|
read -s -p "S3 secret key: " JUICEFS_S3_SECRET_KEY
|
|
|
|
|
echo
|
|
|
|
|
read -p "JuiceFS local cache size [50G]: " JUICEFS_CACHE_SIZE
|
|
|
|
|
JUICEFS_CACHE_SIZE="${JUICEFS_CACHE_SIZE:-50G}"
|
|
|
|
|
|
|
|
|
|
cat > "$VARS_FILE" <<EOF
|
|
|
|
|
base_domain = "$BASE_DOMAIN"
|
|
|
|
|
ssh_pubkey = "$SSH_PUBKEY"
|
|
|
|
|
juicefs_s3_endpoint = "$JUICEFS_S3_ENDPOINT"
|
|
|
|
|
juicefs_s3_bucket = "$JUICEFS_S3_BUCKET"
|
|
|
|
|
juicefs_s3_access_key = "$JUICEFS_S3_ACCESS_KEY"
|
|
|
|
|
juicefs_s3_secret_key = "$JUICEFS_S3_SECRET_KEY"
|
|
|
|
|
juicefs_cache_size = "$JUICEFS_CACHE_SIZE"
|
|
|
|
|
EOF
|
|
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
|
echo "Configuration saved to $VARS_FILE"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if [ -f "$VARS_FILE" ]; then
|
|
|
|
|
echo "Existing configuration found ($VARS_FILE):"
|
|
|
|
|
echo ""
|
|
|
|
|
grep -v "secret_key" "$VARS_FILE"
|
|
|
|
|
echo " (secret keys hidden)"
|
|
|
|
|
echo ""
|
|
|
|
|
read -p "Use existing config? [Y/n]: " USE_EXISTING
|
|
|
|
|
if [[ "$USE_EXISTING" =~ ^[Nn] ]]; then
|
|
|
|
|
collect_values
|
|
|
|
|
fi
|
|
|
|
|
else
|
|
|
|
|
collect_values
|
2026-05-04 07:28:30 +00:00
|
|
|
fi
|
|
|
|
|
|
2026-05-04 13:11:46 +00:00
|
|
|
echo ""
|
2026-05-04 07:28:30 +00:00
|
|
|
echo "=== Initializing Packer plugins ==="
|
|
|
|
|
packer init ubuntu-server.pkr.hcl
|
|
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
|
echo "=== Building image ==="
|
|
|
|
|
echo "This will take 15-30 minutes depending on your machine."
|
|
|
|
|
echo ""
|
|
|
|
|
|
2026-05-04 13:11:46 +00:00
|
|
|
packer build -var-file="$VARS_FILE" ubuntu-server.pkr.hcl
|
2026-05-04 07:28:30 +00:00
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
|
echo "==========================================="
|
|
|
|
|
echo " Image built successfully!"
|
|
|
|
|
echo "==========================================="
|
|
|
|
|
echo " Output: $SCRIPT_DIR/output/packer-ubuntu-server"
|
|
|
|
|
echo ""
|
|
|
|
|
echo " To test locally:"
|
|
|
|
|
echo " qemu-system-x86_64 -m 4096 -hda output/packer-ubuntu-server -enable-kvm"
|
|
|
|
|
echo ""
|
|
|
|
|
echo " To convert for other formats:"
|
|
|
|
|
echo " qemu-img convert -f qcow2 -O raw output/packer-ubuntu-server output/server.raw"
|
|
|
|
|
echo " qemu-img convert -f qcow2 -O vmdk output/packer-ubuntu-server output/server.vmdk"
|
|
|
|
|
echo "==========================================="
|