这些代码整理改进自我八月到九月开发的喜感网http://www.xigan.com第一版的基础部分的代码,同时也是第二版的基础,希望这里面的代码能对他人快速开发产品原型有所帮助。也希望能够帮我review代码,共同进步。我会不定期把改进合并进这里。PS:部署和运维比开发难多了...
这个repo另一个目的是记录我对rails app架构的想法。 或许对于Startup的快速迭代来说,MongoDB才是正确的选择。
- lib/oauth_handlers 或许可以抽取成gem,利用facade pattern把人人、微博的相同作用的api包装成统一接口,app/models/authorization.rb 利用delegate直接调用
- app/models/concerns/o_auth_authorizable.rb 暴露接口可以在授权后把sns的个人信息添加到账号中,app/models/user.rb包含了头像的例子
- app/controllers/users/omniauth_callbacks_controller.rb 可以指定oath的info字段,防止session中存过大的对象而产生错误
- config/environments/production.rb 自定义了一套assets预编译规则,对重型js lib(例如auditor)友善
- config/environments/production.rb 设置assets_host,直接让upyun接管所有assets
- config/deploy.rb 自定义的任务部署账号需要提权可以试用try_su方法
- 开发环境下使用foreman管理app的所有进程,配置在Procfile里,config/environments/development.rb里的
$stdout.sync = true
使得rails log立即输出到stdout - app/uploaders/ 又拍云多buckets支持
- app/uploaders/image_uploader.rb 修改了huacnlee的实现,默认图片作为一个asset处理
- lib/reinforcements/sanitize.rb 基于'sanitize'的rich text sanitizer,基于白名单,可以过滤inline style
- app/controllers/errors_controller.rb 友善的错误页面
- lib/generators 利用rails generator根据application.yml生成nginx、logrotate、init.d、monit配置文件,使用方法见rails g
- monit调试比较坑爹,试试用script/debug_monit包装一下命令,你可能需要把它放到一个任何用户都访问到的地方比如/usr/bin
- config/deploy.rb, /config/deploy/* 支持多环境部署,例如
STAGE=staging cap deploy
部署到staging环境
- 完整的部署流程(release code to server+bundle+migrate database+assets precompile+sync assets to upyun+hot deployment)
- 基本的运维配置,monit监控进程(邮件报警)、logrotate分割日志、whenever+backup自动备份
- 用户子系统
- 微博 人人的Oauth接口 + 初步的API调用封装(facade pattern)
- 配置集中化
- 若干实用的Helper
- 初步的管理员后台(独立的namespace放与业务有关配合Rails_admin)
- UEditor集成(我自己的gem)+图片、附件上传的服务器端(基本)
- 多环境部署
- Ruby管理:RVM
- Ruby: Ruby 1.9.3
- 框架:Rails 3.2
- 数据库:MySQL
- 计划任务:whenever
- 备份:backup
- 日志切割:logrotate
- 文件上传:Carrierwave + 又拍云
- 缓存:Memcached
- 任务队列:delayed_job
- 服务器和站点监控:New relic + monit
- 程序异常反馈:Airbrake
- 程序后台:Rails_admin
- 部署:Capistrano
- 邮件发送:Postfix / others
- 反向代理:Nginx
- Web容器:Unicorn
- 日志分析:request-log-analyzer
- 用户系统:devise + omniauth
- OAuth api:weibo_2 renren
- 访问控制:cancan
- 通知:acts-as-messageable
- Tag:acts-as-taggable-on
- 评论:acts_as_commentable
- 分页:kaminari
- 全局配置:settingslogic
- 前端:compass-rails + jquery-ui-rails + bootstrap-sass
- git clone
- bundle
- rake db:migrate
- foreman start
- 访问localhost:3000
- 需要 git、rvm、rvm requirements中的给出的组件
- 生成配置文件(
rails g conf:[monit|unicorn|log_rotate|delayed_job|nginx]
)、复制到对应软件的配置路径 - 建立专用部署用户(如deploy)给予执行service的sudo权限(见config/deploy.rb注释)
- 配置config/application.yml database.yml,模板见各自的sample
- 自行申请new relic、airbrake、google analytics�,根据页面上的提示进行安装,Gemfile里已将有关的gem注释掉
- cap deploy:setup
- cap deploy:check 调整直到全部通过
- cap deploy 有时候sync_to_cdn会出现异常,重试即可
- cap db:seed 导入初始数据(编辑db/seeds.rb来满足需求)
- 没有问题,访问你的域名,否则请检查log/unicorn.stderr.log和log/production.log排除
- assets precompile:左右app/assets和vendor/assets下的文件名非‘_’开头文件都会被预编译,避免手动添加。不希望被预编译的第三方lib,考虑放到lib/assets对应目录下。
- set_title set_description set_keywords 这三个helper可以调用多次 会产生如 ‘Home - Admin - Start Up'的层级效果
- auditor太重了,放在application.js里很影响加载速度,所以你需要在需要在需要他的页面里<%= has_ueditor %>,这段代码重复调用不会多次引用文件
- 富文本输出<%= safe @post.body %>
希望我的工作能够为你提供一些思路或者节省工作,如果你发现有不足的地方希望你能够fork&pull request,或者给我发送邮件[email protected],感谢!
jasl, MIT license.