我一直在尝试(不成功)从我的Rails可安装引擎中访问主应用程序的应用程序机密.可安装引擎的重点是提供模块化.因此,常见的模式是在主应用程序中提供可配置的参数,其中一些参数需要是秘密的,然后引擎将使用这些参数.
在我的具体情况下,我在我的引擎中使用carrierwave和fog将文件上传到AWS桶.确切的存储桶和AWS凭证未在引擎中指定,但在主应用程序中指定,因为它们会因安装引擎的应用程序而异.
但是,当安装在引擎中时,carrierwave的初始化程序失败,因为它无法找到主应用程序的Rails.application.secrets:
require 'carrierwave'
require 'carrierwave/storage/fog'
CarrierWave.configure do |config|
config.fog_provider = 'fog/aws'
config.fog_credentials = {
:provider => 'AWS',
:aws_access_key_id => Rails.application.secrets.S3_AWS_ACCESS_KEY_ID,
:aws_secret_access_key => Rails.application.secrets.S3_AWS_SECRET_ACCESS_KEY
}
config.fog_directory = Rails.application.secrets.CARRIERWAVE_CONFIG_FOG_DIRECTORY
config.storage = :fog
end
Run Code Online (Sandbox Code Playgroud)
启动引擎时失败
Missing required arguments: aws_access_key_id, aws_secret_access_key (ArgumentError)
Run Code Online (Sandbox Code Playgroud)
事实上Rails.application.secrets.S3_AWS_ACCESS_KEY_ID(和其他人)nil在初始化程序中进行评估.一旦应用程序运行,它确实在引擎控制器内正确评估,但在初始化程序中它是零.
我修改了这个如下:
:aws_access_key_id => Rails.application.secrets.S3_AWS_ACCESS_KEY_ID || ENV["S3_AWS_ACCESS_KEY_ID"]
Run Code Online (Sandbox Code Playgroud)
并在每个生产环境中输出ENV VARIABLE以供引擎使用,但这并不理想.任何解决方案将不胜感激.
我正在尝试找出一种方法,根据后端端点前端的命中情况来制定不同的 CORS 规则。
所以我可以拥有
/api 端点具有 CORS 域白名单和
/public-api 没有 CORS 域白名单。
这是必需的,因为我有两个用于自己前端的内部端点,以及一个可以安装在任何第三方域中的公共 JS 小部件。
我看过django-cors-headers库,但它是正则表达式配置
CORS_ORIGIN_REGEX_WHITELIST = []
Run Code Online (Sandbox Code Playgroud)
致力于让来自域列表的请求通过。
就我而言,我需要一种方法来使用正则表达式(或其他方法)来让对我的端点的请求通过或不通过。
在为devise sign_up方法使用devise_token_auth和active_model_serializer时,我无法覆盖Rails序列化程序.
我想在查询我的API时自定义Devise sign_up控制器返回的字段.
devise_token_auth gem文档指出:
要自定义json呈现,请实现以下受保护的控制器方法
注册管理员
...
render_create_success
...
注意:控制器覆盖必须实现它们替换的控制器的预期操作.
这一切都很好,但我该怎么做?
我已经尝试生成如下的UserController序列化程序:
class UsersController < ApplicationController
def default_serializer_options
{ serializer: UserSerializer }
end
# GET /users
def index
@users = User.all
render json: @users
end
end
Run Code Online (Sandbox Code Playgroud)
但它只用于自定义方法,例如上面的索引方法:它没有像sign_up这样的设计方法被拾取
我很欣赏一个详细的回复,因为我到处寻找,但我一次只得到一块拼图.
我们有一个大型且复杂的传统 React 应用程序,我们在过去几年中一直在构建它。它加载一个index.html,注入javascript并像往常一样从API获取数据。不幸的是,冷加载时间非常糟糕(平均 5 - 7 秒)。一旦所有内容加载完毕,它会像往常一样快速,但冷加载时间会在特定的“关键”页面中杀死我们。这些是我们的公共用户页面,格式为:https://mywebsite/userId
我们正在寻找一种方法来显着加快这些路线的加载时间,其方法超越代码分割或资源优化。我们已经做到了这些,并且正在通过 CDN 提供我们的应用程序。
我们研究了创建这些用户页面的静态“快照”,我们需要使用像react-static这样的东西快速加载,并将它们作为静态版本提供并稍后进行水化。使用 next.js 或 gatsby 之类的东西重写我们的项目不是一个选择,因为它需要太多的工作。SSR 也不是一个选项,因为我们的整个后端都是用 Django 而不是 Node.js 编码的
我们走在正确的轨道上吗?是否可能/值得使用react-static(或类似的工具)来做到这一点?有很多关于如何从头开始创建反应静态项目的文档,但没有关于如何转换现有项目的文档,即使它只是我们需要的一小部分路由。
此外,一旦用户页面上的数据发生变化,我们如何触发适当快照的“重建”?用户更新数据的频率并不高,大约每月 4 次或 3 次,但我们有 3000 名用户,因此平均每小时更新 15 次可能是正常的。我们可以只触发实际更改的路由的重建吗?
我已成功使用 capistrano 将我的 rails 应用程序部署到 Ubuntu EC2。部署时一切正常。Rails 应用程序名称是 deseov12 我的问题是 Puma 不会在启动时启动,这是必要的,因为生产 EC2 实例将按需实例化。Puma 会在通过 Capistrano 部署时启动,它也会在运行时启动
cap production puma:start
Run Code Online (Sandbox Code Playgroud)
在本地机器上。
如果我运行以下命令,它也会在重新启动后在服务器上启动:
su - deploy
[enter password]
cd /home/deploy/deseov12/current && ( export RACK_ENV="production" ; ~/.rvm/bin/rvm ruby-2.2.4 do bundle exec puma -C /home/deploy/deseov12/shared/puma.rb --daemon )
Run Code Online (Sandbox Code Playgroud)
我已按照 Puma 丛林工具的指示使用 upstart 使 Puma 在启动时启动,如下所示:
/etc/puma.conf 的内容
/home/deploy/deseov12/current
Run Code Online (Sandbox Code Playgroud)
/etc/init/puma.conf 和 /home/deploy/puma.conf 的内容
# /etc/init/puma.conf - Puma config
# This example config should work with Ubuntu 12.04+. It
# allows you to manage multiple Puma …Run Code Online (Sandbox Code Playgroud) 我收到一个简单的cancancan授权的意外行为.
ability.rb
class Ability
include CanCan::Ability
def initialize(user)
# Define abilities for the passed in user here. For example:
#
user ||= User.new # guest user (not logged in)
if user.is_admin?
can :manage, :all
elsif user.is_standard?
can :manage, ServiceOrder, {user_id: user.id}
can :manage, ServiceOrderDetail, :service_order => { :user_id => user.id }
end
Run Code Online (Sandbox Code Playgroud)
service_order.rb控制器(部分显示)
class ServiceOrdersController < ApplicationController
authorize_resource
def show
@service_order = ServiceOrder.includes(:service_order_details).find(params[:id])
end
end
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它让控制器显示任何service_order记录,而不仅仅是current_user拥有的记录.
这种方法的唯一方法是,如果我手动授权控制器添加:
authorize! :show, @service_order
Run Code Online (Sandbox Code Playgroud)
像这样:
def show
@service_order = ServiceOrder.includes(:service_order_details).find(params[:id])
authorize! :show, @service_order
end …Run Code Online (Sandbox Code Playgroud) 我尝试过为我的项目配置SSL失败了.
我的AWS负载均衡器配置正确并接受证书密钥.我已将侦听器配置为将端口80流量和端口443流量路由到实例上的端口80.
我想在实例(Nginx和Puma)上不需要进一步修改,因为所有内容都被路由到实例上的端口80.我已经看到了在实例上安装证书的示例,但我知道负载均衡器是SSL终结点,所以这不是必需的.
通过http://www.example.com访问eveything工作正常.但是,通过https://www.example.com访问超时.
我希望得到一些适当的高级设置帮助.
编辑:我没有收到任何回复此问题.我认为它太笼统了?我很高兴得到确认,我使用的高级推理是正确的.我应该仅在负载均衡器中安装证书,并将负载均衡器配置为接受443端口上的连接,但是将80端口上的所有内容路由到Web服务器实例.
我刚刚设置了CloudFront发行版以加快网站图像的速度。我的图像存储在S3中。我在Route53中使用CloudFront分布端点的CNAME别名设置了自定义子域。
但是,在使用示例图像测试速度时,我发现以下内容:
这三个URL指向同一张图片:
测试是使用来自达拉斯的Pingdom完成的。我在其他地方也取得了类似的结果。
来自S3的较慢加载时间非常合理。图像未在边缘位置缓存。但是,仅通过在发行版前面使用CNAME加载时间几乎翻了一番,这似乎太慢了。我希望使用CNAME,但不以这种性能为代价。
我在这里想念什么吗?我到处都读到,在大多数情况下,额外的DNS CNAME查找可以忽略不计。
puma ×2
amazon-s3 ×1
cancan ×1
cancancan ×1
capistrano ×1
cors ×1
devise ×1
django ×1
nginx ×1
performance ×1
react-static ×1
reactjs ×1
ssl ×1
upstart ×1