Home
о жизни, вселенной и все такое - mirror on demand [entries|archive|friends|userinfo]
суперхомяк

Visitor Map

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

mirror on demand [Aug. 21st, 2007|10:10 pm]
Previous Entry Add to Memories Tell a Friend Next Entry
[Tags|, , ]

если слова altlinux, hasher, apt ничего не говорят - проходите мимо ;)

Хочу пользоваться хэшером и собирать под бранч, однако полного зеркала нету и возможности его сделать тоже. Hasher прекрасно работает с ftp/http репозитариями, однако между сборками удаляет aptbox вместе с apt/cache/archives. Обидно. Еще хочу обновить одну машину и скачанные мегабайты использовать для других.

Очевидное решение: вытаскивать из /var/cache/apt/archives (или, соответственно, из ~/hasher/aptbox) пакеты, делать genbasedir и подключать как локальный репозитарий. Очевидный недостаток: теряется информация о конкретном источнике пакета. Если подключен и бранч, и сизиф, то полученный репозитарий нельзя использовать на другой машине, которую желательно оставить на бранче.

Можно было бы использовать кэширующий прокси. Не устраивает сквидовский формат хранения.

Начиная с версии 0.5.31, в nginx есть все что нам нужно.

nginx.conf:
location /sisyphus/ {
        root /var/www/;
        error_page 404 = /fetch$uri;
}

location /fetch/sisyphus/kiev/ {
        internal;
        proxy_pass http://ftp.linux.kiev.ua/;
        proxy_store /var/www/$request_uri;
}

location /fetch/sisyphus/alt/ {
        internal;
        proxy_pass http://ftp.altlinux.com/;
        proxy_store /var/www/$request_uri;
}
sources.list:
rpm http://localhost/sisyphus/kiev/pub/Linux/ALT/updates/4.0/ i586 updates

# Sisyphus stable branch for ALT Linux 4.0 Desktop
rpm http://localhost/sisyphus/kiev/pub/Linux/ALT/4.0/branch/ i586 classic
rpm http://localhost/sisyphus/kiev/pub/Linux/ALT/4.0/branch/ noarch classic
и придется руками сделать mkdir /var/www/sisyphus; chown _nginx:_nginx /var/www/sisyphus;

Всё.

Известные проблемы: это все-таки не настоящий кэширующий прокси, и обновлять сохраненные файлы он не намерен независимо от Last-Modified. Но пакеты ведь не могут меняться, нас интересуют только индексы, поэтому можно изредка делать find /var/www/sisyphus/ -type d -name base -exec rm -rf '{}' \; (или принудительно обновлять, см. ниже).

UPD. Второй недостаток - нам совершенно необязательно знать, с какого именно зеркала были получены пакеты. К тому же приходится перечислять зеркала и в sources.list, и в nginx.conf.

Сделаем еще один шаг:
    location /sisyphus/ {
        root /var/www/;
        error_page 404 = /fetch$uri;
        error_page 403 = /fetch$uri;
    }

    location /fetch/sisyphus/ {
        internal;
        proxy_pass http://ftp.linux.kiev.ua/pub/Linux/ALT/;
        proxy_pass http://ftp.altlinux.org/pub/distributions/ALTLinux/;

        proxy_store /var/www/$request_uri;
    }

В sources.list при этом кладется следующее:
rpm http://172.16.10.151/sisyphus/4.0/branch/ i586 classic
rpm http://172.16.10.151/sisyphus/4.0/branch/ noarch classic
Управление используеміми зеркалами остается на совести администратора прокси. Клиент не знает, с каким конкретно зеркалом работает.

UPD2. Еще одна известная проблема. Если пакеты на сервере обновляются, в нашем кэше будут накапливаться старые версии. Почистить можно так:
rsync -r --delete-before --existing rsync://ftp.linux.kiev.ua/ALTLinux/ /var/www/sisyphus/
Это удалит все файлы, которых нет на сервере. При этом индексы обновятся [потому что одноименные, но разные].

копия на freesource.info
LinkReply