{"id":1223,"date":"2017-11-02T02:43:22","date_gmt":"2017-11-02T00:43:22","guid":{"rendered":"https:\/\/community.virtono.com\/?p=1223"},"modified":"2020-06-10T16:42:26","modified_gmt":"2020-06-10T13:42:26","slug":"create-your-own-apt-repository-with-reprepro-on-ubuntu","status":"publish","type":"post","link":"https:\/\/www.virtono.com\/community\/tutorial-how-to\/create-your-own-apt-repository-with-reprepro-on-ubuntu\/","title":{"rendered":"Create your own apt repository with reprepro on Ubuntu"},"content":{"rendered":"<p>With\u00a0<b>reprepro<\/b>\u00a0simple own\u00a0<b>package repositories<\/b>\u00a0can be created and managed.\u00a0The tool is located in the Ubuntu repositories and can be used to provide\u00a0<b>your own packages<\/b>\u00a0or to mirror existing repositories.\u00a0This article introduces reprepro and shows the structure of a simple repos on\u00a0<b>Ubuntu Server<\/b>.\u00a0For situations where complete repositories should be mirrored for deployment in their own local network, there are alternatives such as apt-mirror.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_73 counter-hierarchy ez-toc-counter ez-toc-light-blue ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.virtono.com\/community\/tutorial-how-to\/create-your-own-apt-repository-with-reprepro-on-ubuntu\/#installation\" title=\"installation\">installation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.virtono.com\/community\/tutorial-how-to\/create-your-own-apt-repository-with-reprepro-on-ubuntu\/#configuration\" title=\"configuration\">configuration<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.virtono.com\/community\/tutorial-how-to\/create-your-own-apt-repository-with-reprepro-on-ubuntu\/#Include_packages\" title=\"Include packages\">Include packages<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.virtono.com\/community\/tutorial-how-to\/create-your-own-apt-repository-with-reprepro-on-ubuntu\/#Remove_packages\" title=\"Remove packages\">Remove packages<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.virtono.com\/community\/tutorial-how-to\/create-your-own-apt-repository-with-reprepro-on-ubuntu\/#Deployment_of_the_repos_over_Apache\" title=\"Deployment of the repos over Apache\">Deployment of the repos over Apache<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.virtono.com\/community\/tutorial-how-to\/create-your-own-apt-repository-with-reprepro-on-ubuntu\/#Create_a_%E2%80%9Clist%E2%80%9D_file\" title=\"Create a &#8220;.list&#8221; file\">Create a &#8220;.list&#8221; file<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.virtono.com\/community\/tutorial-how-to\/create-your-own-apt-repository-with-reprepro-on-ubuntu\/#Add_the_repos_to_the_user_client\" title=\"Add the repos to the user client\">Add the repos to the user client<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.virtono.com\/community\/tutorial-how-to\/create-your-own-apt-repository-with-reprepro-on-ubuntu\/#Switch_the_repository_Hash_algorithm_to_SHA-2\" title=\"Switch the repository Hash algorithm to SHA-2\">Switch the repository Hash algorithm to SHA-2<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.virtono.com\/community\/tutorial-how-to\/create-your-own-apt-repository-with-reprepro-on-ubuntu\/#Behavior_of_apt_update_when_using_SHA1\" title=\"Behavior of apt update when using SHA1\">Behavior of apt update when using SHA1<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.virtono.com\/community\/tutorial-how-to\/create-your-own-apt-repository-with-reprepro-on-ubuntu\/#Rebuild_InRelease_file_of_the_repos\" title=\"Rebuild InRelease file of the repos\">Rebuild InRelease file of the repos<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.virtono.com\/community\/tutorial-how-to\/create-your-own-apt-repository-with-reprepro-on-ubuntu\/#apt_update_after_updating_to_SHA512\" title=\"apt update after updating to SHA512\">apt update after updating to SHA512<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"installation\"><\/span><span id=\"Installation\" class=\"mw-headline\">installation<\/span><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>reprepro\u00a0can be installed from the repositories under Ubuntu:\u00a0http:\/\/packages.ubuntu.com\/precise\/reprepro<\/p>\n<pre>: ~ $ apt-cache search reprepro\r\nreprepro - Debian package repository producer\r\n: ~ $ sudo apt-get install reprepro\r\n<\/pre>\n<p>Useful information for setting up a repos can be found at the end of the installation<\/p>\n<pre>: ~ $ ls \/ usr \/ share \/ doc \/ reprepro \/\r\nchangelog.Debian.gz copyright examples FAQ.gz manual.html NEWS.gz README README.Debian recovery short-howto.gz TODO\r\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"configuration\"><\/span><span id=\"Konfiguration\" class=\"mw-headline\">configuration<\/span><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>In the following example, a separate user has been created to provide the packages in his home directory.<\/p>\n<pre>: ~ $ pwd\r\n\/ Home \/ repository\r\n<\/pre>\n<p>For the packages a separate directory as well as a directory for the configuration of the repos are created:<\/p>\n<pre>: ~ $ mkdir packages\r\n: ~ $ mkdir packages \/ conf\r\n<\/pre>\n<p>The first configuration step is to create the file\u00a0<code><b>distributions<\/b><\/code>that determines which distribution, architecture, etc. the repository will use.\u00a0Other examples of the file\u00a0<code>distributions<\/code>can also be found at\u00a0(\u00a0<b>wiki.debian.org<\/b>\u00a0) and(\u00a0<b>debian-administration.org<\/b>\u00a0):<\/p>\n<pre>: ~ \/ packages $ vi conf \/ distributions\r\nOrigin: TKmon\r\nLabel: tkmon\r\nCode name: precise\r\nSuite: stable\r\nArchitectures: i386 amd64 source\r\nComponents: main\r\n<\/pre>\n<p>&#8220;Origin&#8221; and &#8220;Label&#8221; are descriptive fields that are included in the release file.\u00a0&#8220;Codename&#8221; is a mandatory field and indicates the unique identifier of the distribution (eg precise, quantal for Ubuntu, wheezy for Debian):<\/p>\n<blockquote><p><i>Codename: This required field is the unique identifier of a distribution and is used as a directory name within dists \/.<\/i><\/p><\/blockquote>\n<p>The parameter &#8220;Suite&#8221; indicates the common parameters like &#8220;stable&#8221;, &#8220;unstable&#8221; or &#8220;testing&#8221;:<\/p>\n<blockquote><p><i>Suite: This optional field is simply copied into the release file.\u00a0In Debian it contains names like stable, testing or unstable.\u00a0To create symlinks from the suite to the codename, use the createsymlinks command of reprepro.<\/i><\/p><\/blockquote>\n<p>&#8220;Architectures&#8221; and &#8220;Components&#8221; indicate the target architecture of the system (32-bit, 64-bit, &#8220;source&#8221; for source code) as well as the components of the distribution (main, contrib, etc.):<\/p>\n<blockquote><p><i>Architectures: This required field lists the binary architectures in this distribution and if it contains source<\/i><\/p><\/blockquote>\n<p>In order not to always have to specify the path of the package folder for the following commands, the following environment variable can be defined (sa\u00a0setting environment variables permanently under Ubuntu\u00a0):<\/p>\n<pre>: ~ $ cat .pam_environment \r\nREPREPRO_BASE_DIR DEFAULT = \/ home \/ repository \/ packages\r\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Include_packages\"><\/span><span id=\"Pakete_einbinden\" class=\"mw-headline\">Include packages<\/span><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>When using the &#8220;Suite&#8221; option in the &#8220;distributions&#8221; file, symbolic links are created from &#8220;stable&#8221; to &#8220;precise&#8221; in the first step:<\/p>\n<pre>: ~ $ reprepro -b \/ home \/ repository \/ packages createsymlinks\r\n: ~ $ tree packages \/\r\npackages \/\r\n\u251c\u2500\u2500 conf\r\n\u251c \u251c\u2500\u2500 distributions\r\n\u2514 \u2514\u2500\u2500 updates\r\n\u251c\u2500\u2500 db\r\n\u2500 \u251c\u2500\u2500 checksums.db\r\n\u251c \u251c\u2500\u2500 contents.cache.db\r\n\u2500 \u251c\u2500\u2500 packages.db\r\n\u251c \u251c\u2500\u2500 references.db\r\n\u2514 \u2514\u2500\u2500 version\r\n\u2514\u2500\u2500 dists\r\n    \u2514\u2500\u2500 stable -&gt; precise\r\n\r\n3 directories, 8 files\r\n<\/pre>\n<p>If, as described above, the environment variable is\u00a0<code>REPREPRO_BASE_DIR DEFAULT<\/code>set, the option &#8220;-b&#8221; can be omitted.\u00a0Now a first package is added to the repository:<\/p>\n<pre>: ~ $ ls tkmon *\r\ntkmon_0.0.1-1_all.deb tkmon_0.0.1-1_amd64.changes tkmon_0.0.1-1.debian.tar.gz tkmon_0.0.1-1.dsc tkmon_0.0.1.orig.tar.gz\r\n: ~ $ reprepro -V include precise tkmon_0.0.1-1_amd64.changes \r\nCreated directory \"\/ home \/ repository \/ packages \/ pool\"\r\nCreated directory \"\/ home \/ repository \/ packages \/ pool \/ main\"\r\nCreated directory \"\/ home \/ repository \/ packages \/ pool \/ main \/ t\"\r\nCreated directory \"\/ home \/ repository \/ packages \/ pool \/ main \/ t \/ tkmon\"\r\nExporting indices ...\r\nCreated directory \"\/ home \/ repository \/ packages \/ dists \/ precise\"\r\nCreated directory \"\/ home \/ repository \/ packages \/ dists \/ precise \/ main\"\r\nCreated directory \"\/ home \/ repository \/ packages \/ dists \/ precise \/ main \/ binary-i386\"\r\nCreated directory \"\/ home \/ repository \/ packages \/ dists \/ precise \/ main \/ binary-amd64\"\r\nCreated directory \"\/ home \/ repository \/ packages \/ dists \/ precise \/ main \/ source\"\r\n<\/pre>\n<p>As a check the contents of the repos are listed:<\/p>\n<pre>: ~ $ reprepro list precise \r\nprecise | main | i386: tkmon 0.0.1-1\r\nprecise | main | amd64: tkmon 0.0.1-1\r\nprecise | main | source: tkmon 0.0.1-1\r\n<\/pre>\n<p>The tree overview shows where the packages are in the directory structure:<\/p>\n<pre>: ~ $ tree packages \/\r\npackages \/\r\n\u251c\u2500\u2500 conf\r\n\u251c \u251c\u2500\u2500 distributions\r\n\u2514 \u2514\u2500\u2500 updates\r\n\u251c\u2500\u2500 db\r\n\u2500 \u251c\u2500\u2500 checksums.db\r\n\u251c \u251c\u2500\u2500 contents.cache.db\r\n\u2500 \u251c\u2500\u2500 packages.db\r\n\u251c \u251c\u2500\u2500 references.db\r\n\u251c \u251c\u2500\u2500 release.caches.db\r\n\u2514 \u2514\u2500\u2500 version\r\n\u251c\u2500\u2500 dists\r\n\u251c \u251c\u2500\u2500 precise\r\n\u251c \u2502 \u251c\u2500\u2500 main\r\n\u251c \u2502 \u251c \u2500\u2500\u2500 binary-amd64\r\n\u251c \u2502 \u251c \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500\r\n\u251c \u2502 \u251c \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500\r\n\u2514 \u2502 \u2502 \u2514 \u2500\u2500\u2500 release\r\n\u251c \u2502 \u251c \u2500\u2500\u2500 binary-i386\r\n\u251c \u2502 \u251c \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500\r\n\u251c \u2502 \u251c \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500\r\n\u2514 \u2502 \u2502 \u2514 \u2500\u2500\u2500 release\r\n\u2514 \u2502 \u2514 \u2514\u2500\u2500 source\r\n\u251c \u2502 \u251c \u251c\u2500\u2500 release\r\n\u2514 \u2502 \u2514 \u2514 \u2500 \u2500 \u2500\r\n\u2514 \u2502 \u2514\u2500\u2500 release\r\n\u2514 \u2514\u2500\u2500 stable -&gt; precise\r\n\u2514\u2500\u2500 pool\r\n    \u2514\u2500\u2500 main\r\n        \u2514\u2500\u2500 t\r\n            \u2514\u2500\u2500 tkmon\r\n                \u251c\u2500\u2500 tkmon_0.0.1-1_all.deb\r\n                \u251c\u2500\u2500 tkmon_0.0.1-1.debian.tar.gz\r\n                \u251c\u2500\u2500 tkmon_0.0.1-1.dsc\r\n                \u2514\u2500\u2500 tkmon_0.0.1.orig.tar.gz\r\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Remove_packages\"><\/span><span id=\"Pakete_entfernen\" class=\"mw-headline\">Remove packages<\/span><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>To remove packages, the\u00a0<code>remove<\/code>command is called.\u00a0The following example also limits the removal to a specific architecture:<\/p>\n<pre>: ~ $ reprepro -A amd64 remove precise tkmon\r\nExporting indices ...\r\n: ~ $ reprepro list precise \r\nprecise | main | i386: tkmon 0.0.1-1\r\nprecise | main | source: tkmon 0.0.1-1\r\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Deployment_of_the_repos_over_Apache\"><\/span><span id=\"Bereitstellung_des_Repos_.C3.BCber_Apache\" class=\"mw-headline\">Deployment of the repos over Apache<\/span><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>There are several ways to distribute the repos via a web server.\u00a0For all variants, the internal configuration files &#8220;\/ conf&#8221; and &#8220;\/ db&#8221; should be protected against unauthorized access.\u00a0The following setup uses &#8220;mod userdir&#8221; for publishing in the home directory of the user &#8220;repository&#8221;.\u00a0In the first step we activate the module &#8220;userdir&#8221;:<\/p>\n<pre>: ~ $ sudo a2enmod userdir\r\n<\/pre>\n<p>For security reasons and because no other users should use &#8220;userdir&#8221;, the userdir configuration file is modified as follows:<\/p>\n<pre>: ~ $ sudo vi \/etc\/apache2\/mods-enabled\/userdir.conf\r\n&lt;IfModule mod_userdir.c&gt;\r\n        UserDir public_html\r\n        UserDir disabled\r\n        UserDir enabled repository\r\n[...]\r\n<\/pre>\n<p>Then we created in the home directory of repository the\u00a0<code>public_html<\/code>folder:<\/p>\n<pre>: ~ $ mkdir public_html\r\n<\/pre>\n<p>A symbolic link provides the packages in\u00a0<code>public_html<\/code>:<\/p>\n<pre>: ~ \/ public_html $ ln -s ..\/packages packages\r\n<\/pre>\n<p>A change in the file permissions prevents access to the configuration folders:<\/p>\n<pre>: ~ \/ public_html \/ packages $ chmod 750 conf \/\r\n: ~ \/ public_html \/ packages $ chmod 750 db \/\r\n<\/pre>\n<h3><span class=\"ez-toc-section\" id=\"Create_a_%E2%80%9Clist%E2%80%9D_file\"><\/span><span id=\"Erstellen_einer_.22.list.22_Datei\" class=\"mw-headline\">Create a &#8220;.list&#8221; file<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The &#8220;.list&#8221; file makes it easy to add the repos to the user:<\/p>\n<pre>: ~ \/ public_html $ vi tkmon.list\r\ndeb http:\/\/192.168.56.102\/~repository\/packages precise main\r\n<\/pre>\n<p>The IP address must be adapted according to the correct hostname!<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Add_the_repos_to_the_user_client\"><\/span><span id=\"Hinzuf.C3.BCgen_des_Repos_am_User-Client\" class=\"mw-headline\">Add the repos to the user client<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>A user can add and use the repo as follows:<\/p>\n<pre>: ~ $ wget http:\/\/192.168.56.102\/~repository\/tkmon.list\r\n: ~ $ sudo mv tkmon.list \/etc\/apt\/sources.list.d\/\r\n: ~ $ sudo apt-get update\r\n: ~ $ apt-cache search tkmon\r\ntkmon - web based configuration for tk-monitoring appliance\r\n<\/pre>\n<p>The user thus has the packages available at the client.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Switch_the_repository_Hash_algorithm_to_SHA-2\"><\/span><span id=\"Hash-Algorithmus_des_Repositorys_auf_SHA-2_umstellen\" class=\"mw-headline\">Switch the repository Hash algorithm to SHA-2<\/span><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>This section shows how to provide your repository with a secure SHA512 hash algorithm.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Behavior_of_apt_update_when_using_SHA1\"><\/span><span id=\"Verhalten_von_apt_update_bei_der_Verwendung_von_SHA1\" class=\"mw-headline\">Behavior of apt update when using SHA1<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>On Ubuntu 16.04, warnings are displayed when calling apt update when using a repository with an outdated and weak SHA1 hash method.<\/p>\n<pre>$ sudo apt update\r\n[...]\r\n<span id=\"Repository_aktualisieren\" class=\"mw-headline\">Update repository<\/span><\/pre>\n<p>This issue can be resolved quickly, as described below.<\/p>\n<ul>\n<li>Log in to your repository server.<\/li>\n<li>Switch to the appropriate user. In this example, the user\u00a0<i>repo<\/i>\u00a0manages the repository.<\/li>\n<li>Open with an editor, eg vim, the gpg.conf file of the repository.\n<ul>\n<li>sudo vi .gnupg \/ gpg.conf<\/li>\n<\/ul>\n<\/li>\n<li>In this file, add the following entries:<\/li>\n<\/ul>\n<pre>default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 BZIP2 ZLIB ZIP Uncompressed\r\ncert-digest-algo SHA512\r\npersonal digest preferences SHA512 SHA384 SHA256\r\n<\/pre>\n<ul>\n<li>Save the file and close the editor.<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Rebuild_InRelease_file_of_the_repos\"><\/span><span id=\"InRelease_Datei_des_Repos_neu_erstellen\" class=\"mw-headline\">Rebuild InRelease file of the repos<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>For existing repos, the InRelase file is then updated.\u00a0This is done by re-exporting the corresponding repositories.<\/p>\n<ul>\n<li>Export of the repository, here with the example of an Ubuntu 14.04 (trusty) repos.\n<ul>\n<li>reprepro export trusty<\/li>\n<li>Specify the GPG key of the repo user for signing.<\/li>\n<\/ul>\n<\/li>\n<li>Check the InRelease file:\n<ul>\n<li>The following output should now appear in the first line of this file:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre>----- BEGIN PGP SIGNED MESSAGE -----\r\nHash: SHA512\r\n[...]\r\n<\/pre>\n<h3><span class=\"ez-toc-section\" id=\"apt_update_after_updating_to_SHA512\"><\/span><span id=\"apt_update_nach_der_Aktualisierung_auf_SHA512\" class=\"mw-headline\">apt update after updating to SHA512<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The warning is no longer displayed, you can\u00a0check\u00a0this by calling\u00a0<i>apt update again<\/i>\u00a0.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>With\u00a0reprepro\u00a0simple own\u00a0package repositories\u00a0can be created and managed.\u00a0The tool is located in the Ubuntu repositories and can be used to provide\u00a0your own packages\u00a0or to mirror existing repositories.\u00a0This article introduces reprepro and shows the structure of a simple repos on\u00a0Ubuntu Server.\u00a0For situations where complete repositories should be mirrored for deployment in their<\/p>\n","protected":false},"author":4,"featured_media":1224,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[3],"tags":[],"class_list":["post-1223","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorial-how-to"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.virtono.com\/community\/wp-content\/uploads\/2017\/11\/deploying-with-super-cow-powers-hosting-your-own-apt-repository-with-reprepro-8-638.jpg?fit=638%2C479&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p7ISfL-jJ","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":3448,"url":"https:\/\/www.virtono.com\/community\/tutorial-how-to\/how-to-install-gitlab-on-linux\/","url_meta":{"origin":1223,"position":0},"title":"How to Install GitLab on Linux","author":"George B.","date":"June 3, 2023","format":false,"excerpt":"We will walk you through the step-by-step process of installing GitLab on Linux. Whether you are an Ubuntu or CentOS user, this guide has got you covered! GitLab is a powerful web-based Git repository manager that provides a complete DevOps platform for managing code repositories, continuous integration\/continuous deployment (CI\/CD), issue\u2026","rel":"","context":"In &quot;Tutorials&quot;","block_context":{"text":"Tutorials","link":"https:\/\/www.virtono.com\/community\/category\/tutorial-how-to\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.virtono.com\/community\/wp-content\/uploads\/2023\/05\/How-to-Install-GitLab-on-Linux.png?fit=600%2C330&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.virtono.com\/community\/wp-content\/uploads\/2023\/05\/How-to-Install-GitLab-on-Linux.png?fit=600%2C330&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.virtono.com\/community\/wp-content\/uploads\/2023\/05\/How-to-Install-GitLab-on-Linux.png?fit=600%2C330&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":2164,"url":"https:\/\/www.virtono.com\/community\/knowledgebase\/manage-linux-package-managers-with-the-shell\/","url_meta":{"origin":1223,"position":1},"title":"Manage Linux package managers with the shell","author":"Shreyash Sharma","date":"December 19, 2020","format":false,"excerpt":"Package management via the Advanced Package Tool, or APT for short, is part of the recipe for success of Debian and thus also of offshoots such as Ubuntu.\u00a0There are plenty of graphical interfaces for this, but APT can only take advantage of all its advantages in the shell. Installing and\u2026","rel":"","context":"In &quot;Knowledgebase&quot;","block_context":{"text":"Knowledgebase","link":"https:\/\/www.virtono.com\/community\/category\/knowledgebase\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.virtono.com\/community\/wp-content\/uploads\/2020\/12\/installing-linux-apps-package.png?fit=640%2C412&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.virtono.com\/community\/wp-content\/uploads\/2020\/12\/installing-linux-apps-package.png?fit=640%2C412&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.virtono.com\/community\/wp-content\/uploads\/2020\/12\/installing-linux-apps-package.png?fit=640%2C412&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":3897,"url":"https:\/\/www.virtono.com\/community\/tutorial-how-to\/how-to-install-neo4j-on-ubuntu-22-04\/","url_meta":{"origin":1223,"position":2},"title":"How to install Neo4j on Ubuntu 22.04","author":"George B.","date":"September 19, 2023","format":false,"excerpt":"This article will guide you through the process of installing Neo4j on Ubuntu 22.04. We'll break down each step, ensuring you have a smooth and successful installation. When it comes to graph databases, Neo4j stands out as a leading platform, providing a reliable and effective way to manage and query\u2026","rel":"","context":"In &quot;Tutorials&quot;","block_context":{"text":"Tutorials","link":"https:\/\/www.virtono.com\/community\/category\/tutorial-how-to\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.virtono.com\/community\/wp-content\/uploads\/2023\/09\/How-to-install-Neo4j-on-Ubuntu-22.04.png?fit=360%2C240&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":3870,"url":"https:\/\/www.virtono.com\/community\/tutorial-how-to\/how-to-install-couchdb-on-ubuntu-22-04\/","url_meta":{"origin":1223,"position":3},"title":"How to Install CouchDB on Ubuntu 22.04","author":"George B.","date":"September 14, 2023","format":false,"excerpt":"In this article, we will provide a detailed guide on how to install CouchDB on Ubuntu 22.04. Data management is now one of the most important aspects of any business, especially with the advent of the digital age. This is where database management systems like CouchDB are useful. The Apache\u2026","rel":"","context":"In &quot;Tutorials&quot;","block_context":{"text":"Tutorials","link":"https:\/\/www.virtono.com\/community\/category\/tutorial-how-to\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.virtono.com\/community\/wp-content\/uploads\/2023\/09\/How-to-Install-CouchDB-on-Ubuntu-22-04.png?fit=360%2C240&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":3728,"url":"https:\/\/www.virtono.com\/community\/tutorial-how-to\/how-to-use-influxdb-with-python-on-ubuntu-22-04\/","url_meta":{"origin":1223,"position":4},"title":"How to use InfluxDB with Python on Ubuntu 22.04","author":"George B.","date":"August 9, 2023","format":false,"excerpt":"This tutorial will walk you through installing and configuring InfluxDB with Python on a VPS running Ubuntu 22.04. InfluxDB is an open-source time-series database (TSDB) developed by InfluxData. It's written in Go and optimized for fast, high-availability storage and retrieval of time series data in fields such as operations monitoring,\u2026","rel":"","context":"In &quot;Tutorials&quot;","block_context":{"text":"Tutorials","link":"https:\/\/www.virtono.com\/community\/category\/tutorial-how-to\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.virtono.com\/community\/wp-content\/uploads\/2023\/08\/How-to-use-InfluxDB-with-Python-on-Ubuntu-22-04.png?fit=360%2C240&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":3608,"url":"https:\/\/www.virtono.com\/community\/tutorial-how-to\/how-to-install-gitlab-ce-with-docker-on-ubuntu-22-04\/","url_meta":{"origin":1223,"position":5},"title":"How to Install GitLab CE with Docker on Ubuntu 22.04","author":"George B.","date":"June 24, 2023","format":false,"excerpt":"Introduction You can quickly set up your own GitLab instance, manage your repositories, and take advantage of its powerful features by installing GitLab CE with Docker. We'll walk you through the steps of installing GitLab CE with Docker on Ubuntu 22.04, ensuring a smooth installation and configuration. We'll also go\u2026","rel":"","context":"In &quot;Tutorials&quot;","block_context":{"text":"Tutorials","link":"https:\/\/www.virtono.com\/community\/category\/tutorial-how-to\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.virtono.com\/community\/wp-content\/uploads\/2023\/06\/How-to-Install-GitLab-CE-with-Docker-on-Ubuntu-22.04.png?fit=600%2C330&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.virtono.com\/community\/wp-content\/uploads\/2023\/06\/How-to-Install-GitLab-CE-with-Docker-on-Ubuntu-22.04.png?fit=600%2C330&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.virtono.com\/community\/wp-content\/uploads\/2023\/06\/How-to-Install-GitLab-CE-with-Docker-on-Ubuntu-22.04.png?fit=600%2C330&ssl=1&resize=525%2C300 1.5x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.virtono.com\/community\/wp-json\/wp\/v2\/posts\/1223","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.virtono.com\/community\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.virtono.com\/community\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.virtono.com\/community\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.virtono.com\/community\/wp-json\/wp\/v2\/comments?post=1223"}],"version-history":[{"count":1,"href":"https:\/\/www.virtono.com\/community\/wp-json\/wp\/v2\/posts\/1223\/revisions"}],"predecessor-version":[{"id":1225,"href":"https:\/\/www.virtono.com\/community\/wp-json\/wp\/v2\/posts\/1223\/revisions\/1225"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.virtono.com\/community\/wp-json\/wp\/v2\/media\/1224"}],"wp:attachment":[{"href":"https:\/\/www.virtono.com\/community\/wp-json\/wp\/v2\/media?parent=1223"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.virtono.com\/community\/wp-json\/wp\/v2\/categories?post=1223"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.virtono.com\/community\/wp-json\/wp\/v2\/tags?post=1223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}