> ## Documentation Index
> Fetch the complete documentation index at: https://sequinstream.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Get started with RabbitMQ

> Stream Postgres changes to RabbitMQ in minutes. Build real-time data pipelines with RabbitMQ and Postgres change data capture (CDC).

In this quickstart, you'll create a real-time data pipeline that streams changes from a Postgres database to RabbitMQ. You'll:

* Boot Sequin
* Connect to a sample playground database
* Configure RabbitMQ to receive database changes
* See your changes flow in real-time

By the end, you'll have hands-on experience setting up Postgres change data capture (CDC) with Sequin and RabbitMQ.

<Tip>
  This is the quickstart for streaming Postgres to RabbitMQ. See the [how-to guide](/how-to/stream-postgres-to-rabbitmq) for an explanation of how to use the RabbitMQ sink or the [reference](/reference/sinks/rabbitmq) for details on all configuration options.
</Tip>

<Steps titleSize="h2">
  <Step title="Boot RabbitMQ" icon="database">
    If you don't already have RabbitMQ running, start it with Docker:

    ```bash theme={null}
    docker run -d --name rabbitmq \
      -p 5672:5672 \
      -p 15672:15672 \
      rabbitmq:3-management
    ```

    This starts RabbitMQ with the management plugin enabled, which we'll use to set up our exchange and queue.

    <Note>
      If you're using another RabbitMQ instance, ensure you have the connection details ready.
    </Note>
  </Step>

  <Step title="Configure RabbitMQ" icon="gear">
    Before creating our sink, we need to set up RabbitMQ to receive messages. We'll:

    1. Create an exchange
    2. Create a queue
    3. Bind the queue to the exchange

    <Steps>
      <Step title="Open RabbitMQ Management UI">
        Open [http://localhost:15672](http://localhost:15672) in your browser. Login with:

        * Username: guest
        * Password: guest
      </Step>

      <Step title="Create an exchange">
        1. Click "Exchanges" in the top navigation
        2. Find the "Add a new exchange" accordion and expand it if needed
        3. Enter:
           * Name: sequin
           * Type: topic
           * Leave other settings as default
        4. Click "Add exchange"

        <Frame>
          <img style={{ maxWidth: '700px' }} src="https://mintcdn.com/sequinstream/drUA755uMUeIaCSH/images/quickstart/rabbitmq/add-exchange.png?fit=max&auto=format&n=drUA755uMUeIaCSH&q=85&s=3a14a34adbfb9c3549cdc37ae82d9dde" alt="Adding a new exchange in RabbitMQ" width="1370" height="574" data-path="images/quickstart/rabbitmq/add-exchange.png" />
        </Frame>
      </Step>

      <Step title="Create a queue">
        1. Click "Queues and streams" in the top navigation
        2. Find the "Add a new queue" accordion and expand it if needed
        3. Enter:
           * Name: products
           * Leave other settings as default
        4. Click "Add queue"

        <Frame>
          <img style={{ maxWidth: '700px' }} src="https://mintcdn.com/sequinstream/drUA755uMUeIaCSH/images/quickstart/rabbitmq/add-queue.png?fit=max&auto=format&n=drUA755uMUeIaCSH&q=85&s=c4c02b5bf565e63eb3fe1ab76528439b" alt="Adding a new queue in RabbitMQ" width="1474" height="630" data-path="images/quickstart/rabbitmq/add-queue.png" />
        </Frame>
      </Step>

      <Step title="Create a binding">
        1. On the "Queues and streams" page, click on your new "products" queue
        2. Find the "Bindings" section and expand it if needed
        3. In "Add binding to this queue", enter:
           * From exchange: sequin
           * Routing key: `sequin.sequin_playground.public.products.*`
        4. Click "Bind"

        This routing key pattern will match all changes to the products table. The format is:
        `sequin.<database_name>.<table_schema>.<table_name>.<action>`

        <Frame>
          <img style={{ maxWidth: '700px' }} src="https://mintcdn.com/sequinstream/drUA755uMUeIaCSH/images/quickstart/rabbitmq/add-binding.png?fit=max&auto=format&n=drUA755uMUeIaCSH&q=85&s=fc9934953a29f99c3ecdf1659b915ecc" alt="Adding a binding in RabbitMQ" width="1486" height="674" data-path="images/quickstart/rabbitmq/add-binding.png" />
        </Frame>

        <Check>
          You've successfully created an exchange, queue, and binding in RabbitMQ.
        </Check>
      </Step>
    </Steps>
  </Step>

  <Step title="Run Sequin" icon="server">
    The easiest way to get started with Sequin is with our [Docker Compose file](https://github.com/sequinstream/sequin/blob/main/docker/docker-compose.yaml). This file starts a Postgres database, Redis instance, and Sequin server.

    <Steps>
      <Step title="Create directory and start services">
        1. Download [sequin-docker-compose.zip](https://github.com/sequinstream/sequin/releases/latest/download/sequin-docker-compose.zip).
        2. Unzip the file.
        3. Navigate to the unzipped directory and start the services:

        ```bash theme={null}
        cd sequin-docker-compose && docker compose up -d
        ```

        <AccordionGroup>
          <Accordion title="Alternative: Download with curl">
            ```bash theme={null}
            curl -L https://github.com/sequinstream/sequin/releases/latest/download/sequin-docker-compose.zip -o sequin-docker-compose.zip \
              && unzip sequin-docker-compose.zip && rm sequin-docker-compose.zip
            cd sequin-docker-compose && docker compose up -d
            ```
          </Accordion>

          <Accordion title="Alternative: Clone the repository">
            ```bash theme={null}
            git clone git@github.com:sequinstream/sequin.git
            cd sequin/docker
            docker compose up -d
            ```
          </Accordion>
        </AccordionGroup>
      </Step>

      <Step title="Verify services are running">
        Check that Sequin is running using `docker ps`:

        ```bash theme={null}
        docker ps
        ```

        You should see output like the following:

        ```
        CONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS                    PORTS                              NAMES
        bd5c458cabde   sequin/sequin:latest            "/scripts/start_comm…"   11 seconds ago   Up 9 seconds              4000/tcp, 0.0.0.0:7376->7376/tcp   sequin-sequin-1
        3bacd89765e7   grafana/grafana                 "/run.sh"                11 seconds ago   Up 11 seconds             0.0.0.0:3000->3000/tcp             sequin-sequin_grafana-1
        3ad41319a66c   postgres:16                     "docker-entrypoint.s…"   11 seconds ago   Up 11 seconds (healthy)   0.0.0.0:7377->5432/tcp             sequin-sequin_postgres-1
        6139a5fc4e80   redis:7                         "docker-entrypoint.s…"   11 seconds ago   Up 11 seconds             0.0.0.0:7378->6379/tcp             sequin-sequin_redis-1
        7e07a5b052de   prom/prometheus                 "/bin/prometheus --c…"   11 seconds ago   Up 11 seconds             0.0.0.0:9090->9090/tcp             sequin-sequin_prometheus-1
        ```

        <Check>
          Sequin, Postgres, Redis, Prometheus, and Grafana should be up and running (status: `Up`).
        </Check>
      </Step>
    </Steps>
  </Step>

  <Step title="Login" icon="key">
    The Docker Compose file automatically configures Sequin with an admin user and a playground database.

    Let's log in to the Sequin web console:

    <Steps>
      <Step title="Open the web console">
        After starting the Docker Compose services, open the Sequin web console at [http://localhost:7376](http://localhost:7376):

        <Frame>
          <img src="https://mintcdn.com/sequinstream/drUA755uMUeIaCSH/images/quickstart/login-page.png?fit=max&auto=format&n=drUA755uMUeIaCSH&q=85&s=c5d90b34f56560570696a71370f7e39b" alt="Sequin login page, allowing login with default credentials" width="2070" height="1696" data-path="images/quickstart/login-page.png" />
        </Frame>
      </Step>

      <Step title="Login with default credentials">
        Use the following default credentials to login:

        * Email:

        ```
        admin@sequinstream.com
        ```

        * Password:

        ```
        sequinpassword!
        ```
      </Step>
    </Steps>
  </Step>

  <Step title="View the playground database" icon="database">
    To get you started quickly, Sequin's Docker Compose file creates a logical database called `sequin_playground` with a sample dataset in the `public.products` table.

    Let's take a look:

    <Steps>
      <Step title="Navigate to Databases">
        In the Sequin web console, click **Databases** in the sidebar.
      </Step>

      <Step title="Select playground database">
        Click on the pre-configured `sequin-playground` database:

        <Frame>
          <img src="https://mintcdn.com/sequinstream/drUA755uMUeIaCSH/images/quickstart/playground-database.png?fit=max&auto=format&n=drUA755uMUeIaCSH&q=85&s=01ac1cbf4506cad22c270adb66c0b171" alt="Playground database" width="3376" height="2020" data-path="images/quickstart/playground-database.png" />
        </Frame>

        <Check>
          The database "Health" should be green.
        </Check>
      </Step>

      <Step title="View contents of the products table">
        Let's get a sense of what's in the `products` table. Run the following command:

        ```bash theme={null}
        docker exec -i sequin-sequin_postgres-1 \
          psql -U postgres -d sequin_playground -c \
          "select id, name, price from products;"
        ```

        <Info>
          This command connects to the running Postgres container and runs a `psql` command.
        </Info>

        You should see a list of the rows in the `products` table:

        ```
          id |         name          | price 
        ----+-----------------------+-------
          1 | Avocados (3 pack)     |  5.99
          2 | Flank Steak (1 lb)    |  8.99
          3 | Salmon Fillet (12 oz) | 14.99
          4 | Baby Spinach (16 oz)  |  4.99
          5 | Sourdough Bread       |  6.99
          6 | Blueberries (6 oz)    |  3.99
        (6 rows)
        ```

        We'll make modifications to this table in a bit.
      </Step>
    </Steps>
  </Step>

  <Step title="Create a RabbitMQ Sink" icon="database">
    With the playground database connected and RabbitMQ configured, you can create a [sink](/reference/sinks/overview). This sink will send changes to the `products` table to your RabbitMQ exchange:

    <Steps>
      <Step title="Navigate to Sinks">
        Click "Sinks" in the sidebar navigation, then click "Create Sink".
      </Step>

      <Step title="Select sink type">
        Select "RabbitMQ" as the sink type and click "Continue".
      </Step>

      <Step title="Note &#x22;Source&#x22; configuration">
        In the "Source" card, note that the `sequin-playground` database is selected and all schemas and tables are included. Leave these defaults:

        <Frame>
          <img style={{ maxWidth: '500px' }} src="https://mintcdn.com/sequinstream/I2Yx_f_pmUFGglUP/images/quickstart/source-card.png?fit=max&auto=format&n=I2Yx_f_pmUFGglUP&q=85&s=a1ba47d0e4698d439d64db0d582f0951" alt="Source card showing the sequin_playground database and products table" width="1640" height="778" data-path="images/quickstart/source-card.png" />
        </Frame>
      </Step>

      <Step title="Setup a backfill">
        In the `Inital backfill` card, select the `public.products` table to initate a backfill when the sink is created.

        <Frame>
          <img style={{ maxWidth: '700px' }} src="https://mintcdn.com/sequinstream/drUA755uMUeIaCSH/images/quickstart/backfill-card.png?fit=max&auto=format&n=drUA755uMUeIaCSH&q=85&s=2a41931bc2d650f7467f3c7ae92b5b0a" alt="Initial backfill card with public.products table selected" width="1606" height="570" data-path="images/quickstart/backfill-card.png" />
        </Frame>
      </Step>

      <Step title="Configure &#x22;RabbitMQ Configuration&#x22;">
        In the "RabbitMQ Configuration" card, enter your connection details:

        * Host: If running locally with Docker, use `host.docker.internal`
        * Port: The port RabbitMQ is listening on (default: 5672)
        * Exchange: The exchange name we created earlier (`sequin`)
        * Username and Password: Leave blank
        * SSL: Leave disabled

        <Frame>
          <img style={{ maxWidth: '700px' }} src="https://mintcdn.com/sequinstream/drUA755uMUeIaCSH/images/quickstart/rabbitmq/rabbitmq-config-card.png?fit=max&auto=format&n=drUA755uMUeIaCSH&q=85&s=eec35ab87e3ed48a6c1bc9a8138884bd" alt="RabbitMQ configuration card" width="1594" height="1334" data-path="images/quickstart/rabbitmq/rabbitmq-config-card.png" />
        </Frame>
      </Step>

      <Step title="Test the connection">
        At the bottom of the form, click the "Test Connection" button. If you provided proper credentials, it should succeed.

        <Check>
          Sequin can connect to your RabbitMQ server.
        </Check>
      </Step>

      <Step title="Create the sink">
        You can leave the rest of the defaults. As configured, messages will first flow for all existing rows in the `products` table. Then, you'll receive all changes to the `products` table in real-time.

        Click "Create Sink" to finish setting up your RabbitMQ sink.
      </Step>
    </Steps>
  </Step>

  <Step title="See changes flow through RabbitMQ" icon="waveform-lines">
    On the new sink's overview page, you should see the "Health" status turn green, indicating data is flowing to RabbitMQ.

    Let's confirm messages are flowing:

    <Steps>
      <Step title="Messages tab">
        Click the "Messages" tab. You'll see a list of the recently delivered messages:

        <Frame>
          <img style={{ maxWidth: '700px' }} src="https://mintcdn.com/sequinstream/drUA755uMUeIaCSH/images/quickstart/rabbitmq/messages-tab.png?fit=max&auto=format&n=drUA755uMUeIaCSH&q=85&s=9d392e0b9f4caaabaa47551ed7acb619" alt="List of recently delivered messages" width="1826" height="964" data-path="images/quickstart/rabbitmq/messages-tab.png" />
        </Frame>

        <Check>
          Sequin indicates it backfilled the `products` table to RabbitMQ.
        </Check>
      </Step>

      <Step title="View in RabbitMQ">
        You can view messages in your queue using the RabbitMQ management UI or CLI:

        ```bash theme={null}
        docker exec -it rabbitmq rabbitmqadmin get queue=products count=5 --format=pretty_json
        ```

        You should see the messages that were sent from Sequin. These are [`read` events](/reference/messages) from the initial backfill of the `products` table:

        <Frame>
          <img style={{ maxWidth: '700px' }} src="https://mintcdn.com/sequinstream/drUA755uMUeIaCSH/images/quickstart/rabbitmq/messages-in-queue.png?fit=max&auto=format&n=drUA755uMUeIaCSH&q=85&s=3a8d40ac230cd778b74e518b2b52cf79" alt="Messages in the products queue" width="1910" height="1210" data-path="images/quickstart/rabbitmq/messages-in-queue.png" />
        </Frame>

        <Check>
          Messages are flowing from Sequin to RabbitMQ.
        </Check>
      </Step>

      <Step title="Make some changes">
        Let's make some changes to the `products` table and see them flow through RabbitMQ.

        In your terminal, run the following command to insert a new row into the `products` table:

        ```bash theme={null}
        docker exec -i sequin-sequin_postgres-1 \
          psql -U postgres -d sequin_playground -c \
          "insert into products (name, price) values ('Organic Honey (16 oz)', 12.99);"
        ```

        Check your queue for the new message:

        ```bash theme={null}
        docker exec -it rabbitmq rabbitmqadmin get queue=products count=10 --format=pretty_json
        ```

        You should see a message corresponding to the inserted row.

        Feel free to try other changes:

        <AccordionGroup>
          <Accordion title="Update a product's price">
            ```bash theme={null}
            docker exec -i sequin-sequin_postgres-1 \
              psql -U postgres -d sequin_playground -c \
              "update products set price = 7.99 where name = 'Avocados (3 pack)';"
            ```
          </Accordion>

          <Accordion title="Change a product's name">
            ```bash theme={null}
            docker exec -i sequin-sequin_postgres-1 \
              psql -U postgres -d sequin_playground -c \
              "update products set name = 'Organic Avocados (3 pack)' where name = 'Avocados (3 pack)';"
            ```
          </Accordion>

          <Accordion title="Delete a product">
            ```bash theme={null}
            docker exec -i sequin-sequin_postgres-1 \
              psql -U postgres -d sequin_playground -c \
              "delete from products where name = 'Blueberries (6 oz)';"
            ```
          </Accordion>
        </AccordionGroup>

        Each change will appear in your RabbitMQ queue within a few seconds.

        <Info>
          If you want to purge your RabbitMQ queue, you can do so by running:

          ```bash theme={null}
          docker exec -it rabbitmq rabbitmqadmin purge queue name=products
          ```
        </Info>
      </Step>
    </Steps>
  </Step>
</Steps>

<Check>
  Great work!
</Check>

You've successfully:

* Set up a complete Postgres change data capture pipeline
* Configured RabbitMQ with an exchange, queue, and binding
* Loaded existing data through a backfill
* Made changes to the `products` table
* Verified changes are flowing through RabbitMQ

## Ready to stream

Now you're ready to connect your own database to Sequin and start streaming changes:

<CardGroup cols={2}>
  <Card title="Guide: Connect Postgres" icon="elephant" href="/connect-postgres">
    Connect your Postgres database to Sequin.
  </Card>

  <Card title="Guide: Setting up a RabbitMQ sink" icon="database" href="/how-to/stream-postgres-to-rabbitmq">
    Setup a RabbitMQ sink to stream your changes.
  </Card>
</CardGroup>
