Compare commits
25 Commits
448726a9aa
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| e38eed4906 | |||
| 84a33e4779 | |||
| f20d46a132 | |||
| 7648dea72b | |||
| 1b11f0eab4 | |||
| 5840e5509a | |||
| a165b304ed | |||
| 3a1a1de536 | |||
| b2cb15b431 | |||
| 0afd8b4f47 | |||
| 47764ac1e7 | |||
| 55fdf6aee6 | |||
| 4493d7e6db | |||
| 822b03cc7a | |||
| 6d054806a3 | |||
| 60f982121b | |||
| c84be7b02a | |||
| 7e53420e96 | |||
| 9dcfe05342 | |||
| f0e7f10dfb | |||
| d6447493d5 | |||
| 0c19daf0d6 | |||
| ea6b35c0df | |||
| f9f3997f7e | |||
| 07471259b8 |
9
README.md
Normal file
9
README.md
Normal file
@@ -0,0 +1,9 @@
|
||||
|
||||
```bash
|
||||
bash <(curl -sL https://ryans.tools/createuser)
|
||||
```
|
||||
|
||||
|
||||
```bash
|
||||
bash <(curl -sL https://ryans.tools/dockernet)
|
||||
```
|
||||
38
backup_named_volumes.sh
Normal file
38
backup_named_volumes.sh
Normal file
@@ -0,0 +1,38 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
PROJECT_NAME=$(basename "$(pwd)")
|
||||
echo "📦 Docker Compose project: $PROJECT_NAME"
|
||||
|
||||
# Get all named volumes for this project
|
||||
VOLUMES=$(docker volume ls --format '{{.Name}}' | grep "^${PROJECT_NAME}_")
|
||||
|
||||
if [[ -z "$VOLUMES" ]]; then
|
||||
echo "❌ No volumes found for project '$PROJECT_NAME'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for FULL_VOL in $VOLUMES; do
|
||||
SHORT_VOL="${FULL_VOL#${PROJECT_NAME}_}"
|
||||
|
||||
VOLUME_PATH="/var/lib/docker/volumes/${FULL_VOL}/_data"
|
||||
OUTPUT_FILE="${SHORT_VOL}.tar.gz"
|
||||
|
||||
echo "📁 Found volume: $SHORT_VOL"
|
||||
read -rp "→ Backup this volume to ${OUTPUT_FILE}? (Y/n) " REPLY
|
||||
REPLY=${REPLY:-Y}
|
||||
|
||||
if [[ "$REPLY" =~ ^[Yy]$ ]]; then
|
||||
if [[ ! -d "$VOLUME_PATH" ]]; then
|
||||
echo "⚠️ Volume path not found: $VOLUME_PATH"
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "📦 Backing up $VOLUME_PATH → $OUTPUT_FILE"
|
||||
sudo tar -czf "$OUTPUT_FILE" -C "$VOLUME_PATH" .
|
||||
echo "✅ Done."
|
||||
else
|
||||
echo "⏭️ Skipped $SHORT_VOL"
|
||||
fi
|
||||
done
|
||||
@@ -1,64 +1,92 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# -------------------------------
|
||||
# Prompt user for subnet base
|
||||
# -------------------------------
|
||||
DOCKER_CONFIG="/etc/docker/daemon.json"
|
||||
JQ=$(command -v jq || true)
|
||||
|
||||
read -rp "Enter the second octet for your Docker network (e.g., 100 for 10.100.0.0/16): " octet
|
||||
|
||||
# Validate that it's a number between 1 and 254
|
||||
if ! [[ "$octet" =~ ^[0-9]{1,3}$ ]] || ((octet < 1 || octet > 254)); then
|
||||
echo "Invalid input. Must be a number between 1 and 254."
|
||||
if [[ -z "$JQ" ]]; then
|
||||
echo "❌ jq is required but not installed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# -------------------------------
|
||||
# Define values
|
||||
# -------------------------------
|
||||
# Step 1: Check if default-address-pools exists and extract current second octet
|
||||
DEFAULT_OCTET=""
|
||||
if [[ -f "$DOCKER_CONFIG" ]] && grep -q '"default-address-pools"' "$DOCKER_CONFIG"; then
|
||||
BASE=$(jq -r '.["default-address-pools"][0].base' "$DOCKER_CONFIG")
|
||||
if [[ "$BASE" =~ ^10\.([0-9]+)\. ]]; then
|
||||
DEFAULT_OCTET="${BASH_REMATCH[1]}"
|
||||
echo "Found existing default-address-pools base: $BASE"
|
||||
fi
|
||||
fi
|
||||
|
||||
DOCKER_CONFIG_FILE="/etc/docker/daemon.json"
|
||||
ADDRESS_POOL_BASE="10.${octet}.0.0/16"
|
||||
ADDRESS_POOL_SIZE=24
|
||||
NETWORK_NAME="bridge_default"
|
||||
NETWORK_SUBNET="10.${octet}.1.0/24"
|
||||
# Step 2: Ask for second octet (suggest default if available)
|
||||
USE_EXISTING_CONFIG=false
|
||||
|
||||
# -------------------------------
|
||||
# Replace daemon.json
|
||||
# -------------------------------
|
||||
if [[ -n "$DEFAULT_OCTET" ]]; then
|
||||
read -rp "Use existing second octet ($DEFAULT_OCTET)? [Y/n]: " confirm
|
||||
confirm=${confirm:-Y}
|
||||
if [[ "$confirm" =~ ^[Nn]$ ]]; then
|
||||
read -rp "Enter new second octet (e.g. 102): " OCTET
|
||||
else
|
||||
OCTET="$DEFAULT_OCTET"
|
||||
USE_EXISTING_CONFIG=true
|
||||
fi
|
||||
else
|
||||
read -rp "Enter second octet for Docker address pool (e.g. 102): " OCTET
|
||||
fi
|
||||
|
||||
echo "Writing Docker daemon.json with base $ADDRESS_POOL_BASE..."
|
||||
# Validate input
|
||||
if ! [[ "$OCTET" =~ ^[0-9]+$ ]] || ((OCTET < 1 || OCTET > 254)); then
|
||||
echo "❌ Invalid octet: $OCTET"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Step 3: Write daemon.json (overwrite or create) only if needed
|
||||
if [[ "$USE_EXISTING_CONFIG" == false ]]; then
|
||||
echo "Writing Docker daemon config with base: 10.${OCTET}.0.0/16"
|
||||
sudo mkdir -p /etc/docker
|
||||
|
||||
cat <<EOF | sudo tee "$DOCKER_CONFIG_FILE" > /dev/null
|
||||
cat <<EOF | sudo tee "$DOCKER_CONFIG" > /dev/null
|
||||
{
|
||||
"default-address-pools": [
|
||||
{
|
||||
"base": "10.${octet}.0.0/16",
|
||||
"base": "10.${OCTET}.0.0/16",
|
||||
"size": 24
|
||||
}
|
||||
]
|
||||
}
|
||||
EOF
|
||||
|
||||
echo "Docker config updated at $DOCKER_CONFIG_FILE"
|
||||
|
||||
# -------------------------------
|
||||
# Delete and recreate network
|
||||
# -------------------------------
|
||||
|
||||
if docker network inspect "$NETWORK_NAME" >/dev/null 2>&1; then
|
||||
echo "Network '$NETWORK_NAME' exists. Deleting it..."
|
||||
docker network rm "$NETWORK_NAME"
|
||||
echo "Restarting Docker..."
|
||||
sudo systemctl restart docker
|
||||
else
|
||||
echo "🟡 Skipping daemon config update and Docker restart (using existing settings)"
|
||||
fi
|
||||
|
||||
echo "Creating network '$NETWORK_NAME' with subnet $NETWORK_SUBNET..."
|
||||
# Step 4: Create standard networks
|
||||
declare -A networks
|
||||
networks[internet]="10.${OCTET}.100.0/24"
|
||||
networks[pangolin_transport]="10.${OCTET}.200.0/24"
|
||||
|
||||
for name in "${!networks[@]}"; do
|
||||
subnet="${networks[$name]}"
|
||||
if docker network inspect "$name" >/dev/null 2>&1; then
|
||||
echo "✅ Network '$name' already exists."
|
||||
else
|
||||
echo "Creating network '$name' with subnet $subnet"
|
||||
|
||||
if [[ "$name" == "internet" ]]; then
|
||||
docker network create \
|
||||
--driver=bridge \
|
||||
--subnet="$NETWORK_SUBNET" \
|
||||
"$NETWORK_NAME"
|
||||
--subnet="$subnet" \
|
||||
"$name"
|
||||
else
|
||||
docker network create \
|
||||
--driver=bridge \
|
||||
--subnet="$subnet" \
|
||||
--internal \
|
||||
"$name"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
echo "✅ Done. You may need to restart Docker to apply default address pool changes:"
|
||||
echo " sudo systemctl restart docker"
|
||||
echo "✅ Done. Docker daemon configured and standard networks created."
|
||||
|
||||
56
host_profile.sh
Normal file
56
host_profile.sh
Normal file
@@ -0,0 +1,56 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
echo "hostname: $(hostname)"
|
||||
echo "uptime: $(uptime -p)"
|
||||
echo "os: $(lsb_release -ds)"
|
||||
echo "kernel: $(uname -r)"
|
||||
echo "architecture: $(uname -m)"
|
||||
|
||||
# CPU Info
|
||||
echo "cpu:"
|
||||
echo " model: $(lscpu | awk -F: '/Model name/ {print $2}' | xargs)"
|
||||
echo " cores: $(nproc)"
|
||||
echo " threads: $(lscpu | awk -F: '/^CPU\(s\)/ {print $2}' | xargs)"
|
||||
# Frequency fallback: lscpu -> /proc/cpuinfo
|
||||
freq=$(lscpu | awk -F: '/^CPU MHz/ { gsub(/^[ \t]+/, "", $2); printf "%.2f", $2 / 1000 }' 2>/dev/null)
|
||||
if [[ -z "$freq" ]]; then
|
||||
freq=$(awk -F: '/cpu MHz/ {print $2; exit}' /proc/cpuinfo | awk '{printf "%.2f", $1 / 1000}')
|
||||
fi
|
||||
echo " frequency_ghz: ${freq:-unknown}"
|
||||
|
||||
# Memory Info
|
||||
mem_total=$(free -g | awk '/^Mem:/ {print $2}')
|
||||
mem_free=$(free -g | awk '/^Mem:/ {print $4}')
|
||||
if [[ "$mem_total" == "0" ]]; then
|
||||
mem_total=$(free -m | awk '/^Mem:/ {printf "%.1f", $2 / 1024}')
|
||||
mem_free=$(free -m | awk '/^Mem:/ {printf "%.1f", $4 / 1024}')
|
||||
fi
|
||||
echo "memory_gb:"
|
||||
echo " total: $mem_total"
|
||||
echo " free: $mem_free"
|
||||
|
||||
# Disk Devices (excluding loop and ram)
|
||||
echo "disks:"
|
||||
lsblk -dno NAME,SIZE,MODEL | grep -Ev '^loop|^ram' | while read -r name size model; do
|
||||
echo " - device: /dev/$name"
|
||||
echo " size: \"$size\""
|
||||
echo " model: \"${model:-unknown}\""
|
||||
done
|
||||
|
||||
# Disk Usage
|
||||
echo "disk_usage:"
|
||||
df -h --output=source,size,used,avail,target -x tmpfs -x devtmpfs | tail -n +2 | while read -r src size used avail target; do
|
||||
echo " - mount: \"$target\""
|
||||
echo " device: \"$src\""
|
||||
echo " size: \"$size\""
|
||||
echo " used: \"$used\""
|
||||
echo " available: \"$avail\""
|
||||
done
|
||||
|
||||
# Network Interfaces
|
||||
echo "network_interfaces:"
|
||||
ip -o -4 addr show | awk '!/ lo / {print " - iface: \"" $2 "\"\n ip: \"" $4 "\"" }'
|
||||
|
||||
# Machine ID
|
||||
echo "machine_id: $(cat /etc/machine-id)"
|
||||
Reference in New Issue
Block a user