supabase-on-aws icon indicating copy to clipboard operation
supabase-on-aws copied to clipboard

fix: Fix for Realtime Functionality in Supabase-on-AWS Description

Open psyrenpark opened this issue 7 months ago • 3 comments

While implementing supabase-on-aws, I encountered an issue where the realtime functionality was not working as expected. After investigating, I found a similar issue reported on the Supabase Realtime GitHub repository https://github.com/supabase/realtime/issues/372, which led me to a solution.

Changes Made Updated Realtime Version in Supabase Stack I updated the Docker image version for the Supabase Realtime service in src/supabase-stack.ts to resolve the initial issue with the Realtime service not functioning properly.

Before: public.ecr.aws/supabase/realtime:v2.25.27
After: public.ecr.aws/supabase/realtime:v2.25.60

This change allowed the following code to work, enabling successful subscription and message broadcast between clients:


    // client1.ts
    const channelA = supabase.channel('room')

    channelA
    .on(
      'broadcast',
      { event: '*' },
      (payload :any ) => messageReceived(payload)
    )
    .subscribe((status :any ) => {
        console.log("log -> ~ .subscribe ~ status:", status)
    })

    // client2.ts
    const channelA = supabase.channel('room')

    channelA.subscribe((status) => {
        if (status !== 'SUBSCRIBED') { return }
        channelA.send({
        type: 'broadcast',
        event: 'test',
        payload: { message: 'talking to myself' },
        })
    })

Identified Issue with API-based Messaging However, I noticed that sending messages via the API instead of directly through WebSockets did not work. This issue was discussed in a Supabase community discussion https://github.com/orgs/supabase/discussions/18790#discussioncomment-7580134.

Configuration Adjustments in Kong Template To address this, I made adjustments in the containers/kong/kong-template.yml to properly route Realtime and Realtime-API requests, and updated environment variables in src/supabase-stack.ts for consistency.

Updated SUPABASE_REALTIME_URL to SUPABASE_REALTIME_SOCKET_URL and added SUPABASE_REALTIME_API_URL. Updated the Kong Docker image to a newer version with a revised kong-template.yml.

// containers/kong/kong-template.yml

  ## Secure Realtime routes
  - name: realtime-v1
    _comment: 'Realtime: /realtime/v1/* -> ws://realtime:4000/socket/*'
    url: ${SUPABASE_REALTIME_SOCKET_URL:=http://realtime:4000/socket/}
    routes:
      - name: realtime-v1-all
        strip_path: true
        paths:
          - /realtime/v1/
    plugins:
      - name: cors
      - name: key-auth
        config:
          hide_credentials: false
      - name: acl
        config:
          hide_groups_header: true
          allow:
            - admin
            - anon

  # For Realtime-API routes
  - name: realtime-v1-api
    _comment: 'Realtime: /realtime/v1/api/* -> ws://realtime:4000/api/*'
    url: ${SUPABASE_REALTIME_API_URL:=http://realtime:4000/api/}
    routes:
      - name: realtime-v1-api-routes
        paths:
          - /realtime/v1/api
    plugins:
      - name: cors
      - name: key-auth
        config:
          hide_credentials: false
      - name: acl
        config:
          hide_groups_header: true
          allow:
            - admin
            - anon
          

// src/supabase-stack.ts


- kong.service.taskDefinition.defaultContainer!.addEnvironment('SUPABASE_REALTIME_URL', `${realtime.endpoint}/socket/`);
+ kong.service.taskDefinition.defaultContainer!.addEnvironment('SUPABASE_REALTIME_SOCKET_URL', `${realtime.endpoint}/socket/`);
+ kong.service.taskDefinition.defaultContainer!.addEnvironment('SUPABASE_REALTIME_API_URL', `${realtime.endpoint}/api/`);

-  image: ecs.ContainerImage.fromRegistry('public.ecr.aws/u3p7q2r8/kong:latest'),
+ image: ecs.ContainerImage.fromRegistry('public.ecr.aws/k1e4k0b3/kong:latest'), // FIX: new kong-template.yml version

Final Outcome After making these changes, both WebSocket-based and API-based messaging functionalities were working as expected, resolving the initial issue with the Realtime service.

// Example of client code with successful Realtime functionality


    // client1.ts
    const channelA = supabase.channel('room')

    channelA
    .on(
      'broadcast',
      { event: '*' },
      (payload :any ) => messageReceived(payload)
    )
    .subscribe((status :any ) => {
        console.log("log -> ~ .subscribe ~ status:", status)
    })

    // client2.ts
    const channelA = supabase.channel('room')
    // not subscribe
    const data = await channelA
        .send({
        type: 'broadcast',
        event: 'test',
        payload: { message: 'hi~' },
        },{

        })

Conclusion I hope this pull request will be merged to help others facing similar issues with Realtime functionality in Supabase-on-AWS. This solution has been tested and confirmed to work, providing a path forward for those experiencing similar challenges.

psyrenpark avatar Jan 26 '24 05:01 psyrenpark