diff --git a/data/infra/swoole.Dockerfile b/data/infra/swoole.Dockerfile
index 07082220..40293eaa 100644
--- a/data/infra/swoole.Dockerfile
+++ b/data/infra/swoole.Dockerfile
@@ -92,4 +92,7 @@ WORKDIR /home/shlink
 # Expose swoole port
 EXPOSE 8080
 
-CMD /usr/local/bin/composer update && ./vendor/bin/zend-expressive-swoole start
+CMD /usr/local/bin/composer update && \
+    # When restarting the container, swoole might think it is already in execution
+    # This forces the app to be started every second until the exit code is 0
+    until php ./vendor/bin/zend-expressive-swoole start; do sleep 1 ; done
diff --git a/module/Core/src/Model/VisitsParams.php b/module/Core/src/Model/VisitsParams.php
index fe6f1a30..e583fb73 100644
--- a/module/Core/src/Model/VisitsParams.php
+++ b/module/Core/src/Model/VisitsParams.php
@@ -27,7 +27,11 @@ final class VisitsParams
         $startDate = self::getDateQueryParam($query, 'startDate');
         $endDate = self::getDateQueryParam($query, 'endDate');
 
-        return new self(new DateRange($startDate, $endDate), $query['page'] ?? 1, $query['itemsPerPage'] ?? null);
+        return new self(
+            new DateRange($startDate, $endDate),
+            (int) ($query['page'] ?? 1),
+            isset($query['itemsPerPage']) ? (int) $query['itemsPerPage'] : null
+        );
     }
 
     private static function getDateQueryParam(array $query, string $key): ?Chronos