# \[Tutorial\] Run your own satellite (part 10) - Introducing mud and ranged-loop

**URL:** <https://forum.storj.io/t/tutorial-run-your-own-satellite-part-10-introducing-mud-and-ranged-loop/31940>\
**Category:** Developer Discussions\
**Tags:** satellite-operator, satellites\
**Created:** [June 17, 2026, 10:14pm UTC](https://forum.storj.io/t/tutorial-run-your-own-satellite-part-10-introducing-mud-and-ranged-loop/31940 "2026-06-17T22:14:23Z")\
**Posts on this page:** 1\
**Showing post:** 2

<div class="post-metadata">

**Author:** ![kocoten1992](https://storj.bcdn.literatehosting.com/user_avatar/forum.storj.io/kocoten1992/32/7819_2.png) [@kocoten1992](https://forum.storj.io/u/kocoten1992)\
**Post date:** [July 27, 2026, 7:19pm UTC](https://forum.storj.io/t/tutorial-run-your-own-satellite-part-10-introducing-mud-and-ranged-loop/31940/2 "2026-07-27T19:19:38Z")

</div>

## `ranged-loop` is supposed to run all child services in a single sweep

Reason? If you run `ranged-loop` with each child service separatedly, each service will querying database independently, it cannot reuse data queried from database.

Best is to run all ranged-loop service in a single command, that is probably why `ranged-loop` exist in the first place.

Content below are for educational purposes, don’t run it blindly on production.

## $checker.Observer

`$checker.Observer` is the repair checker: the satellite’s damage detector. Its one job is to answer, for every remote segment in the network, a single question — does this segment still have enough healthy pieces, in the right places, to be safe? — and to write down the ones that don’t.

It doesn’t fix anything. It produces a to-do list. The actual reconstruction is done by a completely separate subsystem (satellite/repair/repairer) that reads that list. This separation is deliberate: detection is a cheap, read-only full-table scan; repair is expensive, network-bound, and needs to be rate-limited independently.

– Claude

## Minimum useful command to run:

```bash
./satellite-modular ranged-loop --components='$checker.Observer' \
--database-options.url "cockroach://my_role:123456@127.0.0.1:26257/my_database?sslmode=verify-full&sslrootcert=/ca.crt" \
--identity-dir=id/satellite \
--jobq.server-node-url '12kK7Y15fU1b5YADYRiBj2Dd4WsF1LARVWHpW6nXRcusV3wiRZD@127.0.0.1:15781' \
--jobq.tls.extensions.revocation=false \
--jobq.tls.use-peer-ca-whitelist=false \
--metainfo.database-url "cockroach://my_role:123456@127.0.0.1:26257/my_metainfo_database?sslmode=verify-full&sslrootcert=ca.crt"

```

If thing go well it should look like this (jobq service must already up):

```txt
2026-07-28T02:05:01+07:00 INFO debug:wrapper.debug debug server is started listening {"addr": "127.0.0.1:43759"}
2026-07-28T02:05:01+07:00 INFO tracing:tracing Anonymized tracing enabled
2026-07-28T02:05:01+07:00 INFO rangedloop:service ranged loop initialized
2026-07-28T02:05:01+07:00 INFO rangedloop:service ranged loop started {"parallelism": 2, "batch_size": 2500, "observers": ["*rangedloop.LiveCountObserver", "*piecetracker.Observer", "*checker.Observer"], "asofsystem_interval": "-5m0s", "spannerstale_interval": "0s"}
2026-07-28T02:05:01+07:00 INFO piecetracker:observer piecetracker observer finished
2026-07-28T02:05:01+07:00 INFO rangedloop:service ranged loop finished

```

---

_[View the full topic](https://forum.storj.io/t/tutorial-run-your-own-satellite-part-10-introducing-mud-and-ranged-loop/31940)._
