如何使用 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`