diff --git a/arkindex/documents/fixtures/data.json b/arkindex/documents/fixtures/data.json
index 79e4794886cfdd6e2df5a80684a2fa0e194f55e6..39ecdde08e30cac77a39c6673e2d56d6db74108a 100644
--- a/arkindex/documents/fixtures/data.json
+++ b/arkindex/documents/fixtures/data.json
@@ -1437,7 +1437,7 @@
         "max_height": null,
         "created": "2020-02-02T01:23:45.678Z",
         "updated": "2020-02-02T01:23:45.678Z",
-        "read_only": false
+        "s3_read_only_bucket": false
     }
 },
 {
diff --git a/arkindex/images/migrations/0010_rename_imageserver_readonly.py b/arkindex/images/migrations/0010_rename_imageserver_readonly.py
new file mode 100644
index 0000000000000000000000000000000000000000..70ac8072850cfd2c42ff0f06280efc75050979a6
--- /dev/null
+++ b/arkindex/images/migrations/0010_rename_imageserver_readonly.py
@@ -0,0 +1,47 @@
+# Generated by Django 4.0.7 on 2022-10-14 13:27
+
+from django.db import migrations, models
+
+
+def disable_read_only_without_bucket(apps, schema_editor):
+    """
+    Turn off s3_read_only_bucket on servers without S3 buckets
+    to ensure that the new check constraint is respected.
+    """
+    ImageServer = apps.get_model('images', 'ImageServer')
+    ImageServer.objects.filter(s3_bucket__isnull=True).update(s3_read_only_bucket=False)
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('images', '0009_remove_imageserver_validated'),
+    ]
+
+    operations = [
+        migrations.RenameField(
+            model_name='imageserver',
+            old_name='read_only',
+            new_name='s3_read_only_bucket',
+        ),
+        migrations.AlterField(
+            model_name='imageserver',
+            name='s3_read_only_bucket',
+            field=models.BooleanField(
+                default=False,
+                help_text='Disable the extra image checks that are normally made for servers with S3 buckets.',
+            ),
+        ),
+        migrations.RunPython(
+            disable_read_only_without_bucket,
+            reverse_code=migrations.RunPython.noop,
+            elidable=True,
+        ),
+        migrations.AddConstraint(
+            model_name='imageserver',
+            constraint=models.CheckConstraint(
+                check=models.Q(s3_read_only_bucket=False) | models.Q(s3_bucket__isnull=False),
+                name='s3_read_only_bucket_requires_s3_bucket'
+            ),
+        ),
+    ]
diff --git a/arkindex/images/models.py b/arkindex/images/models.py
index 620b18df7b023e6ff480ee9baf26335f2189a6a6..1709dafc512116fbb5712c5875020411ef9242fa 100644
--- a/arkindex/images/models.py
+++ b/arkindex/images/models.py
@@ -29,17 +29,32 @@ class ImageServer(models.Model):
     """
     display_name = models.CharField(max_length=250)
     url = StripSlashURLField(unique=True)
+
     s3_bucket = models.SlugField(max_length=63, blank=True, null=True, db_index=False)
     s3_region = models.SlugField(max_length=63, blank=True, null=True, db_index=False)
+    s3_read_only_bucket = models.BooleanField(
+        help_text='Disable the extra image checks that are normally made for servers with S3 buckets.',
+        default=False,
+    )
+
     max_width = models.PositiveIntegerField(blank=True, null=True)
     max_height = models.PositiveIntegerField(blank=True, null=True)
 
     created = models.DateTimeField(auto_now_add=True)
     updated = models.DateTimeField(auto_now=True)
-    read_only = models.BooleanField(default=False)
 
     objects = ImageServerManager()
 
+    class Meta:
+        # Enabling s3_read_only_bucket makes no sense when there is no s3_bucket,
+        # so we force it to be disabled if there is None to avoid any confusions.
+        constraints = [
+            models.CheckConstraint(
+                check=models.Q(s3_read_only_bucket=False) | models.Q(s3_bucket__isnull=False),
+                name='s3_read_only_bucket_requires_s3_bucket'
+            )
+        ]
+
     def __str__(self):
         return self.display_name
 
diff --git a/arkindex/images/serializers.py b/arkindex/images/serializers.py
index 52b088d1607342c4a6fb372184d8c329dbd78749..050d6dd1875db19ef5bb6c7c3ace64b9d58eee1b 100644
--- a/arkindex/images/serializers.py
+++ b/arkindex/images/serializers.py
@@ -62,7 +62,7 @@ class ImageSerializer(serializers.ModelSerializer):
         elif value == S3FileStatus.Checked:
             # Perform image validation if we are updating an existing image to Checked
             try:
-                if self.instance.server.s3_bucket and not self.instance.server.read_only:
+                if self.instance.server.s3_bucket and not self.instance.server.s3_read_only_bucket:
                     self.instance.check_hash(raise_exc=True, save=False)
                 self.instance.perform_check(raise_exc=True)
             except (AssertionError, ValueError, RequestException) as e:
diff --git a/arkindex/images/tests/test_image_api.py b/arkindex/images/tests/test_image_api.py
index e8a496d990ea0a34f27726af18c15bad5838c7cb..d1d4ba5bb5a22ca505d272dc92f4b65a98f87e15 100644
--- a/arkindex/images/tests/test_image_api.py
+++ b/arkindex/images/tests/test_image_api.py
@@ -266,7 +266,7 @@ class TestImageApi(FixtureAPITestCase):
             server=ImageServer.objects.create(
                 display_name='S3 test',
                 s3_bucket='s3_blanket',
-                read_only=True,
+                s3_read_only_bucket=True,
                 url='http://some.server/',
             ),
             width=1000,