如何在 Rails 应用上为 Ruby 停靠 Slanger
How to dockerize Slanger for a Ruby on Rails app
Slanger 是用 Ruby.
编写的 Pusher 协议的开源服务器实现
根据 Slanger 项目 README.md,Slanger 的设计目的不是 运行 Rails。
It is not designed to run inside a Rails or sinatra app
将其与 Rails 应用程序上的 Ruby 一起进行 docker 化将是一个很好的设计。实现它的步骤是什么?
您可以在下面找到详细的步骤。为了您的参考,所有代码都可以在 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 服务器的频道.请在下面找到示例。
Rails
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 构建和 运行 组合
一切就绪后,您可以使用 docker 构建 docker 图像和 运行 您的应用:
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 docker 化您的 Rails 应用程序,请参阅 docker compose documentation。
Slanger 是用 Ruby.
编写的 Pusher 协议的开源服务器实现根据 Slanger 项目 README.md,Slanger 的设计目的不是 运行 Rails。
It is not designed to run inside a Rails or sinatra app
将其与 Rails 应用程序上的 Ruby 一起进行 docker 化将是一个很好的设计。实现它的步骤是什么?
您可以在下面找到详细的步骤。为了您的参考,所有代码都可以在 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 应用程序中配置 SlangerPusher.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 服务器的频道.请在下面找到示例。
Rails
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 构建和 运行 组合
一切就绪后,您可以使用 docker 构建 docker 图像和 运行 您的应用:
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 docker 化您的 Rails 应用程序,请参阅 docker compose documentation。