2012-01-24 40 views
61

lệnh terminal này khởi động lại ứng dụng Heroku tôi:Khởi động lại ứng dụng Heroku tôi tự động

heroku restart 

Có cách nào để chạy một kịch bản mà sẽ chạy lệnh này và khởi động lại ứng dụng của tôi mỗi giờ?

+0

Tôi có nhu cầu tương tự. Lý do của tôi là tôi đang cập nhật các bản dịch I18n trên cron, và cần khởi động lại ứng dụng để xóa bộ đệm I18n. –

+0

@Oded bạn nên chọn một câu trả lời, xin vui lòng, để mọi người không tiếp tục nhìn thấy điều này trong nguồn cấp dữ liệu của họ "chưa được trả lời". Cảm ơn! – WattsInABox

Trả lời

31

Tôi thực sự chỉ phải giải quyết vấn đề này cho các ứng dụng của mình và viết một bài đăng lên đó với nhiều chi tiết hơn. Về cơ bản, bạn cần đá quý heroku-api vì đá quý heroku được thay thế bằng CLI. Sau đó, bạn cần một công việc cào, một vài biến cấu hình và plugin lịch trình heroku (miễn phí ngoại trừ thời gian dyno tối thiểu).

Nhiệm vụ cào trông như thế này:

namespace :heroku do 
    desc 'restarts all the heroku dynos so we can control when they restart' 
    task :restart do 
    Heroku::API. 
     new(username: ENV['HEROKU_USERNAME'], password: ENV['HEROKU_PASSWORD']). 
     post_ps_restart(ENV['HEROKU_APP_NAME']) 
    end 
end 

Bạn cũng có thể thiết lập nó để sử dụng API của bạn thẻ thay vì đặt tên truy cập và mật khẩu của bạn vào config.Điều này chỉ quan trọng nếu bạn không muốn đồng cộng tác viên/đồng nghiệp của mình biết mật khẩu hoặc mật khẩu vào tài khoản chính của bạn trên Heroku.

heroku config:set HEROKU_USERNAME=[username] HEROKU_PASSWORD=[password] HEROKU_APP_NAME=[app_name] -a [app_name] 

Bây giờ, đi trước và triển khai và kiểm tra:

git push [heroku_remote_name] [feature_branch]:master 
heroku run rake heroku:restart -a [app_name] 

Cuối cùng, chúng tôi sẽ cần phải thiết lập các nhiệm vụ để chạy đúng tiến độ. Tôi đã chọn để đi với miễn phí Heroku cron add-on:

heroku addons:add scheduler:standard -a [app_name] 
heroku addons:open scheduler -a [app_name] 

này sẽ mở ra giao diện người dùng lên lịch trong trình duyệt của bạn và bạn có thể tạo một nhân viên lên kế hoạch để chạy các nhiệm vụ cào bất cứ khi nào bạn muốn. Chúng tôi chỉ cần nó một lần mỗi ngày và chúng tôi chọn chạy nó trước công việc được lên lịch đầu tiên trong ngày.

bài ban đầu của tôi với frigged lên CSS (xem Update2 dưới đây):

https://web.archive.org/web/20150612091315/http://engineering.korrelate.com/2013/08/21/restart-heroku-dynos-on-your-terms/

CẬP NHẬT

tôi đã thay đổi tên của nhiệm vụ từ "nổ tung" để "khởi động lại" là cách rõ ràng hơn về những gì đang xảy ra. Implode là một tên thú vị nhưng khá nhiều vô dụng khác.

UPDATE2

Rõ ràng công ty của tôi xóa bài đăng blog. Tôi đang thêm nhiều mã ở đây và tôi đã cập nhật liên kết, nhưng CSS trông giống như một chú chó đã ném nó lên. Lời xin lỗi của tôi.

+1

Dưới đây là một tác vụ cào sẵn sàng triển khai dựa trên giải pháp của bạn: https://github.com/demental/herokustarter. Lý do tôi cần điều này là vì tôi phải xóa một số ghi nhớ từ bên ngoài ứng dụng (I18n ActiveRecord Backend). Tôi không thể nhìn thấy bất kỳ cách nào khác. – demental

+1

lỗi trang web không tìm thấy khi mở liên kết. Bạn có thể cập nhật liên kết – coderVishal

+1

@coderVishal cảm ơn, tôi đã cập nhật bài đăng ngay bây giờ – WattsInABox

13

Bạn có thể tạo một công việc cron Heroku mà sử dụng api Heroku trên ứng dụng của bạn để tự khởi động lại ...

Một câu hỏi mặc dù - tại sao?

+8

Tôi bị rò rỉ bộ nhớ trong ứng dụng của mình và khởi động lại ứng dụng sẽ đặt lại mức sử dụng bộ nhớ. Vì vậy, đây có thể là bản sửa lỗi tạm thời cho đến khi chúng tôi khắc phục sự cố bộ nhớ. –

+3

bên cạnh cron add-on u có thể tạo một cron từ hệ thống địa phương ur hoặc bất kỳ máy chủ nào khác (tức là trực tiếp với internet) để chạy "khởi động lại heroku" hàng giờ. – Gull

+0

Lý do chính tôi nghĩ là có thứ gì đó như thế này là heroku khởi động lại mỗi dyno 24 giờ sau khi nó được đưa lên. Điều này sẽ khá nhiều là một thời gian ngẫu nhiên nếu bạn không làm gì cả. Thay vào đó, nếu bạn khởi động lại ứng dụng của mình vào thời gian riêng trong một số thời gian lưu lượng truy cập thấp, bạn có thể giảm thiểu tác động đến doanh nghiệp của mình. OP cho biết "mỗi giờ" nhưng các giải pháp này có thể được điều chỉnh cho bất kỳ khung thời gian khởi động lại nào. – WattsInABox

5

Tập lệnh không cần thiết, chỉ cần "trục trặc" ứng dụng của bạn và Heroku sẽ khởi động lại.

Chỉ cần không thực hiện việc này thường xuyên hơn mười phút một lần hoặc Heroku sẽ khiến bạn mất thời gian chờ 10 phút.

Trong node.js bạn thực hiện việc này với process.exit(0).

Từ Chris tại Heroku Hỗ trợ:

Một đâm Dyno sẽ được khởi động lại ngay lập tức. Nếu dyno di chuyển từ trạng thái bị lỗi thành trạng thái "lên" (nghĩa là dyno được liên kết với $ PORT) thì đó là trạng thái hoạt động bình thường. Nếu nó bị treo một lần nữa trong khi khởi động hoặc "bắt đầu" trình tự sau đó nó sẽ không được khởi động lại một lần nữa cho đến sau thời gian TIMEOUT. Thời gian TIMEOUT là hiện tại là 10 phút nhưng có thể thay đổi. Điều này ngăn cản các dynos liên tục bị rơi do tải không liên quan trên nền tảng .

Tuy nhiên, tốt như âm thanh, nó không hoạt động trong thực tế. Bạn sẽ đạt thời gian chờ mỗi khi bạn thoát vì người quản lý Dyno hy vọng ứng dụng của bạn để thể lên:

Đối với quản lý quá trình lao động của bạn, bạn đang thoát khỏi quá trình sạch nhưng nền tảng này được mong đợi các Dyno là lên. Nghe có vẻ như bạn đang về cơ bản đã xảy ra lỗi dyno.

Vì vậy, một lần nữa, nếu bạn cần khởi động lại định kỳ - và khoảng thời gian đó có thể được đặt thành> 10 phút - đây là cách dễ dàng và đơn giản để quản lý xóa bộ nhớ. Nếu bạn cần khởi động lại động (ví dụ, khi nhàn rỗi được phát hiện) hoặc thường xuyên, bạn sẽ cần phải khám phá các tùy chọn khác.

Bạn có thể truy cập tên của dyno (ví dụ: "worker.3", "web.1") thông qua biến môi trường "PS" và đưa ra lệnh khởi động lại API heroku theo chương trình.

+3

Điều này là cần thiết đối với một số người, trong trường hợp của chúng tôi, ứng dụng của chúng tôi mất 80 giây để khởi động trên heroku và khi họ thực hiện các chuỗi dyno tự động hàng ngày, nó gây ra lỗi hết thời gian chờ cho người dùng. Nếu chúng ta khởi động lại heroku, nó sẽ sử dụng preboot, và các dynos sẽ hoạt động trước khi chúng được lưu thông. –

2

Lấy cảm hứng từ https://www.stormconsultancy.co.uk/blog/development/ruby-on-rails/automatically-restart-struggling-heroku-dynos-using-logentries/

# Setup 
heroku plugins:install https://github.com/heroku/heroku-oauth 
heroku authorizations:create -s write 
heroku config:add RESTART_API_KEY=<API KEY> 
heroku config:add APP_NAME=<App Name> 

heroku addons:add scheduler:standard -a <App Name> 
heroku addons:open scheduler -a <App Name> 
add `rake restart` 

# Gemfile 
gem 'platform-api', require: false 

# Rakefile 
task :restart do 
    require 'platform-api' 
    app_name = ENV.fetch('APP_NAME') 
    key = ENV.fetch('RESTART_API_KEY') 
    connection = PlatformAPI.connect_oauth(key) 
    connection.dyno.list(app_name).map do |info| 
    if info['type'] == 'web' && info['state'] == 'up' 
     puts "Restarting #{info.inspect}" 
     connection.dyno.restart(app_name, info['name']) 
    else 
     puts "Skipping #{info.inspect}" 
    end 
    end 
end 
+0

Đã bao giờ thử nghiệm và xác nhận để làm việc? –

+1

vẫn còn sử dụng nó ngay hôm nay, vì vậy có :) – grosser

+0

Tôi có thể xác nhận rằng nó hoạt động như dự định. <3 –

-1

Theo như tôi có thể nói, chỉ cần chạy heroku ps:restart --app APPNAME trong Heroku Scheduler add-on hoạt động tốt. Nó không rõ ràng với tôi tại sao các bước bổ sung trong câu trả lời khác là cần thiết.

+0

Tôi vừa thử điều này và không có khởi động lại dyno. Nhật ký Heroku cho trình lên lịch cho thấy lệnh không thành công. Không có nhị phân "heroku" trên dynos. Bạn có thể thử nó bằng cách làm 'heroku chạy bash' trong một thiết bị đầu cuối và sau đó cố gắng chạy các lệnh heroku. Có lẽ bạn có một số buildpack đặc biệt, hoặc trên một số stack đặc biệt? Tôi đang ở trên tuyết tùng-14. –

+0

Xin lỗi vì trả lời muộn. Tôi có một vài ứng dụng trên Heroku (tất cả trên cedar-14), một số trong Ruby và một số trong Go. Tôi vừa thử nghiệm 'heroku ps: restart - app APPNAME' trên dyno Ruby của tôi với Heroku Scheduler và nó hoạt động. Tôi cũng đã thử 'heroku run bash' trên dyno đó và có thể thực hiện các lệnh' heroku' bên trong nó. Tôi không sử dụng bất kỳ gói xây dựng đặc biệt nào, chỉ cấu hình mặc định cho các ứng dụng Rails. Tôi đã làm, tuy nhiên, hãy thử điều tương tự trên một ứng dụng Go và lệnh 'heroku' không có sẵn. Vì vậy, nó phải được bao gồm trong buildpack Ruby (và có lẽ những người khác) nhưng không phải tất cả chúng. –

+0

Aha, thật kỳ lạ. Tôi đã thử nó trong một ứng dụng Rails (vì vậy nó có một bộ xây dựng Ruby - tôi nghĩ nó đặc biệt hơn là Ruby 2.2.5) và ở đó tôi đã phải thêm riêng bộ công cụ heroku-buildpack-toolbelt. –

5

Chúng tôi đã giải quyết vấn đề này bằng cách sử dụng tệp dựng sẵn để có được lệnh heroku có sẵn cho chính dyno, sau đó sử dụng Trình lập lịch Heroku.

Chúng tôi bổ sung thêm https://github.com/gregburek/heroku-buildpack-toolbelt buildpack theo hướng dẫn của nó:

heroku buildpacks:add https://github.com/gregburek/heroku-buildpack-toolbelt.git 
heroku config:add HEROKU_TOOLBELT_API_EMAIL=`heroku whoami` 
heroku config:add HEROKU_TOOLBELT_API_PASSWORD=`heroku auth:token` 

Sau đó chắc chắn sên ứng dụng được xây dựng lại theo hướng dẫn:

git push heroku master 

Trong Heroku Scheduler, chúng tôi đã thêm này như một công việc theo giờ :

vendor/heroku-toolbelt/bin/heroku ps:restart -a $HEROKU_APP_NAME 

Bạn có thể xác định xem nó có hoạt động hay không bằng cách tìm kiếm fo r Lập lịch trình đầu ra trong các bản ghi Heroku, và tất nhiên bằng biểu đồ bộ nhớ của ứng dụng trong bảng điều khiển Heroku (nếu bạn đang khởi động lại để làm việc xung quanh một rò rỉ bộ nhớ).

+0

Chúng tôi đã chuyển sang buildpack này không được dùng nữa: https://github.com/heroku/heroku-buildpack-cli Cấu hình của nó hơi khác một chút. –

+0

Lưu ý rằng https://github.com/heroku/heroku-buildpack-cli sử dụng một đường dẫn khác cho nhị phân 'heroku' của nó. –

2

Tôi đã giải quyết vấn đề này bằng tập lệnh lệnh curl rất đơn giản trong repo được kích hoạt bằng cách sử dụng free Heroku scheduler.

#!/bin/sh curl -X DELETE "https://api.heroku.com/apps/${HEROKU_APP_NAME}/dynos" \ --user "${HEROKU_CLI_USER}:${HEROKU_CLI_TOKEN}" \ -H "Content-Type: application/json" \ -H "Accept: application/vnd.heroku+json; version=3"

Xem https://gist.github.com/mattheworiordan/f052b7693aacd025f025537418fa5708.

Các vấn đề liên quan