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

  • Boot Sequin
  • Connect to a sample playground database
  • Start Meilisearch and create an index
  • Set up a sink to sync changes to Meilisearch
  • 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 Meilisearch. This same pattern can be used to setup your own Postgres CDC pipeline with Meilisearch.

Run Sequin

The easiest way to get started with Sequin is with our Docker Compose file. This file starts a Postgres database, Redis instance, and Sequin server.

1

Create directory and start services

  1. Download sequin-docker-compose.zip.
  2. Unzip the file.
  3. Navigate to the unzipped directory and start the services:
cd sequin-docker-compose && docker compose up -d
2

Verify services are running

Check that Sequin is running using docker ps:

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

Sequin, Postgres, Redis, Prometheus, and Grafana should be up and running (status: Up).

Login

The Docker Compose file automatically configures Sequin with an admin user and a playground database.

Let’s log in to the Sequin web console:

1

Open the web console

After starting the Docker Compose services, open the Sequin web console at http://localhost:7376:

2

Login with default credentials

Use the following default credentials to login:

  • Email:
admin@sequinstream.com
  • Password:
sequinpassword!

View the playground 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:

1

Navigate to Databases

In the Sequin web console, click Databases in the sidebar.

2

Select playground database

Click on the pre-configured sequin-playground database:

The database “Health” should be green.

3

View contents of the products table

Let’s get a sense of what’s in the products table. Run the following command:

docker exec -i sequin-sequin_postgres-1 \
  psql -U postgres -d sequin_playground -c \
  "select id, name, price from products;"

This command connects to the running Postgres container and runs a psql command.

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.

Create a Meilisearch Index

First, let’s start Meilisearch and create an index to store our product data:

1

Start Meilisearch

Meilisearch offers a docker image that can be run locally. Let’s start it up:

docker run -d \
  --name meilisearch \
  -p 7700:7700 \
  -v $(pwd)/meili_data:/meili_data \
  getmeili/meilisearch:v1.15 \
  meilisearch --master-key=my-api-key
2

Create the index

Run the following command to create a new index called “products”:

curl -X POST 'http://localhost:7700/indexes' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer my-api-key' \
  --data '{
    "uid": "products"
  }'

Meilisearch will create the index and infer document structure from inserted data.

3

Verify the index

You can verify the index was created by listing all indexes:

curl -X GET 'http://localhost:7700/indexes' \
  -H 'Authorization: Bearer my-api-key'

You should see the products index listed.

Create a Meilisearch Sink

With the playground database connected and Meilisearch index created, you can create a sink. This sink will send changes to the products table to your Meilisearch index:

1

Navigate to Sinks

Click “Sinks” in the sidebar navigation, then click “Create Sink”.

2

Select sink type

Select “Meilisearch” as the sink type and click “Continue”.

3

Note "Source" configuration

In the “Source” card, note that the sequin-playground database is selected and all schemas and tables are included. Leave these defaults:

4

Setup a transform

In the Transform card, click the toggle to view existing transforms. None exist, so click ”+ Create new transform”.

For “Transform name”, put products-meilisearch. For “Transform type”, select “Transform function”.

In the “Transform function” field, input the following code:

def transform(action, record, changes, metadata) do
  Map.take(record, ["id", "name", "price"])
end

This transform will take the id, name, and price fields from the products table and use them to create a new document in Meilisearch.

Click “Create Transform”, then select products-meilisearch in the transform list.

5

Setup a backfill

In the Inital backfill card, select the public.products table to initate a backfill when the sink is created.

6

Configure Meilisearch

In the Meilisearch card, enter your configuration:

  • Host: http://host.docker.internal:7700
  • Index name: products
  • Primary key: id
  • API Key: my-api-key
7

Create the sink

Give your sink a name, like products-meilisearch, and click “Create Sink”.

The Meilisearch index will first receive a backfill, then will stay in sync in real-time.

Query your data in Meilisearch

With the backfill complete, query Meilisearch for your products:

curl -X POST 'http://localhost:7700/indexes/products/search' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer my-api-key' \
  --data '{
    "q": ""
  }'

To search for “avocado”:

curl -X POST 'http://localhost:7700/indexes/products/search' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer my-api-key' \
  --data '{
    "q": "avocado"
  }'

See changes flow to Meilisearch

On the new sink’s overview page, watch for a green “Health” status.

Now make changes and see them appear in Meilisearch:

1

Insert a product

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);"

Then search in Meilisearch:

curl -X POST 'http://localhost:7700/indexes/products/search' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer my-api-key' \
  --data '{ "q": "honey" }'
2

Great work!

You’ve successfully:

  • Created a Meilisearch index
  • Loaded existing data through a backfill
  • Made changes to the products table
  • Verified changes are flowing to Meilisearch
  • Tested search functionality
  • Set up a complete Postgres change data capture pipeline

Ready to stream

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