【问题标题】:How to dockerize Slanger for a Ruby on Rails app如何为 Ruby on Rails 应用程序对接 Slanger
【发布时间】:2018-04-26 08:45:50
【问题描述】:

Slanger 是用 Ruby 编写的 Pusher 协议的开源服务器实现。

根据 Slanger 项目 README.md,Slanger 并非设计为在 Rails 中运行。

它不是为在 Rails 或 sinatra 应用程序中运行而设计的

将其与 Ruby on Rails 应用程序一起 dockerize 会被很好地设计。实施该步骤的步骤是什么?

【问题讨论】:

    标签: ruby-on-rails docker docker-compose pusher


    【解决方案1】:

    您可以在下面找到详细的步骤。供您参考,所有代码都可以在a GitHub repository 上找到。

    配置 Redis 容器

    俚语depends on Redis。所以首先,你需要一个 Redis 容器来运行。

    在您的 docker-compose.yml 中,添加(作为示例):

    redis:
      image: redis:4.0-alpine
    

    Docker 化俚语

    为 Slanger 添加一个 Dockerfile(例如 Dockerfile-slanger)

    FROM ruby:2.3.3
    RUN gem install slanger
    CMD slanger --app_key $APPKEY --secret $APPSECRET -r redis://$REDIS_HOST:$REDIS_PORT/$REDIS_DB
    

    更新你的 docker-compose.yml

    slanger:
      build:
        context: .
        dockerfile: Dockerfile-slanger
      depends_on:
        - redis
      ports:
        - "8080:8080"
      env_file:
        - .env.slanger
    

    环境文件 .env.slanger 如下所示:

    APPKEY=application_key
    APPSECRET=the_secret_for_the_application
    REDIS_HOST=redis
    REDIS_PORT=6379
    REDIS_DB=Slanger
    

    同样在您的 docker-compose.yml 中,将 slanger 添加到您的 Rails 应用程序的依赖项列表中:

    web:
      build: .
      command: bundle exec rails s -p 3000 -b '0.0.0.0'
      volumes:
        - .:/myapp
      ports:
        - "3000:3000"
      depends_on:
        - db
        - slanger
      env_file:
        - .env
    

    使用 Pusher 与 Slanger 交谈

    现在您需要将 pusher gem 添加到您的 Gemfile 中

    gem 'pusher'
    

    接下来,您需要通过添加文件 config/initializers/pusher.rb 在 Rails 应用程序中配置 Slanger

    Pusher.app_id='application_id'
    Pusher.key='application_key'
    Pusher.secret='the_secret_for_the_application'
    Pusher.host='slanger'
    Pusher.port=4567
    Pusher.logger=Rails.logger
    

    就是这样。现在您可以使用 Rails 中的 Pusher 通过 Slanger API 端口将消息发布到您的 Slanger 服务器的频道,也可以使用 JavaScript 中的 Pusher 通过 WebSocket 订阅您的 Slanger 服务器的频道。请在下面找到示例。

    导轨

    class MessageController < ApplicationController
      def subscribe
        puts 'Subscribed'
      end
    
      def publish
        message = search_params.require(:message)
    
        Pusher.trigger('MY_CHANNEL', 'AN_EVENT', message: message)
        puts 'Published'
      end
    
      private
    
      def search_params
        params.permit(:message)
      end
    end
    

    JavaScript

    <script src="https://js.pusher.com/4.2/pusher.min.js"></script>
    
    <p>Have subscribed to a Slanger channel</p>
    <p>Listening via WebSocket...</p>
    
    <script type="text/javascript">
        var pusher = new Pusher('application_key', {
            wsHost: "localhost",
            wsPort: "8080",
            wssPort: "8080",
            enabledTransports: ['ws', 'flash']
        });
    
        var channel = pusher.subscribe('MY_CHANNEL');
        channel.bind('AN_EVENT', function(data) {
            console.log('data: ', data);
        });
    
        Pusher.log = function(data) {
            console.log('\t\t', data);
        };
    </script>
    

    使用 docker compose 构建和运行

    一切就绪后,您可以构建 docker 映像并使用 docker compose 运行您的应用:

    docker-compose build
    docker-compose up
    
    $ docker ps
    CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                    NAMES
    9e3996f55e7c        helloslanger_web       "bundle exec rails..."   13 seconds ago      Up 10 seconds       0.0.0.0:3000->3000/tcp   helloslanger_web_1
    24c8b05f22a5        helloslanger_slanger   "/bin/sh -c 'slang..."   About an hour ago   Up 13 seconds       0.0.0.0:8080->8080/tcp   helloslanger_slanger_1
    6baa9eec8c5a        redis:4.0-alpine       "docker-entrypoint..."   4 days ago          Up 14 seconds       6379/tcp                 helloslanger_redis_1
    46bc3498a5bf        postgres               "docker-entrypoint..."   4 days ago          Up 14 seconds       5432/tcp                 helloslanger_db_1
    

    测试

    现在打开订阅者 URL:

    http://localhost:3000/message/subscribe
    

    并发布消息:

    http://localhost:3000/message/publish/Slanger%20is%20cool
    

    然后在订阅者的浏览器控制台中,您会看到:

    Pusher : Event recd : {"event":"AN_EVENT","data":{"message":"Slanger is cool"},"channel":"MY_CHANNEL"}
    data:  {message: "Slanger is cool"}
    

    希望对你有帮助。

    顺便说一句,如果您想了解如何使用 docker compose 对 Rails 应用程序进行 docker 化,请参阅 docker compose documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-12
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多