Làm cách nào để thiết lập kho APT?


52

Tôi muốn thiết lập một kho lưu trữ APT trên một máy chủ sẽ cung cấp một vài gói.

Có cách nào để thiết lập mà không cần cài đặt bất kỳ phần mềm nào trên máy chủ không?

Làm thế nào để các tập tin phải được tổ chức?


Chỉnh sửa: Tôi phải làm điều gì đó sai ... ai đó có thể vui lòng giúp tôi không? Tôi có kho lưu trữ tại http://quickmediasolutions.com/apt/dists

Tôi không chắc chắn ở đâu hoặc cái gì, nhưng cái gì đó được cấu hình sai. Tôi hiện chỉ có một gói và nó dành cho tất cả các kiến ​​trúc.

Đây là những gì đã được thêm vào của tôi /etc/apt/sources.list:

deb http://quickmediasolutions.com/apt stable main

Bạn có thể chỉnh sửa và thêm loại giấy phép mà các ứng dụng bạn đã tải xuống không? Đây có phải là để sử dụng cá nhân hoặc bạn có kế hoạch phân phối chúng, vv?
Jorge Castro

@Jorge: Ý bạn là gì? Ứng dụng gì?
Nathan Osman

1
Tôi đã cố gắng xác định xem gói đó có phải là OSS hay không, bạn chỉ có thể sử dụng launchpad.
Jorge Castro

@Jorge: Không, đó không phải là OSS. (Trên thực tế, đó là khá nhiều ứng dụng duy nhất tôi đã viết mà không phải.)
Nathan Osman

Câu trả lời:


26

Thiết lập một kho lưu trữ tầm thường rất dễ dàng bằng cách sử dụng các gói quét dpkg. Trang này giải thích cách thiết lập một repo tầm thường và trang này giải thích cách sử dụng nó (cuộn xuống ví dụ 4).


Có một chút rắc rối để làm cho nó hoạt động. Xin vui lòng xem cập nhật của tôi cho câu hỏi.
Nathan Osman

1
Có vẻ như bạn đang cố gắng thiết lập một repo "tự động". Đối với một (hoặc chỉ một vài) gói, bạn sẽ tốt hơn nhiều khi sử dụng repo tầm thường. Hãy thử di chuyển Gói của bạn và thảo luận tất cả các cách để quickmediasolutions.com/apt/binary . Sau đó, nguồn của bạn sẽ được deb http://quickmediasolutions.com/apt binary/.
Michael Crenshaw

2
Repos tầm thường trình bày các vấn đề khi ghim, nhưng có, chúng là cách nhanh nhất / dễ nhất để thiết lập một repo chỉ cho một vài gói. Có vẻ ngớ ngẩn khi thiết lập một repo gộp chỉ cho 2 - 3 gói.
Tim Post

George, bạn đã bao giờ có thể làm cho công việc này?
Michael Crenshaw

@mac: Chà .... Tôi chưa có thời gian để thử nó :) Tôi cuối cùng chỉ tải lên mọi thứ lên PPA.
Nathan Osman

40

Chỉ cần thiết lập một kho lưu trữ đơn giản nhưng đã ký trên máy chủ web. Bởi vì hầu hết các hướng dẫn khác có phần lỗi thời hoặc cồng kềnh, tôi sẽ cố gắng sao chép quy trình tại đây. Cấu hình ban đầu cần một chút nỗ lực, nhưng tập lệnh xây dựng đơn giản giúp dễ quản lý. Và bạn chỉ có thể thả vào các *.debtệp mới , sau đó cập nhật hoặc để một công việc định kỳ xử lý việc đó.

Tạo một số khóa ký

Trước tiên, bạn cần tạo một gpgkhóa ký cho các gói và kho lưu trữ của bạn. Biến nó thành (4) khóa ký RSA, không có mật khẩu và cung cấp cho nó một mã duy nhất $KEYNAMEkhi được yêu cầu. (Các ví dụ khác giả sử " dpkg1" là tên khóa.)

 gpg --gen-key
 gpg -a --export-secret-key dpkg1 > secret.gpg
 gpg -a --export dpkg1            > public.gpg

Tôi nói không có mật khẩu, vì máy chủ web của bạn không có khỉ dựng sẵn để gõ liên tục. Và các gói và kho lưu trữ đã ký chỉ nhằm thỏa mãn các khiếu nại của người quản lý cập nhật về điều đó. Chỉ cần tải cả hai khóa lên /apt/thư mục kho lưu trữ mới trên máy chủ web của bạn, nhưng xóa secret.gpgkhóa sau khi khởi tạo.

Cập nhật tập lệnh CGI

Đây là kịch bản shell / CGI cập nhật đơn giản cho nó:

#!/bin/sh
echo Status: 200 Okay
echo Content-Type: text/plain
echo
echo Rebuilding APT repository:

{
  #-- settings
  export GNUPGHOME=/var/www/usr12345/files
  export KEYNAME=dpkg1
  #-- one-time setup
  if [ ! -e "$GNUPGHOME/secring.gpg" ] ; then
     gpg --import -v -v ./secret.gpg
     gpg --import -v -v ./public.gpg
     gpg --list-keys
  fi

  #-- symlink .deb files from adjacent sub-directories
  find .. -name '*.deb' -exec ln -s '{}' . \;

  #-- build Packages file
  apt-ftparchive packages . > Packages
  bzip2 -kf Packages

  #-- signed Release file
  apt-ftparchive release . > Release
  gpg --yes -abs -u $KEYNAME -o Release.gpg Release

} 2>&1

Ba gpgdòng chỉ cần được thực thi một lần, để khởi tạo thiết lập GPG trong một số thư mục $GNUPGHOME(phía trên thư mục gốc). Xóa chỉ secret.gpgsau khi thành công.

Một tính năng độc đáo của tập lệnh shell nhỏ này là nó chấp nhận bất kỳ *.debtệp nào bạn thả vào, nhưng cũng tìm kiếm đệ quy (bắt đầu từ một cấp độ trở lên) cho các tệp khác và liên kết chúng vào. ( Options FollowSymLinksCuối cùng cần .htaccess .)

Bạn có thể thực thi tập lệnh này theo cách thủ công dưới dạng CGI hoặc theo công việc định kỳ. Nhưng ẩn nó, hoặc tốt hơn là di chuyển nó ra khỏi tài liệu gốc.

Bởi vì nó là một kho lưu trữ apt "tầm thường", nó cần có apt-sources.listmục sau :

deb http://example.org/deb/  ./    # Simple signed repo

Điều đó phù hợp với các kho lưu trữ kiến ​​trúc đơn và nếu bạn không mong đợi hàng trăm gói.

Ký gói

Việc ký các gói riêng lẻ của bạn cũng không đáng kể, khi bạn đã thiết lập các khóa gpg của mình:

dpkg-sig -k dpkg1 -s builder *.deb

(Điều này nên được thực hiện trên máy trạm nơi các gói được xây dựng, không phải trên máy chủ web của kho lưu trữ.)

Kho lưu trữ chưa ký

Nếu bạn không cần các gói đã ký, thì bạn có thể cắt tập lệnh cập nhật xuống chỉ:

  dpkg-scanpackages . > Packages
  bzip2 -kf Packages

Người dùng trung bình vẫn có thể sử dụng nhưng cần cờ tùy chỉnh cho apt.sources:

deb [trusted=yes] http://apt.example.org/deb/ ./

Nhưng vui lòng không sử dụng trusted=yescờ theo thói quen cho tất cả mọi thứ hoặc nếu bạn không thực sự chắc chắn về nguồn gốc gói.

Để sử dụng

Đối với người dùng cuối, chỉ cần thả một HEADER.htmlvào thư mục kho lưu trữ. Apaches mod_auto_indexsẽ trả trước ghi chú đó:

<h1>http://example.org/apt/</h1>
<dl>
<dt>Add this repository to /etc/apt/sources.list as:
 <dd><kbd>deb http://example.org/apt/ ./  # example repo</kbd>
<dt>Import verification key with:
 <dd><kbd>wget -q http://http://example.org/apt/public.gpg -O- | sudo apt-key add -</kbd>
</dl>

Lựa chọn thay thế

Có một vài công cụ để tự động hóa quản lý kho lưu trữ những ngày này. Và thậm chí còn có kho lưu trữ trực tuyến và dịch vụ xây dựng gói ( gemfury , packagecloud , bintray , v.v.)

  • Một thay thế khá thuận tiện là prm . Đó là tập lệnh Ruby, xây dựng các repos APT và YUM phức tạp. (Nhưng chúng ta chỉ hy vọng RPM cuối cùng sẽ chết sớm thôi ..) - Nó được cài đặt tốt nhất cho mỗi gem install prm.

  • Và tôi cũng đã viết một kịch bản nhỏ để tự động hóa điều này tương tự: http://apt.include-once.org/apt-phparchive - Xin lưu ý rằng nó không quá mạnh mẽ và được viết bằng PHP (lần đầu tiên, đây là sự trùng hợp), và ban đầu được dùng cho các gói DEB và RPM-over-APT và Phar.

Vì điều này liên quan chặt chẽ với câu hỏi ban đầu, nên cũng có các công cụ để xây dựng các gói Debian dễ dàng hơn. Hơi lỗi thời: EPM . Nhiều thông tin hơn: FPM . Và ngã ba cá nhân của tôi: XPM (cách tiếp cận lười biếng hơn để đóng gói các ứng dụng ngôn ngữ kịch bản.)


1
Làm cách nào để thêm khóa gpg khi tôi muốn sử dụng repo đó?
Bruce Sun

1
Thường là một cái gì đó nhưwget …/public.gpg -O- | apt-key add -
mario

Tôi cần thay đổi điều gì nếu tôi muốn hỗ trợ nhiều kiến ​​trúc?
starbeamrainbowlabs

1
@starbeamrainbowlabs Không hoàn toàn chắc chắn, nhưng tôi nghĩ dpkg-scanpackages -mcó thể đủ. Nó sẽ liệt kê tất cả các kiến ​​trúc trong cùng một tệp Phát hành. Nhưng miễn là mỗi .deb có một tên duy nhất / hoặc được lưu trữ trong các thư mục con riêng biệt (amd64 /, all /) thì nó nên hoạt động. Khác đi cho một trong những công cụ lưu trữ phức tạp hơn.
mario

7

Đúng. Bạn có thể làm được việc này. Bạn chỉ cần sắp xếp các tệp theo đúng cách và tạo các tệp chỉ mục. Nếu bạn đặt cấu trúc thư mục bên trong thư mục gốc của máy chủ web, các gói chỉ có thể được truy cập qua máy chủ web.

Dưới đây là một mô tả chi tiết về cách các tệp cần được tổ chức và cách các tệp chỉ mục được tạo.

Bạn cũng có thể sử dụng một công cụ gọi là reprepro nếu bạn sẵn sàng cài đặt một gói đó. Điều này sẽ làm cho chính quyền thuận tiện hơn một chút.


@txwikinger: Lý do tôi không thể cài đặt các gói là vì máy chủ đang chạy centOS :)
Nathan Osman

Tốt. bạn không cần Bạn có thể tạo mọi thứ trên một máy tính khác và chỉ cần đồng bộ hóa toàn bộ cây với máy chủ centos
txwikinger

Vâng, tôi chắc chắn sẽ thứ hai việc sử dụng reprepro. Nó sẽ làm cho cuộc sống của bạn dễ dàng hơn rất nhiều. Tạo repo trên một máy tính khác thậm chí có thể là một tính năng, trong trường hợp nó cho phép bạn bảo vệ khóa ký của mình tốt hơn.
andol

@andol & @txwikinger: Tôi đang cố gắng nhưng gặp vấn đề. Xin vui lòng xem câu hỏi cập nhật của tôi.
Nathan Osman

Đối với tệp dists của bạn, bạn vẫn sẽ cần ./binary-<specific arch>.
andol


0

Đối với bất kỳ ai phải đối mặt với lỗi này sau khi làm theo câu trả lời của mario:

Unable to find expected entry 'Packages' in Release file (Wrong sources.list entry or malformed file)

làm như sau:

dpkg-scanpackages debs /dev/null > Packages
gzip -k Packages
apt-ftparchive release . > Release
gpg --default-key $KEYID -abs -o Release.gpg Release

Tôi đặt *.debcác tập tin của tôi trong debsthư mục.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.