diff --git a/app/services/projects/update_pages_service.rb b/app/services/projects/update_pages_service.rb
index e60b854f916c109284c6f16b232c49b0f58fef67..749a1cc56d80d5515d828e6dd88667b784aa16f0 100644
--- a/app/services/projects/update_pages_service.rb
+++ b/app/services/projects/update_pages_service.rb
@@ -130,7 +130,11 @@ module Projects
     end
 
     def max_size
-      current_application_settings.max_pages_size.megabytes || MAX_SIZE
+      max_pages_size = current_application_settings.max_pages_size.megabytes
+
+      return MAX_SIZE if max_pages_size.zero?
+
+      [max_pages_size, MAX_SIZE].min
     end
 
     def tmp_path
diff --git a/changelogs/unreleased/fix-gb-handle-max-pages-artifacts-size-correctly.yml b/changelogs/unreleased/fix-gb-handle-max-pages-artifacts-size-correctly.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3d9592bbf2a1699e7b7df535582b3fda9616a264
--- /dev/null
+++ b/changelogs/unreleased/fix-gb-handle-max-pages-artifacts-size-correctly.yml
@@ -0,0 +1,4 @@
+---
+title: Handle maximum pages artifacts size correctly
+merge_request: 13072
+author:
diff --git a/spec/services/projects/update_pages_service_spec.rb b/spec/services/projects/update_pages_service_spec.rb
index fc0a17296f37f946c1f90eed70bfb87266d0f13d..aa6ad6340f5c0eacff5fe0776c59b52c9a5d03a0 100644
--- a/spec/services/projects/update_pages_service_spec.rb
+++ b/spec/services/projects/update_pages_service_spec.rb
@@ -96,6 +96,78 @@ describe Projects::UpdatePagesService do
     expect(execute).not_to eq(:success)
   end
 
+  describe 'maximum pages artifacts size' do
+    let(:metadata) { spy('metadata') }
+
+    before do
+      file = fixture_file_upload(Rails.root + 'spec/fixtures/pages.zip')
+      metafile = fixture_file_upload(Rails.root + 'spec/fixtures/pages.zip.meta')
+
+      build.update_attributes(artifacts_file: file)
+      build.update_attributes(artifacts_metadata: metafile)
+
+      allow(build).to receive(:artifacts_metadata_entry)
+        .and_return(metadata)
+    end
+
+    shared_examples 'pages size limit exceeded' do
+      it 'limits the maximum size of gitlab pages' do
+        subject.execute
+
+        expect(deploy_status.description)
+          .to match(/artifacts for pages are too large/)
+      end
+    end
+
+    context 'when maximum pages size is set to zero' do
+      before do
+        stub_application_setting(max_pages_size: 0)
+      end
+
+      context 'when page size does not exceed internal maximum' do
+        before do
+          allow(metadata).to receive(:total_size).and_return(200.megabytes)
+        end
+
+        it 'updates pages correctly' do
+          subject.execute
+
+          expect(deploy_status.description).not_to be_present
+        end
+      end
+
+      context 'when pages size does exceed internal maximum' do
+        before do
+          allow(metadata).to receive(:total_size).and_return(2.terabytes)
+        end
+
+        it_behaves_like 'pages size limit exceeded'
+      end
+    end
+
+    context 'when pages size is greater than max size setting' do
+      before do
+        stub_application_setting(max_pages_size: 200)
+        allow(metadata).to receive(:total_size).and_return(201.megabytes)
+      end
+
+      it_behaves_like 'pages size limit exceeded'
+    end
+
+    context 'when max size setting is greater than internal max size' do
+      before do
+        stub_application_setting(max_pages_size: 3.terabytes / 1.megabyte)
+        allow(metadata).to receive(:total_size).and_return(2.terabytes)
+      end
+
+      it_behaves_like 'pages size limit exceeded'
+    end
+  end
+
+  def deploy_status
+    GenericCommitStatus.find_by(name: 'pages:deploy')
+  end
+
   def execute
     subject.execute[:status]
   end