# Зеркало на базе apt-mirror

**URL:** <https://forum.samohosting.ru/t/zerkalo-na-baze-apt-mirror/2316>\
**Category:** 07. Библиотека Самохостят\
**Tags:** заметка, руководство\
**Created:** [06.Май.2026 08:22:50 UTC](https://forum.samohosting.ru/t/zerkalo-na-baze-apt-mirror/2316 "2026-05-06T08:22:50Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![ntdvme](https://forum.samohosting.ru/letter_avatar_proxy/v4/letter/n/bcef8e/32.png) [@ntdvme](https://forum.samohosting.ru/u/ntdvme)\
**Post date:** [06.Май.2026 08:22:51 UTC](https://forum.samohosting.ru/t/zerkalo-na-baze-apt-mirror/2316/1 "2026-05-06T08:22:51Z")

</div>

Всем привет! В чате попросили рассказать о зеркалировании репозиториев, поэтому здесь этим и займёмся. У меня самый простой вариант, потому что инфра как код, через гит управлять удобнее всего.

Устанавливаем apt-mirror. Для Debian это делается через

> sudo apt install apt-mirror

Если у вас Ubuntu, можно ставить apt-mirror2

> sudo apt install apt-mirror2

Конфигурационный файл лежит в /etc/apt/mirror.list. Моё содержимое файла:

```auto
$ cat mirror.list 
############# config ##################
#
set base_path /app/apt-mirror ## Куда будет качаться
#
# set mirror_path $base_path/mirror ## Стандартная папка
# set skel_path $base_path/skel ## Стандартная папка
# set var_path $base_path/var ## Стандартная папка
# set cleanscript $var_path/clean.sh ## Скрипт очистки устаревших пакетов, которых нет в release
# set defaultarch <running host architecture> ## Работает как попало, надёжнее указывать как у меня ниже
set postmirror_script /home/apt-mirror/postmirror.sh ## Пост-скрипт, тоже будет ниже
set run_postmirror 1 ## Разрешить postmirror_script 
set nthreads 20 ## Потоков для загрузки
set _tilde 0
#
############# end config ##############

deb [arch=amd64] https://apt.syncthing.net/ syncthing stable-v2
clean https://apt.syncthing.net/ syncthing stable-v2

deb [arch=amd64] https://download.docker.com/linux/debian trixie stable
clean https://download.docker.com/linux/debian trixie stable

deb [arch=amd64] https://deb.debian.org/debian trixie main contrib non-free non-free-firmware
deb [arch=amd64] https://deb.debian.org/debian trixie-updates main contrib non-free non-free-firmware
deb [arch=amd64] https://deb.debian.org/debian-security trixie-security main contrib non-free non-free-firmware
clean https://deb.debian.org/debian
clean https://deb.debian.org/debian-security

deb [arch=amd64] http://download.proxmox.com/debian/pve trixie pve-no-subscription
clean http://download.proxmox.com/debian/pve

deb [arch=amd64] http://download.proxmox.com/debian/pbs trixie pbs-no-subscription
clean http://download.proxmox.com/debian/pbs

```

postmirror.sh:

```auto
$ cat postmirror.sh 
#!/bin/bash

MIRROR_BASE="/app/apt-mirror/mirror" ## Куда скачиваются репозитории
REPO_BASE="/app/apt-mirror/repository" ## Куда делается ссылка, чтобы url выглядел красиво

REPOS=(
    "apt.syncthing.net|syncthing" ## Тут указываем какой репозиторий какое название ссылки и соответственно url имеет.
    "download.docker.com|docker"
    "deb.debian.org|debian"
    "download.proxmox.com|proxmox"
)

mkdir -p "$REPO_BASE"

for REPO in "${REPOS[@]}"; do
    DOMAIN="${REPO%%|*}"
    NAME="${REPO##*|}"
    
    SOURCE="$MIRROR_BASE/$DOMAIN"
    TARGET="$REPO_BASE/$NAME"
    
    if [-d "$SOURCE"]; then
        [-L "$TARGET"] && rm "$TARGET" # удалить старую ссылку
        ln -s "$SOURCE" "$TARGET"
        echo "Создана ссылка: $TARGET -> $SOURCE"
    fi
done

CLEAN_SCRIPT="/app/apt-mirror/var/clean.sh" ## Скрипт очистки. Отлично работает, если указан в postmirror
if [-f "$CLEAN_SCRIPT"]; then
    echo "Запуск очистки..."
    bash "$CLEAN_SCRIPT"
    echo "Очистка завершена"
else
    echo "Внимание: $CLEAN_SCRIPT не найден, пропускаем очистку"
fi

chown -R www-data:www-data "$REPO_BASE" ## Выдача прав для nginx в папку зеркала

echo "Постпроцесс завершён"

```

Как выглядит структура:  
В папку mirror скачиваются сами репозитории:

```auto
apt.syncthing.net deb.debian.org download.docker.com download.proxmox.com

```

А в папке repository после postmirror создаются их ссылки:

```auto
ntdvme@apt-mirror:/app/apt-mirror$ ls -la repository/
итого 8
drwxr-xr-x 2 www-data www-data 4096 мая 6 09:00 .
drwxr-xr-x 6 apt-mirror apt-mirror 4096 мая 5 17:10 ..
lrwxrwxrwx 1 www-data www-data 37 мая 6 09:00 debian -> /app/apt-mirror/mirror/deb.debian.org
lrwxrwxrwx 1 www-data www-data 42 мая 6 09:00 docker -> /app/apt-mirror/mirror/download.docker.com
lrwxrwxrwx 1 www-data www-data 43 мая 6 09:00 proxmox -> /app/apt-mirror/mirror/download.proxmox.com
lrwxrwxrwx 1 www-data www-data 40 мая 6 09:00 syncthing -> /app/apt-mirror/mirror/apt.syncthing.net

```

Собственно сам mirror.conf для nginx, который забирает файлики:

```auto
server {
    listen 80;
    server_name mirror.ntdv.me;
    disable_symlinks off;
    
    location / {
        root /app/apt-mirror/repository;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
        
    }

}

```

Дальше с 80 порта проксировать можно как и куда угодно, я это делаю через основной веб-сервер. Все сервисы по 80 и 443 порту гуляют через единую точку входа/выхода.

Когда мы с вами сделали зеркало репозитория, использовать его можно так:

```auto
Types: deb
URIs: https://mirror.ntdv.me/debian/debian
Suites: trixie trixie-updates
Components: main contrib non-free non-free-firmware 
Enabled: yes
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Types: deb
URIs: https://mirror.ntdv.me/debian/debian-security
Suites: trixie-security
Components: main contrib non-free non-free-firmware
Enabled: yes

```

Тут важно помнить, что зеркало [mirror.domain.com](http://mirror.domain.com) - общий домен. Сами репозитории указываются через path. В примере выше первый debian - идти по символьной ссылке. Второй debian - путь в сам репозиторий.

Для автозапуска использую cron через cronfile, в /etc/cron.d создаём файл cron, и в нём:

```auto
0 7,9,13,16,19,22 * * * root proxychains4 /usr/bin/apt-mirror >> /var/log/apt-mirror.log 2>&1

```

---

<div class="post-metadata">

**Author:** ![ntdvme](https://forum.samohosting.ru/letter_avatar_proxy/v4/letter/n/bcef8e/32.png) [@ntdvme](https://forum.samohosting.ru/u/ntdvme)\
**Post date:** [30.Май.2026 14:28:50 UTC](https://forum.samohosting.ru/t/zerkalo-na-baze-apt-mirror/2316/2 "2026-05-30T14:28:50Z")

</div>

конфиг для apt-mirror2

он по большей части перенесён из apt-mirror оригинального.

```bash
############# config ##################
#
set base_path /app/apt-mirror
#
# set mirror_path $base_path/mirror
# set skel_path $base_path/skel
# set var_path $base_path/var
# set cleanscript $var_path/clean.sh
# set defaultarch <running host architecture>
set postmirror_script /home/apt-mirror/postmirror.sh
set run_postmirror 1
set nthreads 50
set _tilde 0
set _autoclean 1
set slow_rate_protection off
set check_hashes off
set weak_size_check 1
#
############# end config ##############

deb [arch=amd64] https://apt.syncthing.net/ syncthing stable-v2
clean https://apt.syncthing.net/
http2-disable https://apt.syncthing.net/
mirror_path https://apt.syncthing.net/ syncthing

deb [arch=amd64] https://download.docker.com/linux/debian trixie stable
clean https://download.docker.com/linux/debian
http2-disable https://download.docker.com/linux/debian
mirror_path https://download.docker.com/linux/debian docker

deb [arch=amd64] https://deb.debian.org/debian trixie main contrib non-free non-free-firmware
deb [arch=amd64] https://deb.debian.org/debian trixie-updates main contrib non-free non-free-firmware
deb [arch=amd64] https://deb.debian.org/debian-security trixie-security main contrib non-free non-free-firmware
clean https://deb.debian.org/debian
clean https://deb.debian.org/debian-security
http2-disable https://deb.debian.org/debian
http2-disable https://deb.debian.org/debian-security
mirror_path https://deb.debian.org/debian debian/debian
mirror_path https://deb.debian.org/debian-security debian/debian-security

deb [arch=amd64] http://download.proxmox.com/debian/pve trixie pve-no-subscription
clean http://download.proxmox.com/debian/pve
http2-disable http://download.proxmox.com/debian/pve
mirror_path http://download.proxmox.com/debian/pve proxmox/pve

deb [arch=amd64] http://download.proxmox.com/debian/pbs trixie pbs-no-subscription
clean http://download.proxmox.com/debian/pbs
http2-disable http://download.proxmox.com/debian/pbs
mirror_path http://download.proxmox.com/debian/pbs proxmox/pbs

```

```bash
http2-disable нужен чтоб при скачивании не использовался http2 - это долго, скорость со 100мбайт/с падает до 1-3мбайт/с - с чем связано не знаю. от репы к репе зависит, но перекачивать и тестить неохота
set slow_rate_protection off сюда же, влияет на скорость загрузки

```

```bash
mirror_path позволяет задать имя каталога. 
рассмотрим на примере 
mirror_path https://apt.syncthing.net/ syncthing

берётся путь из mirror_path вверху конфига, и получается что зеркало попадает в папку syncthing, без этой директивы папка будет apt.syncthing.net.

то есть симлинки больше не нужны.

```

по заверению разработчика директивы

```bash
set _autoclean 1 и clean https://apt.syncthing.net/
позволяют не использовать скрипт clean.sh и его аналоги. заметил пока что тех файлов что нет в packages после синхронизации не будет и в папке репозитория, вручную менял названия, делал рандомные - всё удаляет. оставляет что надо. фактически с использованием apt-mirror2 размер репы вырос на 10 гигов.

```

```bash
set check_hashes off
set weak_size_check 1 влияют на проверку пакетов. долго время занимает, я оставил проверку только по размеру - если новых пакетов в источнике нет то пара минут на синхронизацию уходит

```
