How to Setup Local HTTP Yum Repository on CentOS 7

A software repository (“repo” in short) is a central file storage location to keep and maintain software packages, from which users can retrieve packages and install them on their computers.

Repositories are often stored on servers on a network for example an internet, which can be accessed by multiple users. However, you can create and configure a local repository on your computer and access it as a single user or allow access to other machines on your LAN (Local Area Network).

One advantage of setting up a local repository is that you don’t need an internet connection to install software packages.

YUM (Yellowdog Updater Modified) is a widely used package management tool for RPM (RedHat Package Manager) based on Linux systems, which makes software installation easy on Red Hat/CentOS Linux.

In this article, we will explain how to set up a local YUM repository over HTTP (Nginx) web server on CentOS 7 VPS and also show you how to find and install software packages on client CentOS 7 machines.

Our Testing Environment

Yum HTTP Repository Server:	CentOS 7 []
Client Machine:		CentOS 7 []

Step 1: Install Nginx Web Server

1. First start by installing the Nginx HTTP server from the EPEL repository using the YUM package manager as follows.

# yum install epel-release
# yum install nginx 

2. Once you have installed the Nginx web server, you can start it for the first time and enable it to start automatically at system boot.

# systemctl start nginx
# systemctl enable nginx
# systemctl status nginx

3. Next, you need to open port 80 and 443 to allow web traffic to Nginx service, update the system firewall rules to permit inbound packets on HTTP and HTTPS using the commands below.

# firewall-cmd --zone=public --permanent --add-service=http
# firewall-cmd --zone=public --permanent --add-service=https
# firewall-cmd --reload

4. Now you can confirm that your Nginx server is up and running, using the following URL; if you see the default Nginx web page, all is well.

Nginx Default Page
Nginx Default Page

Step 2: Create a Yum Local Repository

5. In this step, you need to install the required packages for creating, configuring, and managing your local repository.

# yum install createrepo  yum-utils

6. Next, create the necessary directories (yum repositories) that will store packages and any related information.

# mkdir -p /var/www/html/repos/{base,centosplus,extras,updates}

7. Then use the reposync tool to synchronize CentOS YUM repositories to the local directories as shown.

# reposync -g -l -d -m --repoid=base --newest-only --download-metadata --download_path=/var/www/html/repos/
# reposync -g -l -d -m --repoid=centosplus --newest-only --download-metadata --download_path=/var/www/html/repos/
# reposync -g -l -d -m --repoid=extras --newest-only --download-metadata --download_path=/var/www/html/repos/
# reposync -g -l -d -m --repoid=updates --newest-only --download-metadata --download_path=/var/www/html/repos/
Sample Output
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base:
 * epel:
 * extras:
 * updates:
base/7/x86_64/group                                                    | 891 kB  00:00:02     
No Presto metadata available for base
(1/9911): 389-ds-base-snmp-                   | 163 kB  00:00:02     
(2/9911): 389-ds-base-devel-                  | 267 kB  00:00:02     
(3/9911): ElectricFence-2.2.2-39.el7.i686.rpm                          |  35 kB  00:00:00     
(4/9911): ElectricFence-2.2.2-39.el7.x86_64.rpm                        |  35 kB  00:00:00     
(5/9911): 389-ds-base-libs-                   | 695 kB  00:00:04     
(6/9911): GConf2-devel-3.2.6-8.el7.i686.rpm                            | 110 kB  00:00:00     
(7/9911): GConf2-devel-3.2.6-8.el7.x86_64.rpm                          | 110 kB  00:00:00     
(8/9911): GConf2-3.2.6-8.el7.i686.rpm                                  | 1.0 MB  00:00:06     

In the above commands, the option:

  • -g – enables removing of packages that fail GPG signature checking after downloading.
  • -l – enables yum plugin support.
  • -d – enables deleting of local packages no longer present in the repository.
  • -m – enables downloading of comps.xml files.
  • --repoid – specifies the repository ID.
  • --newest-only – tell reposync to only pull the latest version of each package in the repos.
  • --download-metadata – enables downloading all the non-default metadata.
  • --download_path – specifies the path to download packages.

8. Next, check the contents of your local directories to ensure that all the packages have been synchronized locally.

# ls -l /var/www/html/repos/base/
# ls -l /var/www/html/repos/base/Packages/
# ls -l /var/www/html/repos/centosplus/
# ls -l /var/www/html/repos/centosplus/Packages/
# ls -l /var/www/html/repos/extras/
# ls -l /var/www/html/repos/extras/Packages/
# ls -l /var/www/html/repos/updates/
# ls -l /var/www/html/repos/updates/Packages/

9. Now create a new repodata for the local repositories by running the following commands, where the flag -g is used to update the package group information using the specified .xml file.

# createrepo -g comps.xml /var/www/html/repos/base/  
# createrepo -g comps.xml /var/www/html/repos/centosplus/	
# createrepo -g comps.xml /var/www/html/repos/extras/  
# createrepo -g comps.xml /var/www/html/repos/updates/  

10. To enable viewing of repositories and packages in them, via a web browser, create an Nginx server block that points to the root of your repositories as shown.

# vim /etc/nginx/conf.d/repos.conf 

Add the following configuration ot file repos.conf.

server {
        listen   80;
        server_name  repos.test.lab;	#change  test.lab to your real domain 
        root   /var/www/html/repos;
        location / {
                index  index.php index.html index.htm;
                autoindex on;	#enable listing of directory index

Save the file and close it.

11. Then restart your Nginx server and view the repositories from a web browser using the following URL.

View Local Yum Repositories
View Local Yum Repositories

Step 3: Create a Cron Job to Synchronize and Create Repositories

12. Next, add a cron job that will automatically synchronize your local repos with the official CentOS repos to grab the updates and security patches.

# vim /etc/cron.daily/update-localrepos

Add these commands in the script.

##specify all local repositories in a single variable
LOCAL_REPOS=”base centosplus extras updates”
##a loop to update repos one at a time 
for REPO in ${LOCAL_REPOS}; do
reposync -g -l -d -m --repoid=$REPO --newest-only --download-metadata --download_path=/var/www/html/repos/
createrepo -g comps.xml /var/www/html/repos/$REPO/  

Save the script and close it and set the appropriate permissions on it.

# chmod 755 /etc/cron.daily/update-localrepos

Step 4: Setup Local Yum Repository on Client Machines

13. Now on your CentOS client machines, add your local repos to the YUM configuration.

# vim /etc/yum.repos.d/local-repos.repo

Copy and paste the configuration below in the file local-repos.repo (make changes where necessary).

name=CentOS Base

name=CentOS CentOSPlus

name=CentOS Extras

name=CentOS Updates

Save the file and start using your local YUM mirrors.

14. Next, run the following command to view your local repos in the list of available YUM repos, on the client machines.

#  yum repolist
# yum repolist all
View Local Yum Repositories on Client
View Local Yum Repositories on Client

That’s all! In this article, we have explained how to set up a local YUM repository on CentOS 7. We hope that you found this guide useful. If you have any questions, or any other thoughts to share, use the comment form below.

If you read this far, tweet to the author to show them you care. Tweet a thanks
Aaron Kili
Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge.

Each tutorial at TecMint is created by a team of experienced Linux system administrators so that it meets our high-quality standards.

Join the TecMint Weekly Newsletter (More Than 156,129 Linux Enthusiasts Have Subscribed)
Was this article helpful? Please add a comment or buy me a coffee to show your appreciation.

54 thoughts on “How to Setup Local HTTP Yum Repository on CentOS 7”

  1. Problem 1. yum repo responding with [Errno 14] HTTP Error 403 – Forbidden on the client when you run the yum repolist


    You need to disable SELinux or set it to permissive mode on the repo server.

    # setenforce permissive
    # getenforce //to verify it is set to permissive.

    Problem 2.

    # createrepo -g comps.xml /var/www/html/repos/centosplus/

    Error: group file /var/www/html/repos/centosplus/comps.xml cannot be found.

    solution: The problem was with the syntax of the command, so the correct version syntax is:

    # createrepo /var/www/html/repos/centosplus/ -g comps.xml

  2. Hi,

    [[email protected] yum.repos.d]$ yum grouplist
    Depot local Rocky Linux 9 BaseOS 46 MB/s | 1.6 MB 00:00
    Depot local Rocky Linux 9 Extras 352 kB/s | 3.5 kB 00:00
    Depot local Rocky Linux 9 Appstream 53 MB/s | 5.7 MB 00:00
    Depot local Rocky Linux 9 Epel 64 MB/s | 8.2 MB 00:00
    Error: No group data available for configured repositories.

  3. Had a problem with nginx reporting ‘[Errno 14] HTTP Error 403 – Forbidden’ on the clients.

    Confirmed all file access permissions correct.

    Resolved by running:

    # chcon -Rt httpd_sys_content_t /var/www/html/repos/

    and restarting nginx.

    It’s an SELinux permissions problem.

  4. Hi,

    When I install some packages like nano، see an error. Please help me.

    Last metadata expiration check: 0:04:37 ago on Sun 22 Nov 2020 11:33:51 AM +0330.
    Problem: cannot install both ncurses-libs-5.9-14.20130511.el7_4.x86_64 and ncurses-libs-6.1-7.20180224.el8.x86_64
    – package nano-2.3.1-10.el7.x86_64 requires, but none of the providers can be installed
    – package nano-2.3.1-10.el7.x86_64 requires, but none of the providers can be installed
    – package htop-2.2.0-6.el8.x86_64 requires, but none of the providers can be installed
    – package htop-2.2.0-6.el8.x86_64 requires, but none of the providers can be installed
    – conflicting requests
    – problem with installed package htop-2.2.0-6.el8.x86_64
    (try to add ‘–allowerasing’ to command line to replace conflicting packages or ‘–skip-broken’ to skip uninstallable packages or ‘–nobest’ to use not only best candidate packages)


Got something to say? Join the discussion.

Have a question or suggestion? Please leave a comment to start the discussion. Please keep in mind that all comments are moderated and your email address will NOT be published.