เพียงแค่ตั้งค่าพื้นที่เก็บข้อมูลที่เรียบง่าย แต่มีลายเซ็นบนเว็บเซิร์ฟเวอร์ เนื่องจากบทช่วยสอนอื่น ๆ ส่วนใหญ่ค่อนข้างล้าสมัยหรือยุ่งยากฉันจะพยายามทำซ้ำขั้นตอนที่นี่ การกำหนดค่าเริ่มต้นใช้ความพยายามเล็กน้อย แต่สคริปต์บิลด์ที่เรียบง่ายช่วยให้จัดการได้ง่าย และคุณสามารถปล่อย*.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 (วิธีการสันหลังยาวมากขึ้นสำหรับแอพบรรจุภาษาสคริปต์)