#!/bin/bash

set -e

# ============================================================
# Оптимізація пам'яті Linux
# zRAM + Swapfile 8 ГБ
# Debian / Ubuntu
# ============================================================

SWAPFILE="/swapfile"
SWAP_SIZE="8G"
ZRAM_CONFIG="/etc/systemd/zram-generator.conf"
SYSCTL_CONFIG="/etc/sysctl.d/99-zram-mem.conf"

echo "============================================================"
echo "        Налаштування zRAM + Swapfile"
echo "============================================================"

# ------------------------------------------------------------
# 0. Перевірка root
# ------------------------------------------------------------

if [ "$EUID" -ne 0 ]; then
    echo "Помилка: скрипт потрібно запускати через sudo."
    echo
    echo "Приклад:"
    echo "sudo $0"
    exit 1
fi

# ------------------------------------------------------------
# 1. Визначення файлової системи
# ------------------------------------------------------------

echo
echo "=== 1. Перевірка файлової системи ==="

ROOT_FS=$(findmnt -n -o FSTYPE /)

echo "Файлова система /: $ROOT_FS"

case "$ROOT_FS" in
    btrfs)
        echo
        echo "УВАГА: коренева файлова система Btrfs."
        echo "Для swapfile потрібні спеціальні налаштування Btrfs."
        echo "Цей скрипт не буде автоматично створювати swapfile,"
        echo "щоб не пошкодити систему."
        echo
        echo "Вихід."
        exit 1
        ;;
    zfs)
        echo
        echo "УВАГА: коренева файлова система ZFS."
        echo "Звичайний /swapfile для ZFS не рекомендується."
        echo
        echo "Вихід."
        exit 1
        ;;
esac

# ------------------------------------------------------------
# 2. Створення Swapfile
# ------------------------------------------------------------

echo
echo "=== 2. Swapfile 8 ГБ ==="

if [ -e "$SWAPFILE" ]; then

    echo "$SWAPFILE вже існує."

    # Перевіряємо, чи це справді swap
    if file "$SWAPFILE" | grep -qi "swap"; then
        echo "Файл розпізнано як swap."
    else
        echo
        echo "ПОМИЛКА:"
        echo "$SWAPFILE існує, але не розпізнаний як swap-файл."
        echo
        echo "Щоб не видалити потенційно важливий файл,"
        echo "скрипт зупинено."
        exit 1
    fi

else

    echo "Створюємо swapfile $SWAP_SIZE..."

    # Для ext4/xfs та більшості звичайних файлових систем
    # fallocate значно швидший за dd.
    fallocate -l "$SWAP_SIZE" "$SWAPFILE"

    chmod 600 "$SWAPFILE"

    mkswap "$SWAPFILE"

    echo "Swapfile створено."

fi

# ------------------------------------------------------------
# 3. Додавання Swapfile у /etc/fstab
# ------------------------------------------------------------

echo
echo "=== 3. Налаштування /etc/fstab ==="

if grep -qE "^${SWAPFILE}[[:space:]]" /etc/fstab; then

    echo "Запис $SWAPFILE вже є в /etc/fstab."

    # Якщо старий запис без потрібного пріоритету —
    # замінюємо його.
    sed -i "\|^${SWAPFILE}[[:space:]]|c\\${SWAPFILE} none swap sw,pri=10 0 0" /etc/fstab

else

    echo "${SWAPFILE} none swap sw,pri=10 0 0" >> /etc/fstab

    echo "Swapfile додано в /etc/fstab."

fi

# ------------------------------------------------------------
# 4. Активація Swapfile
# ------------------------------------------------------------

echo
echo "=== 4. Активація Swapfile ==="

if swapon --show=NAME | grep -qx "$SWAPFILE"; then

    echo "Swapfile вже активний."

else

    echo "Активуємо $SWAPFILE..."
    swapon -p 10 "$SWAPFILE"

    echo "Swapfile активовано."

fi

# ------------------------------------------------------------
# 5. Встановлення zram-generator
# ------------------------------------------------------------

echo
echo "=== 5. Встановлення systemd-zram-generator ==="

export DEBIAN_FRONTEND=noninteractive

apt update
apt install -y systemd-zram-generator

echo "systemd-zram-generator встановлено."

# ------------------------------------------------------------
# 6. Конфігурація zRAM
# ------------------------------------------------------------

echo
echo "=== 6. Налаштування zRAM ==="

cat > "$ZRAM_CONFIG" <<'EOF'
[zram0]
zram-size = ram * 1
compression-algorithm = zstd
swap-priority = 100
fs-type = swap
EOF

echo "Створено:"
echo "$ZRAM_CONFIG"

echo
echo "Параметри:"
echo "  Розмір       : 100% від RAM"
echo "  Алгоритм     : zstd"
echo "  Пріоритет    : 100"

# ------------------------------------------------------------
# 7. Налаштування параметрів ядра
# ------------------------------------------------------------

echo
echo "=== 7. Налаштування параметрів пам'яті ==="

cat > "$SYSCTL_CONFIG" <<'EOF'
# Оптимізація роботи пам'яті з zRAM
vm.swappiness = 100
vm.vfs_cache_pressure = 50
EOF

sysctl --system

echo
echo "vm.swappiness:"
sysctl -n vm.swappiness

echo
echo "vm.vfs_cache_pressure:"
sysctl -n vm.vfs_cache_pressure

# ------------------------------------------------------------
# 8. Активація / оновлення zRAM
# ------------------------------------------------------------

echo
echo "=== 8. Активація zRAM ==="

systemctl daemon-reload

if systemctl is-active --quiet systemd-zram-setup@zram0.service; then

    echo "zRAM вже активна."
    echo "Перезапускаємо для застосування нової конфігурації..."

    systemctl restart systemd-zram-setup@zram0.service

else

    echo "Створюємо zRAM..."

    systemctl start /dev/zram0

fi

# ------------------------------------------------------------
# 9. Перевірка
# ------------------------------------------------------------

echo
echo "============================================================"
echo "                    РЕЗУЛЬТАТ"
echo "============================================================"

echo
echo "--- Swap ---"
swapon --show

echo
echo "--- zRAM ---"
zramctl

echo
echo "--- Пам'ять ---"
free -h

echo
echo "--- Swappiness ---"
sysctl vm.swappiness

echo
echo "--- Cache pressure ---"
sysctl vm.vfs_cache_pressure

echo
echo "--- Стан zRAM service ---"
systemctl --no-pager --full status systemd-zram-setup@zram0.service 2>/dev/null || true

echo
echo "============================================================"
echo "                    ГОТОВО"
echo "============================================================"

echo
echo "Очікувано:"
echo "  zRAM     -> priority 100"
echo "  swapfile -> priority 10"
echo
echo "zRAM використовується першою, swapfile — як резерв."
echo