20180205
肖威工作总结
上午:阿里云部署实战 (1)域名对接:将服务器的ip加入域名解析的栏目,实现www 和 @ 的域名的解析; 使用ping dongnishijian.com 看是否被解析; (2)登录服务器:ssh [email protected] 完成密码的更新; (3)在我们的远程电脑上安装相关的运行程序和 ruby on rails 的运行环境; https://www.jianshu.com/p/04328ed5970e
今天处理 ssh连接至 ubuntu 服务器时,提示以下错误:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the RSA key sent by the remote host is da:f7:3e:ba:f7:00:e6:44:76:f2:58:6e:48:**. Please contact your system administrator. Add correct host key in /用户home目录/.ssh/known_hosts to get rid of this message. Offending RSA key in /用户home目录/.ssh/known_hosts:1 RSA host key for ip地址 has changed and you have requested strict checking. Host key verification failed.
经过google,出现这个问题的原因是,第一次使用SSH连接时,会生成一个认证,储存在客户端的known_hosts中. 可使用以下指令查看:
ssh-keygen -l -f ~/.ssh/known_hosts
由于服务器重新安装系统了,所以会出现以上错误。 解决办法
ssh-keygen -R 服务器端的ip地址
会出现以下提示:
Host 192.168.3.10 found: line 1 type RSA
/用户home目录/.ssh/known_hosts updated. Original contents retained as /用户home目录/.ssh/known_hosts.old 重新连线,出现以下提示:
The authenticity of host '192.168.3.10 (192.168.3.10)' can't be established.
RSA key fingerprint is da:f7:3e:ba:f7:00:e6:44:76:f2:58:6e:48:****.
Are you sure you want to continue connecting (yes/no)?
输入yes确认即可连线成功.
作者:GkFool 链接:https://www.jianshu.com/p/04328ed5970e 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
https://www.jianshu.com/p/47da77b969cc ubuntu14.04 安装 Rails 环境, Nginx Passenger
ubuntu14.04 安装 Rails 环境, Nginx Passenger
新建部署用户
创建新用户-dep
sudo useradd -m -s /bin/bash dep sudo adduser dep sudo sudo passwd
安装ssh远程连接
sudo apt-get install update sudo apt-get install ssh
查看机器IP
ifconfig
login as dep
安装ruby
sudo apt-get install curl
安装 RVM
\curl -sSL https://get.rvm.io | bash
激活 RVM
source .bashrc
产看RVM版本
rvm -v
用RVM安装Ruby
rvm install 2.3.0
查看RVM下所有ruby版本
rvm list
指定默认ruby
rvm alias create default 2.3.0
查看ruby命名位置
which ruby
/home/dep/.rvm/rubies/ruby-2.3.0/bin/ruby
安装Nginx和Passenger
APT安装 nginx+passenger
参考 https://www.phusionpassenger.com/library/install/nginx/install/oss/trusty/
Install our PGP key and add HTTPS support for APT
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7 sudo apt-get install -y apt-transport-https ca-certificates
Add our APT repository
sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main > /etc/apt/sources.list.d/passenger.list' sudo apt-get update
Install Passenger + Nginx
sudo apt-get install -y nginx-extras passenger 安装依赖工具
安装nodejs,后面会有依赖
sudo apt-get install nodejs
安装Git
sudo apt-get install git 配置 Nginx
sudo vi /etc/nginx/nginx.conf
去掉下面两行的注释
passenger_root /some-filename/locations.ini;
passenger_ruby /usr/bin/passenger_free_ruby;
修改Nginx配置
sudo rm /etc/nginx/sites-enabled/default sudo vi /etc/nginx/sites-enabled/example.com.conf
server { listen 80 default; server_name ror.cbd; # 如果是本地VM调试修改hosts文件 root /home/deploy/code_from_git/toy_app/public;
passenger_enabled on;
} 部署代码
clone 代码
bundle安装gems
gem install bundle
如果失败了就切回ruby-china的源
gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ gem sources -l
进入项目目录
bundle install
查看服务器的secret值
rake secret
在config/secrets.yml,替换掉production设置中的 <%= ENV["SECRET_KEY_BASE"] %>
或者在环境变量里添加;
或者在production的组里添加 dotenv-rails 这个gem,之后在项目根目录下新建 .env 文件,添加配置
SECRET_KEY_BASE=b78a0f839f2be596a1543f13bb90b965d5736dcb190504b10c3de05eb2fcb66d1ab6d92b3450e603e5768bba1830604a506bcb5a0f6040ec110b2f55e2a2a78e
代码 push && pull
设置Rails运行环境 并 运行DB 迁移
RAILS_ENV=production rake db:create db:migrate 完成
重启 Nginx
sudo service nginx restart at 2016-03-22
作者:CbdFocus 链接:https://www.jianshu.com/p/47da77b969cc 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Nginx 通过 passenger-install-nginx-module 安装的 nginx 和直接安装的 nginx 有什么区别? https://ruby-china.org/topics/16303
- 下午:办公工位交接
不可以向下进行,这是现在所遇到的问题; Where do you want to install Nginx to?
Please specify a prefix directory [/opt/nginx]:
Compiling Passenger support files...
env NOEXEC_DISABLE=1 /home/apps/.rvm/gems/ruby-2.3.1/wrappers/rake nginx:clean nginx RELEASE=yes
rm -rf buildout/cache
rm -rf buildout/common/libboost_oxt.a buildout/common/libboost_oxt
rm -f buildout/common/libpassenger_common/LoggingKit.o buildout/common/libpassenger_common/Exceptions.o buildout/common/libpassenger_common/FileTools/PathManip.o buildout/common/libpassenger_common/FileTools/FileManip.o buildout/common/libpassenger_common/ProcessManagement/Spawn.o buildout/common/libpassenger_common/ProcessManagement/Utils.o buildout/common/libpassenger_common/Utils/SystemTime.o buildout/common/libpassenger_common/Utils/StrIntUtils.o buildout/common/libpassenger_common/Utils/StrIntUtilsNoStrictAliasing.o buildout/common/libpassenger_common/Utils/IOUtils.o buildout/common/libpassenger_common/Utils/Hasher.o buildout/common/libpassenger_common/Utils.o buildout/common/libpassenger_common/jsoncpp.o
rm -f buildout/common/libpassenger_common/Crypto.o buildout/common/libpassenger_common/Utils/CachedFileStat.o buildout/common/libpassenger_common/WatchdogLauncher.o buildout/common/libpassenger_common/MemoryKit/mbuf.o buildout/common/libpassenger_common/MemoryKit/palloc.o buildout/common/libpassenger_common/ServerKit/http_parser.o buildout/common/libpassenger_common/ServerKit/Implementation.o buildout/common/libpassenger_common/DataStructures/LString.o buildout/common/libpassenger_common/AppTypes.o
rm -f buildout/common/libpassenger_common/vendor-modified/modp_b64.o buildout/common/libpassenger_common/vendor-modified/modp_b64_strict_aliasing.o
rm -f buildout/common/libpassenger_common/UnionStationFilterSupport.o
rm -f buildout/common/libpassenger_common/JsonTools/CBindings.o
rm -f buildout/common/libpassenger_common/FileTools/LargeFiles.o
rm -f buildout/common/libpassenger_common/FileTools/PathManipCBindings.o
rm -f buildout/common/libpassenger_common/ProcessManagement/Ruby.o
rm -rf buildout/common/libpassenger_common
rm -rf buildout/support-binaries/
rm -rf buildout/nginx_dynamic/libboost_oxt.a buildout/nginx_dynamic/libboost_oxt
rm -f buildout/nginx_dynamic/module_libpassenger_common/LoggingKit.o buildout/nginx_dynamic/module_libpassenger_common/Exceptions.o buildout/nginx_dynamic/module_libpassenger_common/FileTools/PathManip.o buildout/nginx_dynamic/module_libpassenger_common/FileTools/FileManip.o buildout/nginx_dynamic/module_libpassenger_common/ProcessManagement/Spawn.o buildout/nginx_dynamic/module_libpassenger_common/ProcessManagement/Utils.o buildout/nginx_dynamic/module_libpassenger_common/Utils/SystemTime.o buildout/nginx_dynamic/module_libpassenger_common/Utils/StrIntUtils.o buildout/nginx_dynamic/module_libpassenger_common/Utils/StrIntUtilsNoStrictAliasing.o buildout/nginx_dynamic/module_libpassenger_common/Utils/IOUtils.o buildout/nginx_dynamic/module_libpassenger_common/Utils/Hasher.o buildout/nginx_dynamic/module_libpassenger_common/Utils.o buildout/nginx_dynamic/module_libpassenger_common/jsoncpp.o
rm -f buildout/nginx_dynamic/module_libpassenger_common/Crypto.o buildout/nginx_dynamic/module_libpassenger_common/Utils/CachedFileStat.o buildout/nginx_dynamic/module_libpassenger_common/WatchdogLauncher.o buildout/nginx_dynamic/module_libpassenger_common/MemoryKit/mbuf.o buildout/nginx_dynamic/module_libpassenger_common/MemoryKit/palloc.o buildout/nginx_dynamic/module_libpassenger_common/ServerKit/http_parser.o buildout/nginx_dynamic/module_libpassenger_common/ServerKit/Implementation.o buildout/nginx_dynamic/module_libpassenger_common/DataStructures/LString.o buildout/nginx_dynamic/module_libpassenger_common/AppTypes.o
rm -f buildout/nginx_dynamic/module_libpassenger_common/vendor-modified/modp_b64.o buildout/nginx_dynamic/module_libpassenger_common/vendor-modified/modp_b64_strict_aliasing.o
rm -f buildout/nginx_dynamic/module_libpassenger_common/UnionStationFilterSupport.o
rm -f buildout/nginx_dynamic/module_libpassenger_common/JsonTools/CBindings.o
rm -f buildout/nginx_dynamic/module_libpassenger_common/FileTools/LargeFiles.o
rm -f buildout/nginx_dynamic/module_libpassenger_common/FileTools/PathManipCBindings.o
rm -f buildout/nginx_dynamic/module_libpassenger_common/ProcessManagement/Ruby.o
rm -rf buildout/nginx_dynamic/module_libpassenger_common
mkdir -p buildout/support-binaries
c++ -o buildout/support-binaries/AgentMain.o -Isrc/agent -Isrc/cxx_supportlib -Isrc/cxx_supportlib/vendor-copy -Isrc/cxx_supportlib/vendor-modified -Isrc/cxx_supportlib/vendor-modified/libev -Isrc/cxx_supportlib/vendor-copy/libuv/include -Isrc/cxx_supportlib/vendor-copy/websocketpp -D_REENTRANT -I/usr/local/include -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-long-long -Wno-missing-field-initializers -feliminate-unused-debug-symbols -feliminate-unused-debug-types -fvisibility=hidden -DVISIBILITY_ATTRIBUTE_SUPPORTED -Wno-attributes -DHAS_ALLOCA_H -DHAVE_ACCEPT4 -DHAS_SFENCE -DHAS_LFENCE -DPASSENGER_DEBUG -DBOOST_DISABLE_ASSERTS -ggdb -std=gnu++11 -Wno-unused-local-typedefs -DHASH_NAMESPACE="gnu_cxx" -DHASH_MAP_HEADER="
- 晚上:云端支付逻辑
[ 2.0 ] 9. 將寫好的專案部署 ( Deploy ) 到遠端 Server 上 (逻辑稍微简单一些) http://rails101s.logdown.com/posts/247891-project-deploy-on-the-server
[ 2.0 ] 9. 將寫好的專案部署 ( Deploy ) 到遠端 Server 上 本章的作業目標:
用手動的方式將寫好的 Rails 專案 deploy 到遠端 Server 上 改 Capristrano 自動化部署,一個指令完成 Deploy 用手動的方式將寫好的 Rails 專案 deploy 到遠端 Server 上 本機端的前置作業 打開根目錄的 .gitignore ,輸入
.gitignore ... ...
- /config/database.yml ... ... 這個設定會將 config/database.yml 從版本控制中移除
Gemfile 修改 原本
Gemfile ... ...
- gem 'sqlite3'
gem 'sqlite3'
...gem 'therubyracer', platforms: :ruby
- gem 'therubyracer', platforms: :ruby ...
- group :development do
- gem "sqlite3"
end
group :production do
- gem "mysql2"
- end ... ... config/initializers/devise.rb 修改 config/initializers/devise.rb ... ...
config.secret_key = '(一堆亂碼)'
- config.secret_key = '(一堆亂碼)' ... ... 最後將寫好的專案放到你的 github 上 ( 如果要看範例教材在 https://github.com/sdlong/rails101s )
Production 端設定 作業系統版本: Ubuntu 14.04 LTS @linode
我們會在 production 上創建二個帳號 一個是 root ( 擁有最高權限,系統安裝與設定用 ) 一個是 apps ( deploy 用,沒有系統異動權限 )
所有系統安裝都是用 root 權限的帳號來設定
現在我們已經進入全新剛建好的 Ubuntu 14.04
系統更新 sudo apt-get update sudo apt-get upgrade sudo apt-get autoremove
設定時區 sudo dpkg-reconfigure tzdata
安裝 MySQL sudo apt-get install mysql-common mysql-client libmysqlclient-dev mysql-server 會要你輸入 mysql 的 root 密碼 ( 這邊以 123456 為範例,後面會有資料庫設定 )
mysql -u root -p => 輸入 root 密碼 ( 本範例是 123456 )
看到這個畫面就代表安裝成功 ( 打 exit 離開 )
安裝需要的套件 ( 含 git ) sudo apt-get install build-essential git-core curl libssl-dev libreadline5 libreadline-gplv2-dev zlib1g zlib1g-dev libmysqlclient-dev libcurl4-openssl-dev libxslt-dev libxml2-dev libffi-dev
安裝 rbenv sudo git clone git://github.com/sstephenson/rbenv.git /usr/local/rbenv
sudo vi /etc/profile.d/rbenv.sh 檔案裡面寫入:
export RBENV_ROOT=/usr/local/rbenv export PATH="$RBENV_ROOT/bin:$PATH" eval "$(rbenv init -)" 存檔
修改檔案權限
sudo chmod +x /etc/profile.d/rbenv.sh
安裝 ruby-build
git clone git://github.com/sstephenson/ruby-build.git /tmp/ruby-build sudo /tmp/ruby-build/install.sh
安裝 ruby ( 本次用 2.3.0 版本 ) rbenv install 2.3.0 rbenv global 2.3.0 rbenv rehash
ruby -v
看到這張圖就代表安裝完成
(PS: 舊圖是 2.1.2, 實際上應該要是 2.3.0 )
安裝 ImageMagick apt-get install imagemagick
安裝 Passenger gem install passenger
用 Passenger 安裝 Nginx passenger-install-nginx-module
第一個選擇 1. Yes: download, 第二個選擇 1. compile and install Nginx for me. 第三個選擇: 安裝到 /opt/nginx (直接按 enter) 安裝 Nginx init script git clone git://github.com/jnstq/rails-nginx-passenger-ubuntu.git sudo mv rails-nginx-passenger-ubuntu/nginx/nginx /etc/init.d/nginx sudo chown root:root /etc/init.d/nginx
設定 Nginx conf vim /opt/nginx/conf/nginx.conf
/opt/nginx/conf/nginx.conf
...
...
server {
listen 80;
server_name localhost;
- root /home/apps/rails101s/public; # 這行會對應到你的專案資料夾名稱,如果你不是用rails101s,就把 rails101s 改成你的專案名稱
passenger_enabled on;
charset koi8-r;
access_log logs/host.access.log main;
location / {
- root html;
- index index.html index.htm;
}
error_page 404 /404.html;
redirect server error pages to the static page /50x.html
- #
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root html;
}
proxy the PHP scripts to Apache listening on 127.0.0.1:80
- #
location ~ .php$ {
proxy_pass http://127.0.0.1;
}
pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
- #
location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
deny access to .htaccess files, if Apache's document root
concurs with nginx's one
- #
location ~ /.ht {
deny all;
}
} ... ... 將 nginx server 重開機
sudo /etc/init.d/nginx restart 出現這個畫面,代表 nginx server 安裝成功,可以運作了
連到該 server 的 ip / 網址
root 帳號的系統設定完成,接下來做 apps 帳號的設定
安裝必要的 gem gem install bundle gem install execjs
新增 User: apps sudo adduser apps 輸入密碼與相關資料
切換 User: apps sudo su - apps
確認 ruby 版本是否為安裝的 2.3.0 ruby -v
若不是 2.3.0 ,可改用 ssh apps@ip 用 apps 登入 再檢查一次版本是否正確,正確才執行下面的動作
ssh-keygen => 連按三個 enter more ~/.ssh/id_rsa.pub # 把出來的內容貼到 github account setting => ssh_key 上 git clone [email protected]:sdlong/rails101s.git ( 此為範例用,或是你的 git )
設定 config/database.yml vim ~/rails101s/config/database.yml
config/database.yml production: adapter: mysql2 encoding: utf8 database: rails101 pool: 5 username: root password: "123456" socket: /var/run/mysqld/mysqld.sock username 跟 password 的值就是你安裝 MySQL 時設定的值
安裝專案需要的 gem 與 rails rake 執行 cd rails101 bundle install RAILS_ENV=production rake db:create # 建立 production database RAILS_ENV=production rake db:migrate # 建立 production database 欄位 RAILS_ENV=production rake assets:precompile # 建立 production assets
檢查是否 deploy 成功 重開 nginx server sudo /etc/init.d/nginx restart
會發現這個問題
這是因為我們的 config/secret.yml 裡面沒有 production 的密碼
vi config/secrets.yml
把 其中的一行 密碼 貼到 production 那一行,存檔即可
再重開 nginx server sudo /etc/init.d/nginx restart
Deploy 完成!!
改 Capristrano 自動化部署,一個指令完成 Deploy 我們會發現,每次網站一改版,就要重新 git clone , 設定 database.yml, secret.yml, 跑一系列 rake 指令 要花太多人工的時間,而且很難確保不會在手動執行的過程中手殘造成悲劇
所以我們改用自動化部署,來幫助我們自動處理,而且還有 rollback 的功能,萬一本次的版本炸掉,還能回溯上個版本
前置作業 (本機端) more ~/.ssh/id_rsa.pub
copy 出來的值
(用 apps 登入 production server )
vim /home/apps/.ssh/authorized_keys => 貼上 copy 的值,存檔
以後就可以在開發端用 $ ssh apps@(server.ip) 直接連過去
建立 rails101s/shared/config 資料夾 mkdir ~/rails101s/shared mkdir ~/rails101s/shared/config
將 rails101s/config 裡的 database.yml 跟 secret.yml 複製到 rails101s/shared/config 資料夾 cp ~/rails101s/config/database.yml ~/rails101s/shared/config/ cp ~/rails101s/config/secrets.yml ~/rails101s/shared/config/
開發端設定 安裝 gem 打開 Gemfile
Gemfile ... ... group :development do gem "sqlite3"
- gem "capistrano", "~> 3.1", require: false
- gem "capistrano-rvm", "~> 0.1.1", require: false
- gem "capistrano-rails", "~> 1.1", require: false
- gem "capistrano-rbenv", "~> 2.0", require: false # production server use rbenv end ... ... 安裝 gem bundle install
跑 capistrano install cap install
設定 config/deploy.rb 原本
config/deploy.rb
config valid only for current version of Capistrano
lock '3.3.5'
- set :application, 'my_app_name'
你的 application name
set :application, 'rails101s'
set :repo_url, '[email protected]:me/my_repo.git'
你的 git url
set :repo_url, 'https://github.com/sdlong/rails101s.git'
rbenv 的設定
- set :rbenv_type, :user
- set :rbenv_ruby, "2.1.2"
- set :rbenv_path, "/usr/local/rbenv"
- set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"
- set :rbenv_map_bins, %w(rake gem bundle ruby rails)
- set :rbenv_roles, :all
Default deploy_to directory is /var/www/my_app_name
set :deploy_to, '/var/www/my_app_name'
deploy 的資料夾位置 (prodution)
- set :deploy_to, "/home/apps/rails101"
Default value for :log_level is :debug
set :log_level, :debug
- set :log_level, :debug
Default value for :linked_files is []
set :linked_files, fetch(:linked_files, []).push('config/database.yml')
git clone 完成後會從 shared 資料夾 copy 過去的檔案
- set :linked_files, %w(config/database.yml config/secrets.yml)
Default value for linked_dirs is []
set :linked_dirs, fetch(:linked_dirs, []).push('bin', 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system')
git clone 完成後會從 shared 資料夾 copy 過去的資料夾
- set :linked_dirs, fetch(:linked_dirs, []).push("bin", "log", "tmp/pids", "tmp/cache", "tmp/sockets", "vendor/bundle", "public/system")
Default branch is :master
ask :branch, proc { git rev-parse --abbrev-ref HEAD.chomp }.call
Default value for :scm is :git
set :scm, :git
Default value for :format is :pretty
set :format, :pretty
Default value for :pty is false
set :pty, true
Default value for default_env is {}
set :default_env, { path: "/opt/ruby/bin:$PATH" }
Default value for keep_releases is 5
set :keep_releases, 5
namespace :deploy do
after :restart, :clear_cache do on roles(:web), in: :groups, limit: 3, wait: 10 do
# Here we can do anything such as:
within release_path do
execute :rake, 'cache:clear'
end
- within release_path do
- execute :rake, 'cache:clear'
- end end end
end 設定 Capfile Capfile ... ...
require 'capistrano/rvm'
require 'capistrano/rbenv'
- require 'capistrano/rbenv'
require 'capistrano/chruby'
require 'capistrano/bundler'
- require 'capistrano/bundler' # 會自動幫你跑 bundle install
require 'capistrano/rails/assets'
- require 'capistrano/rails/assets' # 會自動幫你跑 rake assets:precompile
require 'capistrano/rails/migrations'
- require 'capistrano/rails/migrations' # 會自動幫你跑 rake db:migrate
require 'capistrano/passenger'
... ... 設定 config/deploy/production.rb config/deploy/production.rb ... ...
- role :app, %w{[email protected]}
- role :web, %w{[email protected]}
- role :db, %w{[email protected]}
你設定的 deploy 用帳號 & ip ( 本教材的 ip 是範例 )
- role :app, %w{[email protected]}
- role :web, %w{[email protected]}
- role :db, %w{[email protected]} ...
- server 'example.com', user: 'deploy', roles: %w{web app}, my_property: :my_value
server 'example.com', user: 'deploy', roles: %w{web app}, my_property: :my_value
... ... 執行 deploy:check cap production deploy:check 將會做 deploy 前的檢查,並把遠端 (production) 需要的資料夾建立,如果有 error 請檢查錯誤訊息去 debug
執行 deploy 程序 cap production deploy 正式運作自動化 deploy
修改 nginx.conf 由於 capristrano 將專案的位置改到 rails101s/current 所以要將 nginx 上 server 對應的位置修改
sudo vim /opt/nginx/conf/nginx.conf
/opt/nginx/conf/nginx.conf ... ... server { listen 80; server_name localhost;
- root /home/apps/rails101s/public;
- root /home/apps/rails101s/current/public; passenger_enabled on; } ... ... 重開 nginx, 看看是否 deploy 成功 sudo /etc/init.d/nginx restart
=> 用瀏覽器瀏覽你的網站吧!
以後專案有任何異動,只要 push 到 github ( master 主線 ) 以後 直接輸入 cap production deploy 即可自動跑完 deploy
萬一新版本的專案炸掉,還可以輸入 cap production deploy:rollback 回溯上個版本
production 端的 rails101s 根目錄會有三個資料夾
current <== 現在實際上線運作的版本 releases <== 你過去 deploy 的記錄 ( 預設存五個 , 最新版的 = current ) shared <== 你不想放在 git 上給人看到的檔案(例如 database.yml) / logs / 圖片 ... etc 的放置處,新版本 deploy 完後 capristrano 會自動 copy 一份過去到 current 上
現在根目錄除了這三個資料以外的檔案都沒有用到了,如果嫌太亂可以這些檔案刪除掉
How to use 谷歌 http://yuezaixz.logdown.com/posts/175283-how-to-use-google
How To Install Rails and nginx with Passenger on Ubuntu https://www.digitalocean.com/community/tutorials/how-to-install-rails-and-nginx-with-passenger-on-ubuntu
nginx + unicorn + capistrano 部署 https://www.jianshu.com/p/f47538a02ab5
Ubuntu 16.04 安装 Redmine项目管理系统(Nginx) http://blog.topspeedsnail.com/archives/9131
如何在Mac下快速部署 Nginx + Passenger + Rails http://www.dedecms.com/knowledge/program/ruby/2012/1202/17184.html
如何在Mac下快速部署 Nginx + Passenger + Rails 来源:ruby-china 作者:ruby-china 发表于:2012-12-02 10:45 点击:651 针对于新入门的开发者,如何在 Mac 下用 Nginx + Passenger 部署 Rails 的运行环境。 系统需求 Mac OSX Lion 步骤0 安装环境依赖 安装Xcode 4.1,Xcode4.2以及更高的版本在 Lion 仍然存在一些兼容性问题,强烈建议使用XCode 4.1,下载地址: https://develop
针对于新入门的开发者,如何在 Mac 下用 Nginx + Passenger 部署 Rails 的运行环境。
系统需求 Mac OSX Lion 步骤0 安装环境依赖 安装Xcode 4.1,Xcode4.2以及更高的版本在 Lion 仍然存在一些兼容性问题,强烈建议使用XCode 4.1,下载地址:
$ bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer) 配置RVM自动加载,将下面这一行代码添加到~/.bash_profile中,然后退出iTerm并重新启动
[[ -s $HOME/.rvm/scripts/rvm ]] && source $HOME/.rvm/scripts/rvm 安装 ruby-1.9.2-p290
$ rvm install 1.9.2 设置系统默认使用 ruby-1.9.2
$ rvm use 1.9.2 --default 步骤1 安装 Rails 安装Rails
$ gem install rails Rails安装完成后,创建一个rails项目,假定你的项目叫做:awesome project
$ rails new awesome_project 启动Rails,并访问 http://localhost:3000
$ cd awesome_project $ rails server 步骤2 安装 Passenger 和 Nginx 首先通过gem安装passenger
$ gem install passenger 因为Nginx不支持动态module载入,所以需要通过Passenger来自动下载,编译,安装由Passenger修改版的Nginx:
安装Passenger + Nginx
$ passenger-install-nginx-module Yes: download, compile and install Nginx for me. (recommended) The easiest way to get started. A stock Nginx 1.0.10 with Passenger support, but with no other additional third party modules, will be installed for you to a directory of your choice.
No: I want to customize my Nginx installation. (for advanced users) Choose this if you want to compile Nginx with more third party modules besides Passenger, or if you need to pass additional options to Nginx's 'configure' script. This installer will 1) ask you for the location of the Nginx source code, 2) run the 'configure' script according to your instructions, and 3) run 'make install'.
Whichever you choose, if you already have an existing Nginx configuration file, then it will be preserved.
Enter your choice (1 or 2) or press Ctrl-C to abort: 这里建议选择1
Please specify a prefix directory [/opt/nginx]: /usr/local/nginx
当询问nginx的安装路径的时候,个人建议安装到/usr/local/nginx下
当安装完成后,会在console中提示如何配置Nginx
Passenger会自动帮你将下面两行添加到Nginx的配置文件中/usr/local/nginx/conf/nginx.conf(很人性化)
http { ... passenger_root /Users/Daniel/.rvm/gems/ruby-1.9.2-p290/gems/passenger-3.0.10; passenger_ruby /Users/Daniel/.rvm/wrappers/ruby-1.9.2-p290/ruby; ... } server { listen 80; server_name www.yourhost.com; root /somewhere/public; # <--- be sure to point to 'public'! passenger_enabled on; } 请不要忘记将nginx命令行程序连接到/usr/local/sbin
$ sudo ln -s /usr/local/nginx/sbin/nginx /usr/sbin/ 步骤3 配置Nginx + Passenger + Rails 关于Nginx的配置,请参考Nginx的官方网站以及Passenger的官方网站
http://wiki.nginx.org/Configuration http://www.modrails.com/documentation/Users%20guide%20Nginx.html 修改hosts文件,给你的项目一个本地域名, 比如awesome_project.local
$ sudo vim /etc/hosts 127.0.0.1 awesome_project.local 测试hosts
$ ping awesome_project.local PING awesome_project.local (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.054 ms 继续配置Nginx, 这里我给出一个最小可运行的Nginx配置文件
$ vim /usr/local/nginx/conf/nginx.conf nginx.conf
worker_processes 1; events { worker_connections 1024; } http { passenger_root /Users/Daniel/.rvm/gems/ruby-1.9.2-p290/gems/passenger-3.0.10; passenger_ruby /Users/Daniel/.rvm/wrappers/ruby-1.9.2-p290/ruby; include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name awesome_project.local; root /Users/Daniel/awesome_project/public; passenger_enabled on; rails_env development; } } 测试Nginx的配置文件语法是否正确
$ sudo nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful 启动Nginx
$ sudo nginx 如何在修改Nginx的配置文件后,让Nginx载入新配置
$ sudo nginx -s reload 如何停止Nginx
$ sudo nginx -s stop 如何在不停Nginx的情况下,重新启动Passenger
$ cd path/to/your/awesome/project $ touch tmp/restart.txt 好了,这个时候你可以打开浏览器,访问你的awesome_project网站了
http://awesome_project.local 最后,希望你能够在Rails的开发中找到快乐!
rails 生产环境部署练习(nginx + passenger + capistrano) http://blog.csdn.net/ximi_qin287624952/article/details/70169614
自己实践:两台 ubuntu 系统间的部署 ,从上到下,一步一步去实现
第一步: 安装网站服务器 ( ubuntu 16.04 )
第二步:安装 ruby、rails 环境
$ sudo apt update $ sudo apt upgrade -y $ sudo dpkg-reconfigure tzdata 1 2 3 进入选单选你的 Time zone=>Asia=>chongqing | shanghai
接着我们安装新的套件们,这些是 Ruby on Rails 所需要的东西。请输入以下一行指令:
$ sudo apt install -y build-essential git-core bison openssl libreadline6-dev curl zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 autoconf libc6-dev libpcre3-dev curl libcurl4-nss-dev libxml2-dev libxslt-dev imagemagick nodejs libffi-dev 1 安装 ruby 慢放法:自行编译原始码
$ wget http://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.0.tar.gz $ tar xvfz ruby-2.4.0.tar.gz $ cd ruby-2.4.0 $ ./configure $ make $ sudo make install 1 2 3 4 5 6 请把 2.4.0 换成你项目使用的 ruby 版本号
$ ruby -v $ gem install bundler $ bundler -v 1 2 3 安装 postgresql 数据库
$ sudo apt install postgresql libpq-dev postgresql-contrib 1 修改帐号 postgres 的密码
切换到 postgres 用户
$ sudo su - postgres 1 使用 psql 命令登录 postgresql 控制台
$ psql 1 使用 \password 命令,为 postgres 用户设置一个密码
\password your_password 1 创建数据库
CREATE DATABASE your_app_database_name OWNER postgrs; 1 退出
\q 第三步:安装 Nginx + Passenger 快方法:用套件安装
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
$ sudo apt install -y apt-transport-https ca-certificates
Add our APT repository
$ sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger xenial main > /etc/apt/sources.list.d/passenger.list'
$ sudo apt update
Install Passenger + Nginx
$ sudo apt install -y nginx-extras passenger 1 2 3 4 5 6 7 8 9 10 11 打开你的浏览器,输入 服务器 IP 地址,应该就可以看到默认的 Nginx 网页了:Welcome to nginx on Ubuntu!
Nginx启动和重开用法:
$ sudo service nginx start $ sudo service nginx stop $ sudo service nginx restart 1 2 3 第四步:新增 deploy 用户
$ sudo adduser --disabled-password deploy $ sudo su deploy $ cd ~ $ ssh-keygen -t rsa 1 2 3 4 接着复制开发机器的 ~/.ssh/id_rsa.pub 到 服务器的 /home/deploy/.ssh/authorized_keys
在本机电脑 Terminal 输入 cat ~/.ssh/id_rsa.pub,会出现一串文字,复制下来 在 服务器 Terminal 上输入 vi /home/deploy/.ssh/authorized_keys,进入vi去编辑该档,把上一个步骤的视窗内的文字copy贴上到vi内,然后 :wq 离开
$ chmod 644 /home/deploy/.ssh/authorized_keys $ chown deploy:deploy /home/deploy/.ssh/authorized_keys 1 2 这样开发机器就可以直接 ssh deploy@<服务器IP地址>,登入无须密码
备注:还需将服务器的 /home/deploy/.ssh/id_rsa.pub 复制到代码远程仓库 ssh_keys
第五步:设定 Nginx
输入 exit 回到 root 帐号
编辑 /etc/nginx/nginx.conf,去掉注释打开以下一行:
include /etc/nginx/passenger.conf; 1 在 /etc/nginx/nginx.conf最上方新增一行:
env PATH; 1 少这一行的话,等会 Rails 会找不到 nodejs 的路径,在 nginx error log 中会有 Message from application: There was an error while trying to load the gem ‘uglifier’. Gem Load Error is: Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. 的错误。
新增 /etc/nginx/sites-enabled/your_project_name.conf
server { listen 80; server_name your_domain.com; # 还没 domain 的话,先填 服务器 IP 地址
root /home/deploy/your_app_name/public;
如果是自动化部署,位置在 root /home/deploy/apps/your_app_name/current/public;
passenger_enabled on;
passenger_min_instances 1;
location ~ ^/assets/ { expires 1y; add_header Cache-Control public; add_header ETag ""; break; } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 以上设定包括设定Assets静态档案成为永不过期(Rails的Assets Pipeline会加上版本号,所以不需要担心)、设定Passenger至少开一个Process。其中server_name your_domain.com请会换成你的domain。如果Domain name还没注册好,可以先用服务器IP地址。但是如果你的服务器上有多个Rails专案或网站,就必须用不同domain来区分。
如果有多个domain连到同一个服务器,可以用空白区隔,例如:
server_name dureading.calvinchu.cc dureading.com www.dureading.com; 1 这样三个 domain 都会连到同一个 Rails 了。
最后执行sudo service nginx restart便会启用Nginx设定。如果之后你的Rails有任何修改要重新加载,但是并不想把Nginx整个重开,请在你的Rails应用程式目录下执行touch tmp/restart.txt即可,这样Passenger就会知道要重新加载Rails,而不需要重开Nginx。
第六步:使用 capistrano 设定自动化布署脚本
在Gemfile中添加Capistrano和其它用到的插件
group :development do gem 'capistrano' gem 'capistrano-rails' gem 'capistrano-bundler' gem 'capistrano-passenger' end 1 2 3 4 5 6 在项目中初始化 Capistrano
$ cap install 会生成如下目录文件,Capfile 用来配置 Capistrano,deploy.rb 是一些共用 task 的定义,而 production.rb / staging.rb 用来定义具体的 stage 的 tasks。
├── Capfile ├── config │ ├── deploy │ │ ├── production.rb │ │ └── staging.rb │ └── deploy.rb └── lib └── capistrano └── tasks
配置 Capistrano
在 Capfile 文件中开启要用到的一些插件
require 'capistrano/setup' require 'capistrano/deploy'
require 'capistrano/rails' require 'capistrano/passenger'
require "capistrano/scm/git" install_plugin Capistrano::SCM::Git
require 'capistrano/bundler' require 'capistrano/rails/assets' require 'capistrano/rails/migrations'
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 在 config/deploy.rb 文件中配置共用变量
lock "3.7.2"
set :application, 'your_app_name' set :deploy_user, 'deploy'
set :repo_url, '[email protected]:your_user_id/your_app_name.git' # 项目代码远程仓库地址 github,bitbucket 或者其它代码管理仓库
how many old releases do we want to keep, not much
set :keep_releases, 5
files we want symlinking to specific entries in shared
set :linked_files, %w{config/database.yml config/secrets.yml}
dirs we want symlinking to shared
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}
namespace :deploy do after :finishing, 'deploy:cleanup' end
ssh-add # 注意这是键盘左上角的「 `」不是单引号「 '」
set :passenger_restart_with_touch, true
在 config/deploy/production.rb 中配置具体的 stage 的 tasks
set :stage, :production # 部署的环境 set :branch, 'master' # 部署的代码分支 set :rails_env, :production
server 'xxx.xxx.xxx.xxx', user: "#{fetch(:deploy_user)}", roles: %w{app db web} # server 填域名或者服务器的 IP 地址
set :deploy_to, "/home/#{fetch(:deploy_user)}/apps/#{fetch(:application)}" # 部署到服务器的位置
set :enable_ssl, false 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 开始部署
在开发机器终端运行
$ cap production deploy --dry-run 或者 $ cap production deploy:check 1 2 使用 ssh deploy@your_server_ip 登入服务器,在deploy/home/apps/your_app_name/shared/config目录下新建 database.yml 和 secrets.yml
在服务器终端运行
$ touch ~/apps/your_app_name/shared/config/database.yml $ touch ~/apps/your_app_name/shared/config/secrets.yml 1 2 在开发机器项目目录下执行 rake secret 产生的 key 放到服务器的~/apps/your_app_name/shared/config/secrets.yml,范例如下:
production: secret_key_base: xxxxxxx........ 1 2 用 vim 编辑服务器文件 ~/apps/your_app_name/shared/config/database.yml,范例如下:
production: adapter: postgresql encoding: unicode database: your_app_database_name host: localhost pool: 25 username: postgres password: your_password 1 2 3 4 5 6 7 8 在开发机器终端执行部署命令
$ cap production deploy 1 在服务器重启 nginx h $ sudo service nginx restart 1 第七步:访问页面
在浏览器访问服务器的IP地址 或者 你的域名,没有意外的话就可以看到你项目的主页面了。
恭喜你!
参考网址: https://ihower.tw/rails/deployment-cn.html https://ruby-china.org/topics/18616 http://www.ruanyifeng.com/blog/2013/12/getting_started_with_postgresql.html
说明:本文仅用于学习,多处文本复制于参考文献,若涉及原作者版权,通知到本人将立即删除本文。
田文艺工作总结
- 上午:微信图文编辑推送
下午:视频编辑+微信内容编辑
张家琛工作总结
- 整理阿里云部署文档
记我的FW http://hideto.iteye.com/blog/1345323 博客分类: Life 2012年1月11日,我向现在的老大,清华的才子Peter提出了辞职,终于从FW大学毕业了。最近几天忙于离职手续,和同事们一一告别,今天才想起来该写篇东西回忆和纪念下。本文没有经过详细思考和整理,只是信手拈来,缺乏条理,很多想表达的可能一时半会也难以描述完全,而且可能内含煽情、三俗内容,如有不适,还望理解。
一切皆缘 2007毕业,那年春节,我回到老家,待了两三个月的样子,然后和大部分一样心怀梦想的年轻人一样,来到了北京做一个北漂。男儿志在四方,热血青年孤身背上行囊出去闯荡,这很符合我的性格。当时去了一家有几个师兄在的公司,也好有个照应。老板在苹果社区有一套大三居,就成了我们一伙人的员工宿舍。当时身上没多少钱,下了班去附近吃个饭,发现一碗面条要20多,身上带的钱都挺不到发第一个月工资,所以还找师兄借了点。后来开始领薪水才慢慢好起来。 我当时是技术狂,每天唯一感兴趣的事情就是专研各种技术,泡javaeye论坛,写博客,当时还在javaeye的博客点击率排名达到第二,仅次于站长robbin。后来发现Ruby慢慢火起来,恰好公司接了个Rails的项目,而我是这个项目的主要技术人员,就开始了我的Ruby之路。 在javaeye认识了曾经的Mr. Liu,现在的翔仔,当时大家是个小圈子,所谓北京最早的Ruby社区。2007年7月FW在北京的研发中心成立了,CTO DY看到了趋势,决定采用Ruby作为开发Web产品的技术。当时Mr. Liu和新浪的一哥们组织了次Ruby社区聚会(好像在北大借的会场,DY也是北大的校友,之后在美国留学并工作多年),我当时受Mr. Liu邀请去做了次演讲,然后DY也去了,给了我张名片,希望我去FW看看。然后我做完原来公司的Rails项目,就去FW和DY聊了下,发现FW做的东西很大,很有前景,于是便在2007年8月底加入了FW。 现在想来,要不是我当时正好学习Ruby开发,要不是原来公司接到Rails项目,要不是机缘巧合认识了Mr. Liu,要不是FW使用Ruby技术,要不是那次社区聚会,我可能没有后来在FW的四年。来FW还是要特别感谢Mr. Liu,不过现在竟然找不到一张合照。
成长之路,崎岖or顺利? 2008年元旦我们第一版的产品要上线,所以为了这个目标我们几乎连续加班了两个多月,每天工作到晚上11点多,公司在办公室附件安排了酒店,大家住的远的可以直接去酒店休息。就这样,在我们的坚持努力下终于顺利上线。大家到钱柜开了香槟庆祝。那个时候整个公司还不到20人的样子,每天在一起,累而充实,简单而快乐。 FW发展很快,越来越壮大,客户越来越多,产品需求和特性也越来越复杂。当时在Kevin的领导下,我参与了Web UI产品的很多开发工作,从一个经验缺乏的毕业新生,一步步学习和PM沟通,学习职业化的素质,学习规范化产品开发流程,学习技术架构设计,真的受益良多。我也一直很努力,毕竟这在当时对我来说是一份有很多挑战的工作。 应该说我的辛勤工作也是一直受到大家的认可,到了08年底,我被任命带个小team开始做一个相对独立的产品A(上任前DY单独请我吃了顿饭,让我很是激动)。终于可以放开手脚大干一场了。但是,经验不足!我们是从头开始做一个全新的产品,其中一些技术之前没做过,需要从头开始学,而且当时team里对产品的运维经验也很少。所以在这个过程中,也犯了不少错。还好,在一步步积累中,整个产品逐渐趋于稳定和成熟,team也积累了很多研发、运维、测试的经验。 在Kevin手下工作的几年,我的成长很快。但是慢慢性格弱点暴露出来,有时候会很急躁,呈现出High D类型,做事情有抵抗心理。和Kevin在一次meeting中竟然吵了起来,哈哈。还是太年轻了。 后来我所在整个team和后端BE部门合并,组成跨职能团队,大家工作起来效率更高了。Di成了新Boss。A产品2.0大版本的研发是一个里程碑。经过之前的不断经验积累,我们做2.0版本的时候从产品计划,研发流程,架构设计,风险控制,验收测试,运维监控,团队士气等方面都上了一个档次。Di其实对我们的管理属于比较放任型的,为我们铺平了道路,给我们最大化的权力,我们也放开了做事情,没有任何阻碍。我竭尽全力,百分百的投入到整个项目开发和团队协调。整个产品几乎完全重写,其中我占了大部分开发工作,写了几万行代码。当时还每个月带大家去楼下星巴克喝点东西做下回顾,整个团队的凝聚力和士气也是相当好。最后发布后也算是得到一个不错的评价,客户还算满意。当时的想法就是,大家团结一心,为了共同的目标,为了整个团队的荣誉,破釜沉舟大干一场,回头来看的时候,我们希望没有让公司失望过!哎,也算对得起自己挥洒热血的青春了。
我的巅峰时刻 做完A产品的2.0大版本后,Di找我聊,说有机会去别的部门换换岗位,做做更有挑战性的工作,我想了想,转到刚成立的Infrastructure部门吧,跟随首席架构师Jack老大和Peter老师学习学习做做基础架构工作,离产品和需求远一些,离技术更近一些。实事证明,来这个部分做的工作比之前更有挑战性也更有趣味。 Jack老大是当年的高考状元,技术牛的没得说,不是我们凡人俗子修炼几年就能达到的高度。Peter老师也是当年清华一大才子,多年的linux核心研究,技术狂人,曾经自己开过一家公司。两位老大之前的各种牛逼事迹恐怕一时半会也讲不完。 来INF部门后,我主导了整个Web大产品的Rails 1.x到3.x的升级,做了3个月,得到大家的一致好评;主导了Forecast数据仓库的schema设计和从MySQL到Infobright的迁移;完成了Web产品模块化和重构的大量工作。之前在做A产品的时候,积累了很多经验,在INF做的几个项目正好可以用上,结果也是令我自己比较满意。而且是在大半年之内做了这几个比较大的项目,这是之前没有过的。Jack老大的标准比较高,会让你不由自主的想把事情做的更快更好。 Peter老师多年的linux和c编程经验,而且所涉甚广。在Peter的带领下,我研究了leveldb和memcached的源码,解决一些底层扩展的问题,学习c++,非常有意思。所以在INF待的这大半年时间,我学到的东西和做的工作都是非常令人满意的,如果再待个两年,也许我有机会成为像Jack和Peter一样的一等一的技术高手。
纽约之行 2011年9月,公司安排我去纽约开会。这也是我第一次去美国,很开心。我们同行的几个同事,把纽约的著名景点,什么时代广场,百老汇,中央公园,华尔街,纽交所,铜牛,世贸大厦遗址,自由女神像,帝国大厦,各大博物馆等等都逛了一遍。我们去客户公司参观,在VEVO合影。我们和美国同事们一起聚餐,party,酒吧。非常愉快。 最重要的,我们在美国体验和美国同事们的工作方式,非常职业化,非常有激情,工作的时候非常认真,玩的时候非常放得开。我们也看到了在最前面每天直面客户的客户经理、产品经理、销售、技术支持的同事们做的工作,是我们在国内专注做产品研发的工作远远无法相像的。最大的感觉就是,做技术,写几行代码什么的,半夜起来on call什么的,真的很简单,不算事。压力都在美国同事那边。
我最爱的那些孩子们 最让我难忘的还是那帮损友、密友们。仍然记得我们一起开车去海边大吃海鲜,夜里在沙滩上喝着烈酒唱着歌吹着风快活的样子。无数次的聚餐,k歌,混着,走着。不用多说,你们懂的。 别怪我,要走了,真不知道该如何跟你们提起。以后有机会定会再聚的。
未来呢 感谢在FW的日子,学习了那么多知识,那么充实那么快乐。 感谢DY的照顾和提携,感谢Kevin的教导,感谢Di的信任,感谢Peter的帮助,感谢Free的鼓励,感谢Jack在纽约的床,感谢损友、密友、酒友们,感谢一起共事过的战友同事,感谢让我们哭和笑的日子。 DY刚得了千金,希望您一家生活幸福。 真心觉得FW是一家不错的公司。没有哪家公司很完美,但是FW从各方各面来讲比国内绝大部门公司要做的好多了。 之前就说过,我绝不后悔在我最年轻的时候把青春洒在FW。我没有让FW失望,FW也没有让我失望。 来北京不少年头了,当初的梦想要是再不提上日程,怕是以后没机会了。 我会回老家休息一下,思考思考,整理整理,然后重新新的开始。 在FW还会有很大的提升空间,薪资待遇也是绝对给力,但为了让自己以后不后悔,我还是决定出去。 年轻人谁没有点追求和理想呢?我的理想是三十岁之前能把自己的公司开起来,所以我要尽快上路,往这个方向走。 如果我现在不抓紧时间,三十岁之后有了老婆孩子,即使再有这个动力,也扛不住压力了。 所以大家要理解我,哈哈。
不管如何,在FW工作的这些年,已经深深烙入了我的记忆里。 多年后,想起FW的日子,也绝对是嘴角带着笑意。 等FW上市的时候,一定要来蹭杯酒喝!祝早日成功!
《壹百度》- 百度员工内部培训资料
(一)立业 1、人一定要做自己喜欢并擅长的事 内心的喜好是推动事业进步的最大动力,它能帮你克服困难,坚持到底;而如果你喜欢的事情有很 多,要挑选自己最擅长做的事,这样就能在感受快乐的同时也取得超乎常人的成就。
2、认准了,就去做;不跟风,不动摇 认准了,就去做讲的是判断力和行动力——要正确地判断形势与机会,一旦看准了,就要付诸行动,患得患失只能坐失良机;不跟风,不动摇讲的是远见与定力——能看到机会的人很多,但能坚持到底,不为眼前利益所动,不因一时困难变节的人却很少,所以多数人的成功都是昙花一现的。
3、专注如一 无论是企业或个人,都应该专注于自己的领域,并坚持到底。因为人的精力是有限的,企业可利用的资源也是有限的,唯有专注如一,将所有的力量施于一点,才能超越别人,取得持久而非凡的成就。
4、把事情做到极致 一家公司想要成为市场上的领导者,首先要有领导者的心态,那就是要坚信你做这件事能比所有人都做得好很多。在这种心态下,把每件事情都做到极致,你就能最终成为领导者。
(二)守正 5、少许诺多兑现 在对别人做出承诺的时候,一定要求实,讲真话,做得到再说。如果在承诺与交付的结合处画一条水平线的话,那么我们对别人做出的承诺应该低于这道线,而交付给人的结果则要高出这道线。因为做到的,永远比豪言壮语更有力量。
6、让数据说话 尊重数据就是尊重客观事实,数据有时也许片面,但它却诚实而不带情绪,因此可以排除一切人为的偏好因素,也因此让我们更接近真相。所以,请记住以下三条:第一,为一个伟大创意欢呼之前,请先用数据证明其可行性和对用户的价值所在;第二,一切工作的考核,都应以量化数据为标准;第三,数据面前,人人平等。
7、问题驱动 我们的每一步都应该是在解决问题的过程中前进。当一个新的idea 产生的时候,请先问一下自己,做这件事我能解决什么问题?然后,又会出现什么问题,如何解决?如果一个创意不能解决任何现实存在的问题,它就没有实现的价值。
8、不唯上 一个有活力与创造力的组织,一定会鼓励一线员工坚持自己的观点并敢于直接表达——即便这可能有悖于某些上级或权威的观点。只有这样才能让每个人的专业性与责任感真正发挥出来,避免企业犯经验主义的错误。
9、对事不对人 组织内最有效率的沟通方法,莫过于实事求是、坦诚相待了。坦诚地说出否定意见,需要的不仅仅是勇气,还有一颗公正的心——只关注事物本身的对错,而不是根据这件事是谁做的来给出不同的评判; 同时,也不要把对一件事情的评判直接引伸为对人的评价。
(三)出奇 10、创新求变 勇于创新和灵活应变,是企业持续发展、克敌制胜的原动力。然而随着企业规模的扩大和业务的成 熟,多数公司都会自然而然地倾向安于现状、保守行事。因此,如何永葆组织的创新激情与灵活求变精神,成为企业管理者的一项长期任务。
11、允许试错 伟大的创新有时就存在于某些看起来不成熟的想法里,所以要鼓励员工的每一次创新,舍得给他们机会去试错。有时候明知风险很大,仍然可以让他们去做。可以小规模地尝试,如果结果不好,退回来就是了,但试错中得到的宝贵经验却可以让团队大步成长。
12、迅速迭代,越变越美 在飞速发展的互联网行业里,产品是以用户为导向在随时演进的。因此,在推出一个产品之后要迅速收集用户需求进行产品的迭代——在演进的过程中注入用户需求的基因,完成快速的升级换代裂变成长, 才能让你的用户体验保持在最高水平。不要闭门造车以图一步到位,否则你的研发速度永远也赶不上需求的变化。
13、保持学习心态 在快速发展变化的时代里,如果不能够不断学习,就会被市场所淘汰。所以,企业的每一位员工, 都应该保持求知若渴、虚心若愚的学习心态,这是企业发展和进步的根本动力。
14、遇到新事物,先看看别人是怎么干的 “拿来主义”,是学习的一条捷径。工作中遇到新事物或新的困难时,不妨先看看别人是怎么做的, 这可能少走很多弯路,比自己闭门造车效果好得多。
(四)协同 15、高效率执行 在战场上,要想取得胜利,英明的将帅和具有顽强作战能力、能够迅速准确执行命令的军队缺一不可。在时间决定成败的互联网时代,企业也是一样,任何正确的决策是否能为企业带来优势,最终还是取决于整个团队的执行效率。
16、用流程解决共性问题 世界上没有一劳永逸的事,问题总是千姿百态,层出不穷,但我们永远应该做制造印钞机而非手工 打制铜钱的事情。遇到问题,多问几个为什么,找到根源,用系统的解决方案根除它,才可以为组织不断增强免疫力和提升工作效率。
17、你不是孤军 一个高效的组织,应该讲究协同作战,作为组织中的一员,在做项目的时候,应该想到,你拥有的 不仅仅是自己部门的资源,身边很多其他部门的资源都可以为我所用;而在你的日常工作中,也应该随时想到,自己的工作是否可以为身边的其他同事或团队提供帮助。当组织中的每一个成员都这样做的时候, 这个组织的整体效率就会是最高的。
18、打破部门樊篱 随着公司规模逐渐增大,本位主义与部门利益高于整体利益的现象也会自然而然地滋生。而这,也必将成为组织发展最大的阻碍。要想让几千人甚至几万人的公司仍然保持小公司的效率,公司各阶层的管理者们就必须不断去打破那些部门间的围墙与疆界。
19、主动分享 一个人的知识与阅历再丰富,其覆盖面也总是有限的,在一个真正的团队里,每个人都应该向后来者无私地分享团队已有的知识、经验与教训,让他/她站在前人肩膀上迅速成长。如果每个人都能做到主动分享,我们在一起就不再是加法,而是乘法了,团队的效率与“智商”才会不断提高。
(五)选才 20、一定要找最优秀的人才 企业对人才的选择往往决定着这个企业能走多远,如果要做一个世界级的优秀企业,那就要力争在全世界范围内找到最优秀的人才。
21、给最自由的空间 所谓管理者的职责,就是为优秀人才搭建一个自由、宽松的平台,因为人只有在自由的空间里,其创造力才能真正释放出来;也只有在独立自主地面对与解决问题的过程中,才能得到最高速的成 长。
22、证明自己,用结果说话 评定一个人是否称职或是否应该被提拔的最佳方法只有一个,那就是先给他一个平台、一份责任,看他是否能拿出实实在在的工作成果来证明自己。
23、一个人最重要的能力是判断力 面对快速变化的外部环境和快速发展的产业,如果能及时准确地把握产业机会,就可能规避风险并快速获得成功,这一切都取决于一个人的判断力。
24、每个人都要捡起地上的垃圾 勿以善小而不为,公司里任何一处小的不完美,都是你可以动手去改善的地方,而对公司而言,如果员工都愿意把公司的每件小事当成自己不可推御的责任,那么这家公司就没有理由不成功。
25、百度不仅是李彦宏的,更是每一个百度人的 一个成功的企业应该注重营造这样一种氛围,让每一个员工都觉得自己是企业的主人,将个人的事业发展融入企业目标中,与企业荣辱与共。
(六)察势 26、用户需求决定一切 如果你的技术是不被市场所需求的,那么它的价值就会很低。不要为了自己的喜好或虚荣心而开发炫 酷的产品或技术,决定一个产品好不好,一个技术是否有价值的,永远是用户,他们有需求,你就做,他们没有需求,你就不要做。
27、听多数人的意见,和少数人商量,自己做决定 决策是一个先民主后集中的过程——理越辩越明,一定要听取最广泛的意见,包括公司内外的一切专家与相关人士,然后与做这件事的核心人员商量,但最终的决定只能自己来做。是所谓谁负责,谁做主。
28、帮助别人,成就自己 百度对这个社会最大的价值就是帮助人们最便捷地找到所求。这些人不仅包括我们的用户,也包括我们的客户,以及我们客户的客户。正是在不断帮助别人的过程中,百度逐渐发展壮大起来。
29、公司离破产永远只有 30 天 无论一个公司取得多么大的成功,都别放下危机意识——哪怕片刻。所以,请记住,最好永远把自 己当做一家胸怀远大理想的小公司。