วิธีตั้งค่าที่เก็บ APT


52

ฉันต้องการตั้งค่าพื้นที่เก็บข้อมูล APT บนเซิร์ฟเวอร์ที่จะให้แพคเกจสองสาม

มีวิธีการตั้งค่าโดยไม่ต้องติดตั้งซอฟต์แวร์ใด ๆ บนเซิร์ฟเวอร์หรือไม่?

ไฟล์จะต้องมีการจัดระเบียบอย่างไร


แก้ไข:ฉันต้องทำอะไรผิดพลาด ... ใครบางคนได้โปรดช่วยฉันหน่อยได้ไหม ฉันมีที่เก็บข้อมูลที่http://quickmediasolutions.com/apt/dists

ฉันไม่แน่ใจว่าอยู่ที่ไหนหรืออะไร แต่มีบางอย่างผิดพลาด ปัจจุบันฉันมีเพียงหนึ่งแพ็คเกจเท่านั้นและมันมีไว้สำหรับสถาปัตยกรรมทั้งหมด

นี่คือสิ่งที่ถูกเพิ่มเข้าไปในของฉัน/etc/apt/sources.list:

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

คุณสามารถแก้ไขและเพิ่มใบอนุญาตประเภทใดที่แอปพลิเคชันที่คุณดาวน์โหลดอยู่ นี่สำหรับการใช้งานส่วนตัวหรือคุณวางแผนที่จะแจกจ่ายหรือไม่?
Jorge Castro

@Jorge: คุณหมายถึงอะไร แอปพลิเคชันอะไร
นาธานออสมัน

1
ฉันพยายามตรวจสอบว่าแพ็คเกจเป็น OSS คุณสามารถใช้ Launchpad ได้หรือไม่
Jorge Castro

@Jorge: ไม่มันไม่ใช่ OSS (อันที่จริงแล้วมันเป็นแอพเดียวที่ฉันเขียนไม่ได้)
นาธานออสมัน

คำตอบ:


26

การตั้งค่าพื้นที่เก็บข้อมูลขนาดเล็กนั้นง่ายมากโดยใช้ dpkg-scanpackages หน้านี้อธิบายวิธีตั้งค่า repo เล็กน้อยและหน้านี้อธิบายวิธีใช้ (เลื่อนลงไปที่ตัวอย่าง 4)


มีปัญหาเล็กน้อยในการทำให้มันใช้งานได้ โปรดดูการอัปเดตคำถามของฉัน
Nathan Osman

1
ดูเหมือนว่าคุณกำลังพยายามตั้งค่า repo "อัตโนมัติ" สำหรับแพ็คเกจหนึ่ง (หรือหลาย ๆ แพ็คเกจ) คุณจะรู้สึกดีขึ้นมากเมื่อใช้ repo เล็กน้อย ลองย้าย Packages.gz และตราสารหนี้ทุกประเภททุกทางของคุณขึ้นไปquickmediasolutions.com/apt/binary deb http://quickmediasolutions.com/apt binary/แล้วแหล่งที่มาของคุณจะ
Michael Crenshaw

2
repos เล็กน้อยนำเสนอปัญหาเมื่อตรึง แต่ใช่พวกเขาเป็นวิธีที่เร็วที่สุด / ง่ายที่สุดในการตั้งค่า repo เพียงไม่กี่แพคเกจ มันดูเหมือนโง่ที่จะตั้งค่า repo ที่รวมไว้เพียง 2 - 3 แพ็คเกจ
Tim Post

จอร์จคุณเคยสามารถทำงานนี้ได้หรือไม่?
Michael Crenshaw

@mac: ดี .... ฉันยังไม่มีเวลาลองเลย :) ฉันเพิ่งจะอัพโหลดทุกอย่างไปยัง PPA
นาธานออสมัน

40

เพียงแค่ตั้งค่าพื้นที่เก็บข้อมูลที่เรียบง่าย แต่มีลายเซ็นบนเว็บเซิร์ฟเวอร์ เนื่องจากบทช่วยสอนอื่น ๆ ส่วนใหญ่ค่อนข้างล้าสมัยหรือยุ่งยากฉันจะพยายามทำซ้ำขั้นตอนที่นี่ การกำหนดค่าเริ่มต้นใช้ความพยายามเล็กน้อย แต่สคริปต์บิลด์ที่เรียบง่ายช่วยให้จัดการได้ง่าย และคุณสามารถปล่อย*.debไฟล์ใหม่จากนั้นอัปเดตหรือปล่อยให้ cron job จัดการได้

สร้างคีย์การเซ็นชื่อ

ก่อนอื่นคุณต้องสร้างgpgรหัสลงนามสำหรับแพ็คเกจและพื้นที่เก็บข้อมูลของคุณ ทำให้เป็นคีย์การลงชื่อ RSA (4) ไม่มีรหัสผ่านและให้เป็นรหัสที่ไม่ซ้ำกัน$KEYNAMEเมื่อถูกถาม (ตัวอย่างเพิ่มเติมถือว่า " dpkg1" เป็นชื่อคีย์)

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

ฉันบอกว่าไม่มีรหัสผ่านเพราะเว็บเซิร์ฟเวอร์ของคุณไม่มีลิงในตัวที่จะพิมพ์ซ้ำ และแพ็คเกจและพื้นที่เก็บข้อมูลที่ลงนามนั้นมีไว้เพื่อสนองต่อข้อร้องเรียนของผู้จัดการอัพเดตเท่านั้น เพียงอัปโหลดคีย์ทั้งสองไปยัง/apt/ไดเรกทอรีที่เก็บใหม่บนเว็บเซิร์ฟเวอร์ของคุณ แต่ลบsecret.gpgคีย์หลังจากการเริ่มต้น

อัปเดตสคริปต์ CGI

นี่เป็นสคริปต์การปรับปรุงเชลล์ / CGI แบบง่าย ๆ :

#!/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

สามgpgบรรทัดจะต้องดำเนินการเพียงครั้งเดียวเพื่อเริ่มต้นการตั้งค่า GPG ในบางไดเรกทอรี$GNUPGHOME(เหนือรากเอกสาร) ลบเฉพาะsecret.gpgหลังจากที่ประสบความสำเร็จ

คุณลักษณะที่ไม่ซ้ำใครของเชลล์สคริปต์ขนาดเล็กนี้คือมันยอมรับ*.debไฟล์ใด ๆที่คุณดร็อป แต่ยังค้นหาแบบเรียกซ้ำ (เริ่มจากระดับหนึ่งขึ้นไป) สำหรับผู้อื่นและเชื่อมโยงเข้าด้วยOptions FollowSymLinksกัน

คุณสามารถรันสคริปต์นี้ด้วยตนเองเป็น CGI หรือต่อ cron-job แต่ซ่อนหรือดีกว่ายังย้ายออกจากรูทเอกสาร

เนื่องจากเป็นพื้นที่เก็บข้อมูล apt "trivial" จึงต้องการapt-sources.listรายการต่อไปนี้:

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

เหมาะสำหรับที่เก็บสถาปัตยกรรมเดียวและหากคุณไม่คาดหวังหลายร้อยแพ็คเกจ

ลงนามแพ็คเกจ

การลงนามในแพ็คเกจของคุณนั้นสำคัญมากเมื่อคุณตั้งค่าคีย์ gpg ของคุณแล้ว:

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

(สิ่งนี้ควรทำบนเวิร์กสเตชันที่แพ็คเกจถูกสร้างขึ้นไม่ใช่บนเว็บเซิร์ฟเวอร์ที่เก็บ)

พื้นที่เก็บข้อมูลที่ไม่ได้ลงนาม

หากคุณไม่ต้องการแพ็คเกจที่เซ็นชื่อคุณสามารถเฉือนสคริปต์อัปเดตเป็นเพียง:

  dpkg-scanpackages . > Packages
  bzip2 -kf Packages

ซึ่งผู้ใช้ทั่วไปยังคงสามารถใช้งานได้ แต่ต้องมีการตั้งค่าสถานะที่กำหนดเองสำหรับapt.sources:

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

แต่โปรดอย่าใช้trusted=yesธงเป็นประจำสำหรับทุกสิ่งหรือถ้าคุณไม่แน่ใจเกี่ยวกับที่มาของแพคเกจ

สำหรับการใช้งาน

สำหรับผู้ใช้เพียงวางHEADER.htmlลงในไดเรกทอรีพื้นที่เก็บข้อมูล อาปาเช่mod_auto_indexจะต่อท้ายโน้ตนั้น:

<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>

ทางเลือก

มีเครื่องมือบางอย่างที่จะทำให้การจัดการพื้นที่เก็บข้อมูลเป็นอัตโนมัติในวันนี้ และยังมีที่เก็บออนไลน์และที่เก็บบริการแพ็คเกจ ( gemfury , packagecloud , bintrayเป็นต้น)

  • ทางเลือกที่สะดวกค่อนข้างเป็นPRM มันเป็นสคริปต์ Ruby ซึ่งสร้าง repos APT และ YUM ที่ซับซ้อน ( แต่ขอแค่หวังว่า RPM ตายในที่สุดออกมาบางครั้งเร็ว ๆ นี้ .. ) - gem install prmมันมีการติดตั้งที่ดีที่สุดต่อ

  • และฉันยังได้เขียนสคริปต์ขนาดเล็กเพื่อทำให้สิ่งนี้คล้ายกันโดยอัตโนมัติ: http://apt.include-once.org/apt-phparchive - โปรดอย่าว่ามันไม่ได้มีประสิทธิภาพและเขียนด้วยภาษา PHP มากเกินไป (สำหรับครั้งนี้เป็นเรื่องบังเอิญ) และเดิมมีไว้สำหรับ DEB และการรวม RPM-over-APT และ Phar

เนื่องจากสิ่งนี้มีความเกี่ยวข้องอย่างใกล้ชิดกับคำถามดั้งเดิมจึงมีเครื่องมือในการสร้างแพ็คเกจ Debian ได้ง่ายขึ้น ล้าสมัยค่อนข้าง: EPM contempoary มากขึ้น: FPM และทางแยกส่วนตัวของฉัน: XPM (วิธีการสันหลังยาวมากขึ้นสำหรับแอพบรรจุภาษาสคริปต์)


1
ฉันจะเพิ่มปุ่ม gpg ได้อย่างไรเมื่อฉันต้องการใช้ repo นั้น
บรูซซัน

1
โดยปกติแล้วจะเป็นเช่นwget …/public.gpg -O- | apt-key add -
mario

ฉันต้องเปลี่ยนอะไรถ้าฉันต้องการสนับสนุนสถาปัตยกรรมหลาย ๆ
starbeamrainbowlabs

1
@ starbeamrainbowlabs ไม่แน่ใจทั้งหมด แต่ฉันคิดว่าdpkg-scanpackages -mอาจพอเพียง มันจะแสดงรายการสถาปัตยกรรมทั้งหมดในไฟล์ Release เดียวกัน แต่ตราบใดที่แต่ละ. deb มีชื่อที่ไม่ซ้ำกัน / หรือถูกเก็บไว้ในตำบลที่แตกต่างกัน (amd64 /, ทั้งหมด /) มันควรจะทำงานออก ไปเลยสำหรับหนึ่งในเครื่องมือที่เก็บที่ซับซ้อนมากขึ้น
มาริโอ

7

ใช่. คุณสามารถทำได้ คุณเพียงแค่ต้องจัดระเบียบไฟล์อย่างถูกวิธีและสร้างไฟล์ดัชนี หากคุณวางโครงสร้างไดเรกทอรีไว้ในรูทเอกสารของเว็บเซิร์ฟเวอร์ของคุณแพคเกจสามารถเข้าถึงได้ผ่านเว็บเซิร์ฟเวอร์

นี่คือคำอธิบายโดยละเอียดเกี่ยวกับวิธีจัดระเบียบไฟล์และวิธีสร้างไฟล์ดัชนี

นอกจากนี้คุณยังสามารถใช้เครื่องมือที่เรียกว่าrepreproถ้าคุณเต็มใจที่จะติดตั้งแพคเกจนั้น สิ่งนี้จะทำให้การบริหารสะดวกขึ้นเล็กน้อย


@txwikinger: เหตุผลที่ฉันไม่สามารถติดตั้งแพคเกจเป็นเพราะเซิร์ฟเวอร์ทำงาน CentOS :)
นาธานออสมัน

ดี. คุณไม่จำเป็นต้อง คุณสามารถสร้างทุกสิ่งบนคอมพิวเตอร์เครื่องอื่นและเพียงแค่
ซิงค์

ใช่ฉันจะใช้ reprepro อย่างที่สองแน่นอน มันจะทำให้ชีวิตของคุณง่ายขึ้นมาก การสร้าง repo บนคอมพิวเตอร์เครื่องอื่นอาจเป็นคุณสมบัติในกรณีที่ช่วยให้คุณสามารถป้องกันการเซ็นชื่อได้ดีขึ้น
andol

@andol & @txwikinger: ฉันพยายาม แต่ประสบปัญหา โปรดดูคำถามที่อัปเดตของฉัน
Nathan Osman

สำหรับไฟล์ dists ของคุณคุณยังจะต้อง. / ไบนารี - เฉพาะโค้ง>
andol


0

สำหรับทุกคนที่พบข้อผิดพลาดหลังจากทำตามคำตอบของมาริโอ:

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

ทำดังต่อไปนี้:

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

ฉันวาง*.debไฟล์ไว้ในdebsโฟลเดอร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.