Docker ja sarnased dünaamilised süsteemid tuleb kindlasti eraldi subvolume'idele panna, mida Timeshift automaatselt **ei varunda**. See on üks peamisi Btrfs parimal kasutamise tavasid serveri keskkonnas.[^1][^2][^3][^4][^5]

## Põhjused Docker'i Eraldi Subvolume'ile Panemiseks

### 1. **Timeshift Välistab /var/lib/docker Automaatselt**

Timeshift välistab vaikimisi `/var/lib/docker` täpselt sel põhjusel. Docker loob pidevalt uusi subvolume'e (iga image layer jaoks) ja mount point'e, mis võivad:[^3][^4][^5]

- Põhjustada Timeshift'i hangu või ebaõnnestumist[^2][^5]
- Tekitada massiivseid varukoopiaid, mis pole süsteemi taastamiseks vajalikud
- Luua ringviiteid ja kummalist käitumist snapshot'ide puhul[^2]


### 2. **Docker Andmed Ei Kuulu Süsteemi Snapshot'idesse**

- Docker konteinerid ja image'id on **efemeersed** - neid saab alati uuesti luua
- Docker volume'id sisaldavad **rakenduse andmeid**, mitte süsteemi konfiguratsiooni
- Süsteemi taastamisel tahad sa vana süsteemikonfiguratsiooni, aga mitte vanu konteineri layer'eid[^6][^1]


### 3. **Jõudlus ja Ruumikasutus**

- Docker loob Btrfs'iga väga palju subvolume'e (iga layer = subvolume)[^7][^1]
- Need subvolume'id kasvavad kiiresti ja võtavad palju ruumi
- Snapshot'ide tegemisel ilma nende välistamiseta dubleeritaks ka kõik Docker andmed[^8][^6]


## Soovitatud Btrfs Subvolume Struktuur AI Serverile

### Flat Layout (Soovitatav)

Flat layout on parim praktika, kus kõik subvolume'id on top-level'i otsesed lapsed, mitte nested:[^9][^10][^11][^12][^8]

```bash
# Mount top-level subvolume
sudo mount /dev/nvme0n1p2 -o subvolid=5 /mnt/btrfs-root

# Loo subvolume'id (flat layout)
# SNAPSHOTVAD subvolume'id (Timeshift varundab)
sudo btrfs subvolume create /mnt/btrfs-root/@
sudo btrfs subvolume create /mnt/btrfs-root/@home
sudo btrfs subvolume create /mnt/btrfs-root/@snapshots

# MITTE-SNAPSHOTVAD subvolume'id (Timeshift EI varunda)
sudo btrfs subvolume create /mnt/btrfs-root/@docker
sudo btrfs subvolume create /mnt/btrfs-root/@containerd
sudo btrfs subvolume create /mnt/btrfs-root/@libvirt
sudo btrfs subvolume create /mnt/btrfs-root/@varlibweaviate
sudo btrfs subvolume create /mnt/btrfs-root/@varlog
sudo btrfs subvolume create /mnt/btrfs-root/@varcache
sudo btrfs subvolume create /mnt/btrfs-root/@tmp
sudo btrfs subvolume create /mnt/btrfs-root/@opt

# AI/ML projektide andmed (eraldi varundusstrateegiga)
sudo btrfs subvolume create /mnt/btrfs-root/@data
sudo btrfs subvolume create /mnt/btrfs-root/@projects
sudo btrfs subvolume create /mnt/btrfs-root/@models
```


### /etc/fstab Seadistus

```bash
# /etc/fstab näide optimeeritud AI serverile

# EFI
UUID=xxxx-xxxx  /boot/efi  vfat  defaults  0 2

# SNAPSHOTVAD subvolume'id
UUID=yyyy  /  btrfs  defaults,subvol=@,compress=zstd:3,noatime,ssd,space_cache=v2,discard=async  0 0
UUID=yyyy  /home  btrfs  defaults,subvol=@home,compress=zstd:3,noatime,ssd,space_cache=v2,discard=async  0 0
UUID=yyyy  /.snapshots  btrfs  defaults,subvol=@snapshots,compress=zstd:3,noatime,ssd,space_cache=v2,discard=async  0 0

# MITTE-SNAPSHOTVAD subvolume'id (Docker, logs, cache)
UUID=yyyy  /var/lib/docker  btrfs  defaults,subvol=@docker,compress=zstd:1,noatime,ssd,space_cache=v2,discard=async  0 0
UUID=yyyy  /var/lib/containerd  btrfs  defaults,subvol=@containerd,compress=zstd:1,noatime,ssd,space_cache=v2  0 0
UUID=yyyy  /var/lib/weaviate  btrfs  defaults,subvol=@varlibweaviate,compress=zstd:1,noatime,ssd,space_cache=v2  0 0
UUID=yyyy  /var/log  btrfs  defaults,subvol=@varlog,compress=zstd:3,noatime,ssd,space_cache=v2  0 0
UUID=yyyy  /var/cache  btrfs  defaults,subvol=@varcache,compress=zstd:1,noatime,ssd,space_cache=v2  0 0
UUID=yyyy  /tmp  btrfs  defaults,subvol=@tmp,noatime,ssd,space_cache=v2  0 0
UUID=yyyy  /opt  btrfs  defaults,subvol=@opt,compress=zstd:3,noatime,ssd,space_cache=v2  0 0

# AI/ML andmed (oma varundusstrateegiga)
UUID=yyyy  /data  btrfs  defaults,subvol=@data,compress=zstd:1,noatime,ssd,space_cache=v2,discard=async  0 0
UUID=yyyy  /projects  btrfs  defaults,subvol=@projects,compress=zstd:3,noatime,ssd,space_cache=v2  0 0
UUID=yyyy  /models  btrfs  defaults,subvol=@models,compress=zstd:1,noatime,ssd,space_cache=v2  0 0

# Top-level juurdepääs hoolduseks
UUID=yyyy  /mnt/btrfs-root  btrfs  defaults,subvolid=5,noatime,ssd,space_cache=v2  0 0
```


## Installeerimisskript

```bash
#!/bin/bash
# PopOS 24.04 Btrfs Subvolume Setup for AI Server

set -e

# HOIATUS: Kontrolli muutujaid enne käivitamist!
DEVICE="/dev/nvme0n1p2"  # Sinu Btrfs partitsioon
MOUNT_POINT="/mnt/btrfs-root"

echo "=== Btrfs Subvolume Struktuur AI Serverile ==="
echo "Seade: $DEVICE"
echo ""
read -p "Kas jätkad? (jah/ei): " answer
if [ "$answer" != "jah" ]; then
    echo "Katkestatud."
    exit 1
fi

# Mount top-level subvolume
sudo mkdir -p $MOUNT_POINT
sudo mount $DEVICE -o subvolid=5 $MOUNT_POINT

# Kontrolli, kas @ juba olemas
if [ -d "$MOUNT_POINT/@" ]; then
    echo "Subvolume @ juba olemas, jätan vahele..."
else
    echo "Loon põhilised subvolume'id..."
    
    # Snapshotavad subvolume'id
    sudo btrfs subvolume create $MOUNT_POINT/@
    sudo btrfs subvolume create $MOUNT_POINT/@home
    sudo btrfs subvolume create $MOUNT_POINT/@snapshots
    
    # Mitte-snapshotavad süsteemi subvolume'id
    sudo btrfs subvolume create $MOUNT_POINT/@docker
    sudo btrfs subvolume create $MOUNT_POINT/@containerd
    sudo btrfs subvolume create $MOUNT_POINT/@libvirt
    sudo btrfs subvolume create $MOUNT_POINT/@varlibweaviate
    sudo btrfs subvolume create $MOUNT_POINT/@varlog
    sudo btrfs subvolume create $MOUNT_POINT/@varcache
    sudo btrfs subvolume create $MOUNT_POINT/@tmp
    sudo btrfs subvolume create $MOUNT_POINT/@opt
    
    # AI/ML andmete subvolume'id
    sudo btrfs subvolume create $MOUNT_POINT/@data
    sudo btrfs subvolume create $MOUNT_POINT/@projects
    sudo btrfs subvolume create $MOUNT_POINT/@models
fi

# Näita loodud subvolume'id
echo ""
echo "=== Loodud Subvolume'id ==="
sudo btrfs subvolume list $MOUNT_POINT

echo ""
echo "=== UUID ==="
sudo blkid $DEVICE | grep -o 'UUID="[^"]*"'

echo ""
echo "Subvolume'id loodud! Järgmised sammud:"
echo "1. Lisa ülalolevad read /etc/fstab faili (kasuta õiget UUID'd)"
echo "2. Loo vajalikud mount point'id"
echo "3. Taaskäivita süsteem"
echo "4. Seadista Timeshift kasutama @ subvolume'i"
```


## Timeshift Seadistamine

### Timeshift Installimine ja Seadistamine

```bash
# Installi Timeshift
sudo apt install -y timeshift

# Käivita Timeshift GUI esmakordseks seadistuseks
sudo timeshift-gtk

# Või kasuta CLI'd
sudo timeshift --create --comments "Initial snapshot" --tags D
sudo timeshift --list
```


### Timeshift Seadistused

```bash
# /etc/timeshift/timeshift.json peamised seaded

{
  "backup_device_uuid" : "sinu-uuid-siia",
  "do_first_run" : "false",
  "btrfs_mode" : "true",
  "include_btrfs_home_for_backup" : "false",
  "include_btrfs_home_for_restore" : "false",
  "stop_cron_emails" : "true",
  
  # Subvolume'id, mida varundatakse (ainult @)
  "btrfs_subvolumes" : [ 
    { "path" : "@", "snapshot" : "true" }
  ],
  
  # Välistused (automaatsed + käsitsi)
  "exclude" : [
    "/var/lib/docker/**",
    "/var/lib/containerd/**",
    "/var/lib/weaviate/**",
    "/var/log/**",
    "/var/cache/**",
    "/tmp/**",
    "/data/**",
    "/projects/**",
    "/models/**",
    "/home/**",
    "*.pyc",
    "*.log",
    "__pycache__/**",
    ".cache/**",
    ".local/share/Trash/**"
  ]
}
```


### Automaatsed Snapshot'id

```bash
# Seadista automaatsed snapshot'id
sudo timeshift --snapshot-device /dev/nvme0n1p2 --btrfs

# Seadista graafik (nt: iga päev, säilita 5 päeva)
# Seda saab teha GUI's või otse JSON failis:
# "schedule_monthly" : "false",
# "schedule_weekly" : "false",
# "schedule_daily" : "true",
# "count_daily" : "5",
# "schedule_hourly" : "false",
# "schedule_boot" : "true",
# "count_boot" : "3"

# Kontrolli cron tööd
sudo systemctl status cronie
sudo cat /etc/cron.d/timeshift-hourly
```


## Docker Seadistamine Btrfs'iga

### Variant 1: Overlay2 Storage Driver (Soovitatav)

```bash
# /etc/docker/daemon.json

{
  "storage-driver": "overlay2",
  "data-root": "/var/lib/docker",
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

# Taaskäivita Docker
sudo systemctl restart docker

# Kontrolli
docker info | grep "Storage Driver"
# Storage Driver: overlay2
```

**Miks overlay2?**[^13][^14][^15][^16]

- Docker eemaldas Btrfs storage driver'i toe versioonist 23.0[^16]
- Overlay2 on kiirem ja lihtsamini hallatav[^14][^15]
- Btrfs host failisüsteem + overlay2 storage driver on parim kombinatsioon[^15][^1][^13]


### Variant 2: Docker Volume'id Eraldi Subvolume'idel

```bash
# Loo spetsiifilised subvolume'id oluliste konteinerite jaoks
sudo btrfs subvolume create /mnt/btrfs-root/@weaviate_data
sudo btrfs subvolume create /mnt/btrfs-root/@jupyter_data
sudo btrfs subvolume create /mnt/btrfs-root/@postgres_data

# Mount need
echo 'UUID=yyyy /var/lib/weaviate-data btrfs defaults,subvol=@weaviate_data,compress=zstd:1,noatime,ssd 0 0' | sudo tee -a /etc/fstab

# Kasuta docker-compose'is host mount'e
# docker-compose.yml:
# volumes:
#   - /var/lib/weaviate-data:/var/lib/weaviate
```


## Varundusstrateegiad

### 1. **Timeshift - Süsteemi Snapshots (Automaatne)**

**Eesmärk:** Kiire süsteemi taastamine pärast update'i või konfiguratsioonivea

```bash
# Automaatsed snapshot'id iga päev
# Säilita: 5 päevast, 3 boot'i
# Varundab ainult @ subvolume'i
```


### 2. **Btrfs Send/Receive - Andmete Varundamine (Käsitsi/Scheduled)**

**Eesmärk:** Oluliste andmete (projektid, mudelid) varundamine välisele kettale

```bash
#!/bin/bash
# backup-data.sh - AI/ML andmete varundamine

BACKUP_DEST="/mnt/backup-drive"
DATE=$(date +%Y-%m-%d_%H-%M-%S)

# Loo read-only snapshot
sudo btrfs subvolume snapshot -r /projects /mnt/btrfs-root/@projects_backup_$DATE

# Saada välisele kettale
sudo btrfs send /mnt/btrfs-root/@projects_backup_$DATE | \
    sudo btrfs receive $BACKUP_DEST/projects/

# Kontrolli
sudo btrfs subvolume list $BACKUP_DEST

# Kustuta vana snapshot (pärast kinnitamist)
# sudo btrfs subvolume delete /mnt/btrfs-root/@projects_backup_$DATE

echo "Varundamine valmis: $DATE"
```


### 3. **Inkrementaalne Btrfs Backup**

```bash
#!/bin/bash
# incremental-backup.sh

SUBVOL="/projects"
BACKUP_DEST="/mnt/backup-drive/projects"
PARENT_SNAP="$(ls -t $BACKUP_DEST | head -1)"

DATE=$(date +%Y-%m-%d_%H-%M-%S)
SNAP_NAME="projects_$DATE"

# Loo uus snapshot
sudo btrfs subvolume snapshot -r $SUBVOL /mnt/btrfs-root/$SNAP_NAME

# Inkrementaalne send (ainult muudatused)
if [ ! -z "$PARENT_SNAP" ]; then
    echo "Inkrementaalne backup parent'ilt: $PARENT_SNAP"
    sudo btrfs send -p $BACKUP_DEST/$PARENT_SNAP \
        /mnt/btrfs-root/$SNAP_NAME | \
        sudo btrfs receive $BACKUP_DEST/
else
    echo "Täielik backup (esimene)"
    sudo btrfs send /mnt/btrfs-root/$SNAP_NAME | \
        sudo btrfs receive $BACKUP_DEST/
fi

# Puhasta vanad snapshot'id (säilita viimased 10)
ls -t /mnt/btrfs-root/ | grep "projects_" | tail -n +11 | \
    xargs -I {} sudo btrfs subvolume delete /mnt/btrfs-root/{}

echo "Inkrementaalne backup valmis!"
```


### 4. **Rsync - Failipõhine Backup**

```bash
#!/bin/bash
# rsync-backup.sh - Jupyter notebooks ja koodide varundamine

SOURCE="/home/user/jupyter-notebooks"
DEST="/mnt/backup-drive/jupyter-backups"
DATE=$(date +%Y-%m-%d)

rsync -avz --delete \
    --exclude '.ipynb_checkpoints' \
    --exclude '__pycache__' \
    --exclude '*.pyc' \
    --exclude 'venv/' \
    --exclude '.git/' \
    $SOURCE $DEST/$DATE/

echo "Rsync backup valmis: $DATE"
```


### 5. **Automatiseerimine Systemd Timer'itega**

```bash
# /etc/systemd/system/ai-data-backup.service

[Unit]
Description=AI/ML Data Backup
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/incremental-backup.sh
User=root
```

```bash
# /etc/systemd/system/ai-data-backup.timer

[Unit]
Description=AI/ML Data Backup Timer
Requires=ai-data-backup.service

[Timer]
OnCalendar=daily
OnCalendar=Sun *-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target
```

```bash
# Aktiveeri timer
sudo systemctl daemon-reload
sudo systemctl enable ai-data-backup.timer
sudo systemctl start ai-data-backup.timer

# Kontrolli
sudo systemctl list-timers
```


## Kontrolli ja Monitoori

```bash
# Btrfs ruumikasutuse kontroll
sudo btrfs filesystem usage /
sudo btrfs filesystem df /

# Subvolume'ide loetelu
sudo btrfs subvolume list / -t

# Timeshift snapshot'ide loetelu
sudo timeshift --list

# Docker ruumikasutus
docker system df

# Puhasta Docker prügi
docker system prune -a --volumes

# Kontrolli mount point'e
mount | grep btrfs

# Snapshot'ide ruumikasutus
sudo btrfs qgroup show /
```


## Kokkuvõte: Optimaalne Struktuur

**Snapshotavad (Timeshift):**

- `@` → `/` (süsteem, paketid, konfiguratsioonid)
- `@home` → `/home` (kasutaja kodukataloog, valikuline)

**MITTE Snapshotavad (Timeshift välistab):**

- `@docker` → `/var/lib/docker` ✅
- `@varlibweaviate` → `/var/lib/weaviate` ✅
- `@varlog` → `/var/log` ✅
- `@varcache` → `/var/cache` ✅
- `@tmp` → `/tmp` ✅

**Eraldi Varundatavad (käsitsi/scheduled):**

- `@projects` → `/projects` (AI/ML projektid)
- `@data` → `/data` (töötlemata andmed)
- `@models` → `/models` (treenitud mudelid)

See struktuur annab sulle:

1. **Kiire süsteemi taastamine** Timeshift'iga (ainult @ subvolume)
2. **Efektiivne ruumikasutus** (ei varunda Docker'i jne)
3. **Paindlik andmete varundamine** (ise valid, mida ja millal)
4. **Selge organisatsioon** (igal asjal oma koht)

Kas see vastab sinu vajadustele või soovid mõnda osa täpsustada?
<span style="display:none">[^17][^18][^19][^20][^21][^22][^23][^24][^25][^26][^27][^28][^29][^30][^31][^32][^33][^34][^35][^36][^37][^38]</span>
