diff --git a/app/models/packages/debian.rb b/app/models/packages/debian.rb
index f7f7f9f95e9afc9ea6de23c893edec6c4fde4ee0..e20f1b8244abe824c59168db7b4699ecd4b9b2de 100644
--- a/app/models/packages/debian.rb
+++ b/app/models/packages/debian.rb
@@ -2,6 +2,10 @@
 
 module Packages
   module Debian
+    DISTRIBUTION_REGEX = %r{[a-z0-9][a-z0-9.-]*}i.freeze
+    COMPONENT_REGEX = DISTRIBUTION_REGEX.freeze
+    ARCHITECTURE_REGEX = %r{[a-z0-9][-a-z0-9]*}.freeze
+
     def self.table_name_prefix
       'packages_debian_'
     end
diff --git a/lib/api/concerns/packages/debian_package_endpoints.rb b/lib/api/concerns/packages/debian_package_endpoints.rb
index 98459b59bb1a84438ba8197f7d8c51169ce6bce6..7740ba6bfa64f743975573ba64e4469db3255bf8 100644
--- a/lib/api/concerns/packages/debian_package_endpoints.rb
+++ b/lib/api/concerns/packages/debian_package_endpoints.rb
@@ -6,20 +6,17 @@ module Packages
       module DebianPackageEndpoints
         extend ActiveSupport::Concern
 
-        DISTRIBUTION_REGEX = %r{[a-zA-Z0-9][a-zA-Z0-9.-]*}.freeze
-        COMPONENT_REGEX = %r{[a-z-]+}.freeze
-        ARCHITECTURE_REGEX = %r{[a-z][a-z0-9]*}.freeze
         LETTER_REGEX = %r{(lib)?[a-z0-9]}.freeze
         PACKAGE_REGEX = API::NO_SLASH_URL_PART_REGEX
         DISTRIBUTION_REQUIREMENTS = {
-          distribution: DISTRIBUTION_REGEX
+          distribution: ::Packages::Debian::DISTRIBUTION_REGEX
         }.freeze
         COMPONENT_ARCHITECTURE_REQUIREMENTS = {
-          component: COMPONENT_REGEX,
-          architecture: ARCHITECTURE_REGEX
+          component: ::Packages::Debian::COMPONENT_REGEX,
+          architecture: ::Packages::Debian::ARCHITECTURE_REGEX
         }.freeze
         COMPONENT_LETTER_SOURCE_PACKAGE_REQUIREMENTS = {
-          component: COMPONENT_REGEX,
+          component: ::Packages::Debian::COMPONENT_REGEX,
           letter: LETTER_REGEX,
           source_package: PACKAGE_REGEX
         }.freeze
@@ -100,8 +97,20 @@ def present_release_file
 
                 route_setting :authentication, authenticate_non_public: true
                 get 'Packages' do
-                  # https://gitlab.com/gitlab-org/gitlab/-/issues/5835#note_414103286
-                  'TODO Packages'
+                  relation = "::Packages::Debian::#{project_or_group.class.name}ComponentFile".constantize
+
+                  component_file = relation
+                    .preload_distribution
+                    .with_container(project_or_group)
+                    .with_codename_or_suite(params[:distribution])
+                    .with_component_name(params[:component])
+                    .with_file_type(:packages)
+                    .with_architecture_name(params[:architecture])
+                    .with_compression_type(nil)
+                    .order_created_asc
+                    .last!
+
+                  present_carrierwave_file!(component_file.file)
                 end
               end
             end
diff --git a/lib/gitlab/regex.rb b/lib/gitlab/regex.rb
index a31f574fad2fc449e65c60cf4b3b7bd4b4c7c645..0bd2ac180c373743fb43fdf6e201466fccbc63a3 100644
--- a/lib/gitlab/regex.rb
+++ b/lib/gitlab/regex.rb
@@ -118,15 +118,15 @@ def debian_version_regex
       def debian_architecture_regex
         # See official parser: https://git.dpkg.org/cgit/dpkg/dpkg.git/tree/lib/dpkg/arch.c?id=9e0c88ec09475f4d1addde9cdba1ad7849720356#n43
         # But we limit to lower case
-        @debian_architecture_regex ||= %r{\A[a-z0-9][-a-z0-9]*\z}.freeze
+        @debian_architecture_regex ||= %r{\A#{::Packages::Debian::ARCHITECTURE_REGEX}\z}.freeze
       end
 
       def debian_distribution_regex
-        @debian_distribution_regex ||= %r{\A[a-z0-9][a-z0-9\.-]*\z}i.freeze
+        @debian_distribution_regex ||= %r{\A#{::Packages::Debian::DISTRIBUTION_REGEX}\z}i.freeze
       end
 
       def debian_component_regex
-        @debian_component_regex ||= %r{#{debian_distribution_regex}}.freeze
+        @debian_component_regex ||= %r{\A#{::Packages::Debian::COMPONENT_REGEX}\z}.freeze
       end
 
       def helm_channel_regex
diff --git a/spec/requests/api/debian_group_packages_spec.rb b/spec/requests/api/debian_group_packages_spec.rb
index 07d0cae377e335208b8f85455dbe91cc0759b5f5..931eaf41891260a1ecdf7246eb75f6fe640fce20 100644
--- a/spec/requests/api/debian_group_packages_spec.rb
+++ b/spec/requests/api/debian_group_packages_spec.rb
@@ -25,13 +25,13 @@
     end
 
     describe 'GET groups/:id/-/packages/debian/dists/*distribution/:component/binary-:architecture/Packages' do
-      let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/#{component}/binary-#{architecture}/Packages" }
+      let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/#{component.name}/binary-#{architecture.name}/Packages" }
 
-      it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /^TODO Packages$/
+      it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /Description: This is an incomplete Packages file/
     end
 
     describe 'GET groups/:id/-/packages/debian/pool/:component/:letter/:source_package/:file_name' do
-      let(:url) { "/groups/#{container.id}/-/packages/debian/pool/#{component}/#{letter}/#{source_package}/#{package_name}_#{package_version}_#{architecture}.deb" }
+      let(:url) { "/groups/#{container.id}/-/packages/debian/pool/#{component.name}/#{letter}/#{source_package}/#{package_name}_#{package_version}_#{architecture.name}.deb" }
 
       it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /^TODO File$/
     end
diff --git a/spec/requests/api/debian_project_packages_spec.rb b/spec/requests/api/debian_project_packages_spec.rb
index 9548fa438ad0f57b5f650bfb4fb7b6c82e0b183f..fb7da467322fa2fc06f1d36f04067c5ae4ecd821 100644
--- a/spec/requests/api/debian_project_packages_spec.rb
+++ b/spec/requests/api/debian_project_packages_spec.rb
@@ -25,13 +25,13 @@
     end
 
     describe 'GET projects/:id/packages/debian/dists/*distribution/:component/binary-:architecture/Packages' do
-      let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{component}/binary-#{architecture}/Packages" }
+      let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{component.name}/binary-#{architecture.name}/Packages" }
 
-      it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /^TODO Packages$/
+      it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /Description: This is an incomplete Packages file/
     end
 
     describe 'GET projects/:id/packages/debian/pool/:component/:letter/:source_package/:file_name' do
-      let(:url) { "/projects/#{container.id}/packages/debian/pool/#{component}/#{letter}/#{source_package}/#{package_name}_#{package_version}_#{architecture}.deb" }
+      let(:url) { "/projects/#{container.id}/packages/debian/pool/#{component.name}/#{letter}/#{source_package}/#{package_name}_#{package_version}_#{architecture.name}.deb" }
 
       it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /^TODO File$/
     end
diff --git a/spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb
index e15962a4b820d314aa6ec42e1d0ae32afbd07ea4..1f68dd7a382f9b15d05abd62c00bd18a0e68a85e 100644
--- a/spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb
@@ -16,11 +16,13 @@
   let_it_be(:private_component, freeze: true) { create("debian_#{container_type}_component", distribution: private_distribution, name: 'existing-component') }
   let_it_be(:private_architecture_all, freeze: true) { create("debian_#{container_type}_architecture", distribution: private_distribution, name: 'all') }
   let_it_be(:private_architecture, freeze: true) { create("debian_#{container_type}_architecture", distribution: private_distribution, name: 'existing-arch') }
+  let_it_be(:private_component_file) { create("debian_#{container_type}_component_file", component: private_component, architecture: private_architecture) }
 
   let_it_be(:public_distribution, freeze: true) { create("debian_#{container_type}_distribution", :with_file, container: public_container, codename: 'existing-codename') }
   let_it_be(:public_component, freeze: true) { create("debian_#{container_type}_component", distribution: public_distribution, name: 'existing-component') }
   let_it_be(:public_architecture_all, freeze: true) { create("debian_#{container_type}_architecture", distribution: public_distribution, name: 'all') }
   let_it_be(:public_architecture, freeze: true) { create("debian_#{container_type}_architecture", distribution: public_distribution, name: 'existing-arch') }
+  let_it_be(:public_component_file) { create("debian_#{container_type}_component_file", component: public_component, architecture: public_architecture) }
 
   if container_type == :group
     let_it_be(:private_project) { create(:project, :private, group: private_container) }
@@ -40,14 +42,15 @@
   let(:visibility_level) { :public }
 
   let(:distribution) { { private: private_distribution, public: public_distribution }[visibility_level] }
+  let(:architecture) { { private: private_architecture, public: public_architecture }[visibility_level] }
+  let(:component) { { private: private_component, public: public_component }[visibility_level] }
+  let(:component_file) { { private: private_component_file, public: public_component_file }[visibility_level] }
 
-  let(:component) { 'main' }
-  let(:architecture) { 'amd64' }
   let(:source_package) { 'sample' }
   let(:letter) { source_package[0..2] == 'lib' ? source_package[0..3] : source_package[0] }
   let(:package_name) { 'libsample0' }
   let(:package_version) { '1.2.3~alpha2' }
-  let(:file_name) { "#{package_name}_#{package_version}_#{architecture}.deb" }
+  let(:file_name) { "#{package_name}_#{package_version}_#{architecture.name}.deb" }
 
   let(:method) { :get }