我有一个这样的场景,我想使用capistrano在rails应用程序上部署我的ruby:
现在当我需要进行部署时,我需要将文件安装在/ home / webuser / railsapps / helloworld下,然后我需要使用cap脚本重新启动我的瘦身。我想保留webuser拥有的所有文件,因此cap脚本主用户作为webuser运行。现在,当我想重新启动瘦守护进程时出现问题,因为webuser无法sudo。
我在想是否可以调用两个单独的会话 - 用于文件部署的webuser,然后是一个特殊的sudoer来重启守护进程。任何人都可以给我一个示例脚本吗?
答案 0 :(得分:4)
这可能不是你想要的,但你可以在你的sudoers文件中实际做这样的事情:
someuser ALL=NOPASSWD: /etc/init.d/apache2
让某些用户运行/etc/init.d/apache2
如果您尝试做其他事情:
$ sudo ls
[sudo] password for someuser:
Sorry, user someuser is not allowed to execute '/bin/ls' as root on ...
答案 1 :(得分:1)
为什么不在部署例程中使用sudo然后在RAILS_ROOT上使用-R?您可以告诉Capistrano在将版本别名为current之前更改所有权。
答案 2 :(得分:0)
另一种方法是将nginx作为普通用户运行,比如在端口8080上,然后使用IPTables将请求从端口80重定向到端口8080,从内存
iptables -A PREROUTING -t tcp -m tcp -p 80 -j DNAT --dport 8080
将所有发往端口80的数据包发送到端口8080,可以绑定为普通用户。
答案 3 :(得分:0)
如果您作为webuser运行Thin,那么webuser是否可以不结束该过程?你可以在没有守护进程的情况下重新启动Thin,只要你在/ etc / thin中传递服务器的一切就可以了。据我所知,该守护进程只是一种绕过手动启动程序的方便方法。
你必须编辑/ etc / thin的内容时,唯一一次你会被解开。假设您正在对webuser的thin.yml位使用别名,这只会在您想要添加/删除程序时发生。发生这种情况时,手动添加/删除别名可能是值得的。
这都假设webuser可以结束Thin进程开始。我不知道。上次这对我来说是一个问题,当时我没有办法在我的本地机器上运行应用程序,因为它的实现几乎与服务器的布局有关。每次我编辑的东西,我都必须将它发送到SVN,将终端中的标签切换到ssh shell,从SVN拉出它,将标签切换到另一个ssh并重新启动守护程序,看看我是否打破了它。它让我失望,所以我在本地安装了Thin,让应用程序读取配置文件,现在我只需要每隔几天上传一次。
答案 4 :(得分:0)
刚刚注意到你不允许用户sudo :-)这个答案会帮助其他人:
派对有点晚了,但我刚做完了:
namespace :deploy do
desc "Start the Thin processes"
task :start do
run "cd #{current_path} && bundle exec sudo thin start -C /etc/thin/dankit.yml"
end
desc "Stop the Thin processes"
task :stop do
run "cd #{current_path} && bundle exec sudo thin stop -C /etc/thin/dankit.yml"
end
desc "Restart the Thin processes"
task :restart do
run "cd #{current_path} && bundle exec sudo thin restart -C /etc/thin/dankit.yml"
end
end
向bundle exec sudo thin start
添加sudo。