如何使用 docker(ruby on rails)设置 anycable?

Posted

技术标签:

【中文标题】如何使用 docker(ruby on rails)设置 anycable?【英文标题】:How to setup anycable with docker(ruby on rails)? 【发布时间】:2021-04-05 23:49:20 【问题描述】:

如何在 docker 上设置 anycable(action cable) 端口?

这是我的 Anycable Dockerfile

来自红宝石:2.6.3-alpine3.10

WORKDIR /home/app

复制。 /home/app/

暴露 50051

CMD ["anycable"]

这是我的 docker-compose

版本:“3” 服务: 应用程序: 建造: 语境: 。 dockerfile: ./dockers/app/Dockerfile 容器名称:out_app 重启:除非停止 卷: - 。:/应用程序 - /app/node_modules - /应用程序/公共/资产 - /应用程序/公共/包 端口: - 3000:3000 D b: 建造: 语境: 。 dockerfile: ./dockers/postgis/Dockerfile 容器名称:out_db 环境: POSTGRES_USER:$DOCKER_DB_USER POSTGRES_PASSWORD:$DOCKER_DB_PASSWORD POSTGRES_DB:$DOCKER_DB_NAME 卷: - /docker_data/giggle/postgres:/var/lib/postgresql/data 端口: - 5435:5432 nginx: 建造: 语境: 。 dockerfile: ./dockers/web/Dockerfile 容器名称:out_web 重启:除非停止 端口: - 80:80 - 443:443 取决于: - 应用程序 卷: - ./dockers/web/nginx.conf:/etc/nginx/conf.d/default.conf - ./data/certbot/conf:/etc/letsencrypt - ./data/certbot/www:/var/www/certbot 证书机器人: 图片:certbot/certbot 重启:除非停止 卷: - ./data/certbot/conf:/etc/letsencrypt - ./data/certbot/www:/var/www/certbot 入口点:“/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $$!; done;'” 雷迪斯: 图片:redis 卷: - ../../tmp/db:/var/lib/redis/data 延迟工作: 建造: 语境: 。 dockerfile: ./dockers/delayed_job/Dockerfile 容器名称:out_delayed_job 命令:bundle exec rails 工作:工作 取决于: - D b 卷: - .:/app

任何电缆:

图像:'anycable/anycable-go:edge-mrb'

端口:

-“3334”

环境:

ANYCABLE_HOST:0.0.0.0

REDIS_URL: redis://redis:6379/1

ANYCABLE_RPC_HOST: 0.0.0.0:3334

ANYCABLE_DEBUG:1

命令:bundle exec anycable

任何电缆: 建造: 语境: 。 dockerfile:./dockers/anycable/Dockerfile 容器名称:anycable 命令:bundle exec anycable 取决于: - redis

【问题讨论】:

【参考方案1】:

您提供了 anycable-go 配置。要为 anycable-go 服务器设置自定义端口,请将 ANYCABLE_PORT: <your port> 添加到 anycable-go 映像环境或公开映像端口,如 ports: ['<your_port>:8080']

检查 anycable 配置页面(包含环境变量信息):https://docs.anycable.io/#/anycable-go/configuration

【讨论】:

【参考方案2】:

您需要通过将 anycable-rails gem 添加到您的 Gemfile 来设置 anycable-rails:

gem "anycable-rails", "~> 1.1"

使用 Redis 广播适配器时

gem "redis", ">= 4.0"

(别忘了运行 bundle install)。

然后,通过 Rails 生成器运行交互式配置向导:

bundle exec rails g anycable:setup

配置 接下来,更新您的 Action Cable 配置:

# config/cable.yml
production:
  # Set adapter to any_cable to activate AnyCable
  adapter: any_cable

安装 WebSocket 服务器并在配置中指定其 URL:

对于开发来说可能是本地主机

# config/environments/development.rb
config.action_cable.url = "ws://localhost:8080/cable"

对于生产来说,它可能有一个子域和安全连接

# config/environments/production.rb
config.action_cable.url = "wss://ws.example.com/cable"

现在您可以为您的应用程序启动 AnyCable RPC 服务器:

$ bundle exec anycable
#> Starting AnyCable gRPC server (pid: 48111)
#> Serving Rails application from ./config/environment.rb

别忘了在生产环境中提供 Rails 环境

$ RAILS_ENV=production bundle exec anycable

注意:您不需要指定 `-r 选项(请参阅 CLI 文档),您的应用程序将从 config/environment.rb 加载。

最后,运行 AnyCable WebSocket 服务器,例如anycable-go:

$ anycable-go --host=localhost --port=8080

INFO 2019-08-07T16:37:46.387Z context=main 正在启动 AnyCable v0.6.2-13-gd421927(使用 mruby 1.2.0 (2015-11-17))(pid:1362) INFO 2019-08-07T16:37:46.387Z context=main 处理 /cable 处的 WebSocket 连接 INFO 2019-08-07T16:37:46.388Z context=http 在 localhost:8080 启动 HTTP 服务器

您可以将 AnyCable 特定的配置存储在 YAML 文件中(类似于 Action Cable 之一):

# config/anycable.yml
development:
  redis_url: redis://localhost:6379/1
production:
  redis_url: redis://my.redis.io:6379/1

【讨论】:

以上是关于如何使用 docker(ruby on rails)设置 anycable?的主要内容,如果未能解决你的问题,请参考以下文章

通过Ruby on Rails和docker构建微服务架构之入门教程

Ruby on Rails 6 + Docker = Webpacker::Manifest::MissingEntryError?

尝试从 Ruby on Rails 连接到 postgres(在 docker 容器中)

部署 Ruby on Rails 6 - AWS Elastic Beanstalk - Docker: ArgumentError: Missing `secret_key_base`

ruby on rails如何安装

Ruby on Rails - 如何在 Rails 方法中使用 HTML 坐标?