{"id":1223,"date":"2025-03-24T08:52:33","date_gmt":"2025-03-23T23:52:33","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=1223"},"modified":"2025-03-24T08:52:33","modified_gmt":"2025-03-23T23:52:33","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91capistrano%e3%81%a7%e5%ae%9f%e7%8f%be%e3%81%99%e3%82%8b5%e3%82%b9%e3%83%86%e3%83%83%e3%83%97%e3%81%ae%e6%9c%80%e5%bc%b7ruby%e3%83%87%e3%83%97%e3%83%ad","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=1223","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Capistrano\u3067\u5b9f\u73fe\u3059\u308b5\u30b9\u30c6\u30c3\u30d7\u306e\u6700\u5f37Ruby\u30c7\u30d7\u30ed\u30a4\u81ea\u52d5\u5316\u30ac\u30a4\u30c9"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Capistrano\u3068\u306f\uff1f\u30c7\u30d7\u30ed\u30a4\u81ea\u52d5\u5316\u306e\u6c7a\u5b9a\u7248\u30c4\u30fc\u30eb\u3092\u5fb9\u5e95\u89e3\u8aac<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">Ruby\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u6700\u9069\u306a\u81ea\u52d5\u30c7\u30d7\u30ed\u30a4\u30c4\u30fc\u30eb<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-2\">\u4e3b\u8981\u306a\u6a5f\u80fd\u3068\u7279\u5fb4\u3092\u7406\u89e3\u3057\u3088\u3046<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-8\">Capistrano\u306b\u3088\u308b\u30c7\u30d7\u30ed\u30a4\u81ea\u52d5\u5316\u306e\u5177\u4f53\u7684\u30e1\u30ea\u30c3\u30c8<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-9\">\u624b\u4f5c\u696d\u30c7\u30d7\u30ed\u30a4\u3068\u6bd4\u8f03\u3057\u305f\u5de5\u6570\u524a\u6e1b\u52b9\u679c<\/a>      <\/li>      <li>        <a href=\"#i-11\">\u30d2\u30e5\u30fc\u30de\u30f3\u30a8\u30e9\u30fc\u306e\u30ea\u30b9\u30af\u3092\u5927\u5e45\u306b\u4f4e\u6e1b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-12\">\u30c1\u30fc\u30e0\u5168\u4f53\u306e\u30c7\u30d7\u30ed\u30a4\u54c1\u8cea\u304c\u5411\u4e0a\u3059\u308b\u7406\u7531<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-17\">\u74b0\u5883\u69cb\u7bc9\u304b\u3089\u30c7\u30d7\u30ed\u30a4\u307e\u3067\u306e5\u30b9\u30c6\u30c3\u30d7<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-18\">1. Capistrano\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u521d\u671f\u8a2d\u5b9a<\/a>      <\/li>      <li>        <a href=\"#i-19\">2. \u30c7\u30d7\u30ed\u30a4\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u4f5c\u6210\u3068\u69cb\u6210<\/a>      <\/li>      <li>        <a href=\"#i-20\">3. \u672c\u756a\u74b0\u5883\u306e\u63a5\u7d9a\u8a2d\u5b9a\u3068SSH\u30ad\u30fc\u306e\u7ba1\u7406<\/a>      <\/li>      <li>        <a href=\"#i-21\">4. \u30c7\u30d7\u30ed\u30a4\u30bf\u30b9\u30af\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-22\">5. \u81ea\u52d5\u30c7\u30d7\u30ed\u30a4\u306e\u5b9f\u884c\u3068\u30ed\u30b0\u306e\u78ba\u8a8d<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-23\">\u73fe\u5834\u3067\u5f79\u7acb\u3064Capistrano\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-24\">\u30c7\u30d7\u30ed\u30a4\u5931\u6557\u3092\u9632\u3050\u305f\u3081\u306e\u8a2d\u5b9a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-27\">\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u6a5f\u80fd\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528\u8853<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-30\">\u5927\u898f\u6a21\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306e\u904b\u7528\u306e\u30b3\u30c4<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-34\">\u5b9f\u8df5\u7684\u306a\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u96c6<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-35\">\u3088\u304f\u3042\u308b\u30c7\u30d7\u30ed\u30a4\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-39\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u305f\u3081\u306e\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-42\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u305f\u8a2d\u5b9a\u306e\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-46\">Capistrano\u3092\u4f7f\u3063\u305f\u7d99\u7d9a\u7684\u30c7\u30ea\u30d0\u30ea\u30fc\u306e\u5b9f\u73fe<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-47\">CI\/CD\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-50\">\u81ea\u52d5\u30c6\u30b9\u30c8\u3068\u306e\u52b9\u679c\u7684\u306a\u7d44\u307f\u5408\u308f\u305b\u65b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-53\">\u30c7\u30d7\u30ed\u30a4\u76e3\u8996\u3068\u901a\u77e5\u306e\u8a2d\u5b9a\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">Capistrano\u3068\u306f\uff1f\u30c7\u30d7\u30ed\u30a4\u81ea\u52d5\u5316\u306e\u6c7a\u5b9a\u7248\u30c4\u30fc\u30eb\u3092\u5fb9\u5e95\u89e3\u8aac<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">Ruby\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u6700\u9069\u306a\u81ea\u52d5\u30c7\u30d7\u30ed\u30a4\u30c4\u30fc\u30eb<\/h3>\n\n\n\n<p>Capistrano\u306f\u3001Ruby\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u3067\u5e83\u304f\u63a1\u7528\u3055\u308c\u3066\u3044\u308b\u30c7\u30d7\u30ed\u30a4\u81ea\u52d5\u5316\u30c4\u30fc\u30eb\u3067\u3059\u30022009\u5e74\u306bJamis Buck\u6c0f\u306b\u3088\u3063\u3066\u958b\u767a\u304c\u958b\u59cb\u3055\u308c\u3001\u73fe\u5728\u3082\u6d3b\u767a\u306b\u958b\u767a\u304c\u7d9a\u3051\u3089\u308c\u3066\u3044\u307e\u3059\u3002\u7279\u306bRuby on Rails\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3068\u306e\u89aa\u548c\u6027\u304c\u9ad8\u304f\u3001\u591a\u304f\u306e\u4f01\u696d\u306e\u672c\u756a\u74b0\u5883\u3067\u5229\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>Capistrano\u306e\u57fa\u672c\u7684\u306a\u4ed5\u7d44\u307f\u306f\u3001SSH\u3092\u4f7f\u7528\u3057\u3066\u30ea\u30e2\u30fc\u30c8\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3057\u3001\u4e8b\u524d\u306b\u5b9a\u7fa9\u3055\u308c\u305f\u4e00\u9023\u306e\u30bf\u30b9\u30af\u3092\u5b9f\u884c\u3059\u308b\u3053\u3068\u3067\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30c7\u30d7\u30ed\u30a4\u4f5c\u696d\u3092\u81ea\u52d5\u5316\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Git\u30ea\u30dd\u30b8\u30c8\u30ea\u304b\u3089\u306e\u6700\u65b0\u30b3\u30fc\u30c9\u306e\u53d6\u5f97<\/li>\n\n\n\n<li>\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u30a2\u30bb\u30c3\u30c8\u306e\u30d7\u30ea\u30b3\u30f3\u30d1\u30a4\u30eb<\/li>\n\n\n\n<li>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d0\u30fc\u306e\u518d\u8d77\u52d5<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">\u4e3b\u8981\u306a\u6a5f\u80fd\u3068\u7279\u5fb4\u3092\u7406\u89e3\u3057\u3088\u3046<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-3\">1. \u67d4\u8edf\u306a\u30bf\u30b9\u30af\u5b9a\u7fa9<\/h4>\n\n\n\n<p>Capistrano\u3067\u306f\u3001\u72ec\u81ea\u306e\u30c7\u30d7\u30ed\u30a4\u30bf\u30b9\u30af\u3092\u7c21\u5358\u306b\u5b9a\u7fa9\u3067\u304d\u307e\u3059\u3002\u4ee5\u4e0b\u306f\u57fa\u672c\u7684\u306a\u30bf\u30b9\u30af\u5b9a\u7fa9\u306e\u4f8b\u3067\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># config\/deploy.rb\nnamespace :deploy do\n  desc '\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u518d\u8d77\u52d5'\n  task :restart do\n    on roles(:app) do\n      execute :touch, release_path.join('tmp\/restart.txt')\n    end\n  end\n\n  desc '\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9'\n  task :upload_database_yml do\n    on roles(:app) do\n      execute :mkdir, '-p', \"#{shared_path}\/config\"\n      upload! 'config\/database.yml', \"#{shared_path}\/config\/database.yml\"\n    end\n  end\nend<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-4\">2. \u30de\u30eb\u30c1\u30b9\u30c6\u30fc\u30b8\u30c7\u30d7\u30ed\u30a4\u5bfe\u5fdc<\/h4>\n\n\n\n<p>\u958b\u767a\u74b0\u5883\u3001\u30b9\u30c6\u30fc\u30b8\u30f3\u30b0\u74b0\u5883\u3001\u672c\u756a\u74b0\u5883\u306a\u3069\u3001\u8907\u6570\u306e\u74b0\u5883\u306b\u5bfe\u3059\u308b\u30c7\u30d7\u30ed\u30a4\u8a2d\u5b9a\u3092\u500b\u5225\u306b\u7ba1\u7406\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># config\/deploy\/production.rb\nserver 'production.example.com',\n  user: 'deploy',\n  roles: %w{app db web},\n  ssh_options: {\n    keys: %w(\/home\/user\/.ssh\/id_rsa),\n    forward_agent: true\n  }\n\n# config\/deploy\/staging.rb\nserver 'staging.example.com',\n  user: 'deploy',\n  roles: %w{app db web}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-5\">3. \u30ed\u30fc\u30eb\u30d9\u30fc\u30b9\u306e\u5b9f\u884c\u5236\u5fa1<\/h4>\n\n\n\n<p>\u30b5\u30fc\u30d0\u30fc\u3054\u3068\u306b\u5f79\u5272\uff08\u30ed\u30fc\u30eb\uff09\u3092\u5b9a\u7fa9\u3057\u3001\u7279\u5b9a\u306e\u30bf\u30b9\u30af\u3092\u7279\u5b9a\u306e\u30ed\u30fc\u30eb\u3092\u6301\u3064\u30b5\u30fc\u30d0\u30fc\u3067\u306e\u307f\u5b9f\u884c\u3059\u308b\u3088\u3046\u306b\u5236\u5fa1\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d0\u30fc\u306e\u307f\u3067\u5b9f\u884c\non roles(:app) do\n  # \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u56fa\u6709\u306e\u30bf\u30b9\u30af\nend\n\n# \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b5\u30fc\u30d0\u30fc\u306e\u307f\u3067\u5b9f\u884c\non roles(:db) do\n  # \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u95a2\u9023\u306e\u30bf\u30b9\u30af\nend<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-6\">4. \u5f37\u529b\u306a\u30d5\u30c3\u30af\u6a5f\u80fd<\/h4>\n\n\n\n<p>\u30c7\u30d7\u30ed\u30a4\u306e\u5404\u30d5\u30a7\u30fc\u30ba\u3067\u72ec\u81ea\u306e\u51e6\u7406\u3092\u631f\u307f\u8fbc\u3080\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30c7\u30d7\u30ed\u30a4\u958b\u59cb\u524d\u306e\u51e6\u7406\nbefore 'deploy:starting', 'check_write_permissions'\n\n# \u30c7\u30d7\u30ed\u30a4\u5b8c\u4e86\u5f8c\u306e\u51e6\u7406\nafter 'deploy:finished', 'notify_slack'\n\n# \u7279\u5b9a\u306e\u30bf\u30b9\u30af\u306e\u524d\u5f8c\u3067\u5b9f\u884c\nbefore :deploy, 'deploy:check_write_permissions'\nafter  :deploy, 'deploy:cleanup'<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-7\">5. \u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406\u3068\u9ad8\u901f\u30ed\u30fc\u30eb\u30d0\u30c3\u30af<\/h4>\n\n\n\n<p>Capistrano\u306f\u3001\u30c7\u30d7\u30ed\u30a4\u3055\u308c\u305f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u7ba1\u7406\u3057\u3001\u554f\u984c\u304c\u767a\u751f\u3057\u305f\u5834\u5408\u306b\u4ee5\u524d\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3078\u7d20\u65e9\u304f\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u3067\u304d\u308b\u6a5f\u80fd\u3092\u5099\u3048\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u6700\u65b0\u306e\u30c7\u30d7\u30ed\u30a4\u3092\u53d6\u308a\u6d88\u3057\u3001\u524d\u56de\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u306b\u623b\u3059\ncap production deploy:rollback<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6a5f\u80fd\u306b\u3088\u308a\u3001Capistrano\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u7279\u5fb4\u3092\u6301\u3064\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u7279\u306b\u5a01\u529b\u3092\u767a\u63ee\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8907\u6570\u306e\u30b5\u30fc\u30d0\u30fc\u306b\u30c7\u30d7\u30ed\u30a4\u304c\u5fc5\u8981\u306a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8<\/li>\n\n\n\n<li>\u5b9a\u671f\u7684\u306a\u30c7\u30d7\u30ed\u30a4\u304c\u767a\u751f\u3059\u308b\u30a2\u30b8\u30e3\u30a4\u30eb\u958b\u767a\u74b0\u5883<\/li>\n\n\n\n<li>\u8907\u96d1\u306a\u30c7\u30d7\u30ed\u30a4\u624b\u9806\u3092\u6301\u3064\u30a8\u30f3\u30bf\u30fc\u30d7\u30e9\u30a4\u30ba\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u9ad8\u53ef\u7528\u6027\u304c\u6c42\u3081\u3089\u308c\u308b\u30df\u30c3\u30b7\u30e7\u30f3\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u306a\u30b7\u30b9\u30c6\u30e0<\/li>\n<\/ul>\n\n\n\n<p>Capistrano\u306f\u5358\u306a\u308b\u30c7\u30d7\u30ed\u30a4\u30c4\u30fc\u30eb\u3067\u306f\u306a\u304f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30e9\u30a4\u30d5\u30b5\u30a4\u30af\u30eb\u7ba1\u7406\u3092\u652f\u63f4\u3059\u308b\u7dcf\u5408\u7684\u306a\u81ea\u52d5\u5316\u57fa\u76e4\u3068\u3057\u3066\u6a5f\u80fd\u3057\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u306e\u30c4\u30fc\u30eb\u3092\u5c0e\u5165\u3059\u308b\u3053\u3068\u3067\u5f97\u3089\u308c\u308b\u5177\u4f53\u7684\u306a\u30e1\u30ea\u30c3\u30c8\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-8\">Capistrano\u306b\u3088\u308b\u30c7\u30d7\u30ed\u30a4\u81ea\u52d5\u5316\u306e\u5177\u4f53\u7684\u30e1\u30ea\u30c3\u30c8<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u624b\u4f5c\u696d\u30c7\u30d7\u30ed\u30a4\u3068\u6bd4\u8f03\u3057\u305f\u5de5\u6570\u524a\u6e1b\u52b9\u679c<\/h3>\n\n\n\n<p>\u5f93\u6765\u306e\u624b\u52d5\u30c7\u30d7\u30ed\u30a4\u30d7\u30ed\u30bb\u30b9\u3068\u6bd4\u8f03\u3057\u3066\u3001Capistrano\u306b\u3088\u308b\u81ea\u52d5\u5316\u3067\u306f\u5927\u5e45\u306a\u5de5\u6570\u524a\u6e1b\u304c\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u5177\u4f53\u7684\u306a\u6bd4\u8f03\u30c7\u30fc\u30bf\u3092\u793a\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-10\">\u30c7\u30d7\u30ed\u30a4\u4f5c\u696d\u6642\u9593\u306e\u6bd4\u8f03<\/h4>\n\n\n<div id=\"id-042505cb-5335-411c-b7ae-ba373b19539c\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u4f5c\u696d\u5185\u5bb9<\/th><th>\u624b\u52d5\u30c7\u30d7\u30ed\u30a4<\/th><th>Capistrano\u5229\u7528<\/th><th>\u524a\u6e1b\u6642\u9593<\/th><\/tr><\/thead><tbody><tr><td>\u30b3\u30fc\u30c9\u306e\u914d\u7f6e<\/td><td>15-20\u5206<\/td><td>2-3\u5206<\/td><td>\u7d0485%<\/td><\/tr><tr><td>\u4f9d\u5b58\u95a2\u4fc2\u306e\u89e3\u6c7a<\/td><td>10-15\u5206<\/td><td>3-4\u5206<\/td><td>\u7d0475%<\/td><\/tr><tr><td>\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u914d\u7f6e<\/td><td>5-10\u5206<\/td><td>1\u5206\u4ee5\u4e0b<\/td><td>\u7d0490%<\/td><\/tr><tr><td>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u518d\u8d77\u52d5<\/td><td>5-10\u5206<\/td><td>1\u5206\u4ee5\u4e0b<\/td><td>\u7d0490%<\/td><\/tr><tr><td><strong>\u5408\u8a08<\/strong><\/td><td><strong>35-55\u5206<\/strong><\/td><td><strong>7-9\u5206<\/strong><\/td><td><strong>\u7d0485%<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u3053\u306e\u6642\u9593\u524a\u6e1b\u306b\u3088\u308a\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5177\u4f53\u7684\u306a\u30e1\u30ea\u30c3\u30c8\u304c\u751f\u307e\u308c\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30ea\u30fc\u30b9\u983b\u5ea6\u306e\u5411\u4e0a\uff08\u90311\u56de\u2192\u6bce\u65e5\u53ef\u80fd\u306b\uff09<\/li>\n\n\n\n<li>\u958b\u767a\u8005\u306e\u4f5c\u696d\u6642\u9593\u306e\u6709\u52b9\u6d3b\u7528<\/li>\n\n\n\n<li>\u6025\u306a\u30d0\u30b0\u4fee\u6b63\u3078\u306e\u8fc5\u901f\u306a\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u30c7\u30d7\u30ed\u30a4\u5f85\u3061\u6642\u9593\u306e\u524a\u6e1b\u306b\u3088\u308bCI\/CD\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306e\u52b9\u7387\u5316<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u30d2\u30e5\u30fc\u30de\u30f3\u30a8\u30e9\u30fc\u306e\u30ea\u30b9\u30af\u3092\u5927\u5e45\u306b\u4f4e\u6e1b<\/h3>\n\n\n\n<p>\u624b\u52d5\u30c7\u30d7\u30ed\u30a4\u3067\u3088\u304f\u767a\u751f\u3059\u308b\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30df\u30b9\u3092\u3001\u81ea\u52d5\u5316\u306b\u3088\u308a\u9632\u6b62\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u914d\u7f6e\u5fd8\u308c<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># config\/deploy.rb\nappend :linked_files, \n  'config\/database.yml',\n  'config\/master.key',\n  '.env'<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30c7\u30d7\u30ed\u30a4\u624b\u9806\u306e\u5b9f\u884c\u9806\u5e8f\u30df\u30b9<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u81ea\u52d5\u7684\u306b\u6b63\u3057\u3044\u9806\u5e8f\u3067\u5b9f\u884c\nbefore 'deploy:assets:precompile', 'deploy:yarn_install'\nafter 'deploy:updated', 'deploy:migrate'<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u74b0\u5883\u56fa\u6709\u306e\u8a2d\u5b9a\u5fd8\u308c<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># config\/deploy\/production.rb\nset :rails_env, 'production'\nset :branch, 'main'\nset :keep_releases, 5<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u81ea\u52d5\u5316\u306b\u3088\u308a\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5177\u4f53\u7684\u306a\u6539\u5584\u304c\u898b\u3089\u308c\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30d7\u30ed\u30a4\u5931\u6557\u7387: 20%\u21921%\u672a\u6e80\u306b\u4f4e\u4e0b<\/li>\n\n\n\n<li>\u8a2d\u5b9a\u30df\u30b9\u306b\u3088\u308b\u30c0\u30a6\u30f3\u30bf\u30a4\u30e0: \u6708\u5e73\u57472\u6642\u9593\u2192\u307b\u307c\u30bc\u30ed\u306b<\/li>\n\n\n\n<li>\u7dca\u6025\u5bfe\u5fdc\u306e\u5fc5\u8981\u6027: \u6708\u5e73\u57473-4\u56de\u21921\u56de\u672a\u6e80\u306b\u6e1b\u5c11<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-12\">\u30c1\u30fc\u30e0\u5168\u4f53\u306e\u30c7\u30d7\u30ed\u30a4\u54c1\u8cea\u304c\u5411\u4e0a\u3059\u308b\u7406\u7531<\/h3>\n\n\n\n<p>Capistrano\u306e\u5c0e\u5165\u306f\u3001\u5358\u306a\u308b\u81ea\u52d5\u5316\u4ee5\u4e0a\u306e\u52b9\u679c\u3092\u30c1\u30fc\u30e0\u306b\u3082\u305f\u3089\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-13\">1. \u6a19\u6e96\u5316\u3055\u308c\u305f\u5b9f\u884c\u74b0\u5883<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30b5\u30fc\u30d0\u30fc\u74b0\u5883\u306e\u4e00\u8cab\u6027\u3092\u78ba\u4fdd\nset :rbenv_type, :user\nset :rbenv_ruby, '3.2.2'\nset :rbenv_prefix, \"RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}\/bin\/rbenv exec\"<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-14\">2. \u900f\u660e\u6027\u306e\u5411\u4e0a<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30d7\u30ed\u30a4\u30ed\u30b0\u306e\u81ea\u52d5\u8a18\u9332<\/li>\n\n\n\n<li>\u5b9f\u884c\u3055\u308c\u305f\u64cd\u4f5c\u306e\u53ef\u8996\u5316<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u767a\u751f\u6642\u306e\u539f\u56e0\u7279\u5b9a\u304c\u5bb9\u6613<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-15\">3. \u77e5\u8b58\u306e\u5171\u6709\u3068\u79fb\u8ee2<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30bf\u30b9\u30af\u306e\u8aac\u660e\u3092\u30b3\u30fc\u30c9\u306b\u8a18\u8ff0\ndesc 'Nginx\u306e\u8a2d\u5b9a\u3092\u66f4\u65b0\u3057\u518d\u8d77\u52d5'\ntask :update_nginx_config do\n  on roles(:web) do\n    # \u30bf\u30b9\u30af\u306e\u5185\u5bb9\u304c\u660e\u78ba\u306b\u8a18\u8ff0\u3055\u308c\u308b\n    execute :sudo, :cp, 'nginx.conf', '\/etc\/nginx\/sites-available\/app'\n    execute :sudo, 'systemctl restart nginx'\n  end\nend<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-16\">4. \u30c1\u30fc\u30e0\u5168\u4f53\u306e\u751f\u7523\u6027\u5411\u4e0a<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u65b0\u30e1\u30f3\u30d0\u30fc\u306e\u5b66\u7fd2\u66f2\u7dda\u306e\u77ed\u7e2e\uff081\u30f6\u6708\u21921\u9031\u9593\uff09<\/li>\n\n\n\n<li>\u30c7\u30d7\u30ed\u30a4\u95a2\u9023\u306e\u8cea\u554f\u5bfe\u5fdc\u6642\u9593\u306e\u524a\u6e1b\uff08\u9031\u5e73\u57475\u6642\u9593\u21921\u6642\u9593\uff09<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u9593\u306e\u9023\u643a\u5f37\u5316\uff08\u958b\u767a\u30fb\u904b\u7528\u30fbQA\u306e\u9023\u643a\u304c\u30b9\u30e0\u30fc\u30ba\u306b\uff09<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6539\u5584\u306b\u3088\u308a\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u7d44\u7e54\u7684\u306a\u52b9\u679c\u304c\u5f97\u3089\u308c\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30ea\u30fc\u30b9\u30b5\u30a4\u30af\u30eb\u306e\u77ed\u7e2e\uff08\u67082\u56de\u2192\u90313\u56de\u306b\u5897\u52a0\uff09<\/li>\n\n\n\n<li>\u30c7\u30d7\u30ed\u30a4\u95a2\u9023\u306e\u6280\u8853\u7684\u8ca0\u50b5\u306e\u524a\u6e1b<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u306e\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u5411\u4e0a\uff08\u65b0\u898f\u30e1\u30f3\u30d0\u30fc\u306e\u8ffd\u52a0\u304c\u30b9\u30e0\u30fc\u30ba\u306b\uff09<\/li>\n\n\n\n<li>\u904b\u7528\u30b3\u30b9\u30c8\u306e\u6700\u592740%\u524a\u6e1b<\/li>\n<\/ul>\n\n\n\n<p>\u4ee5\u4e0a\u306e\u30e1\u30ea\u30c3\u30c8\u306f\u3001\u7279\u306b\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u72b6\u6cc1\u3067\u9855\u8457\u306a\u52b9\u679c\u3092\u767a\u63ee\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u306e\u904b\u7528<\/li>\n\n\n\n<li>\u8907\u6570\u74b0\u5883\uff08\u958b\u767a\u30fb\u30b9\u30c6\u30fc\u30b8\u30f3\u30b0\u30fb\u672c\u756a\uff09\u306e\u7ba1\u7406<\/li>\n\n\n\n<li>\u5206\u6563\u30c1\u30fc\u30e0\u3067\u306e\u958b\u767a<\/li>\n\n\n\n<li>\u983b\u7e41\u306a\u30ea\u30ea\u30fc\u30b9\u304c\u5fc5\u8981\u306a\u30a2\u30b8\u30e3\u30a4\u30eb\u958b\u767a<\/li>\n<\/ul>\n\n\n\n<p>\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u30e1\u30ea\u30c3\u30c8\u3092\u5b9f\u73fe\u3059\u308b\u305f\u3081\u306e\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u624b\u9806\u306b\u3064\u3044\u3066\u30015\u3064\u306e\u30b9\u30c6\u30c3\u30d7\u3067\u8a73\u3057\u304f\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-17\">\u74b0\u5883\u69cb\u7bc9\u304b\u3089\u30c7\u30d7\u30ed\u30a4\u307e\u3067\u306e5\u30b9\u30c6\u30c3\u30d7<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">1. Capistrano\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u521d\u671f\u8a2d\u5b9a<\/h3>\n\n\n\n<p>\u307e\u305a\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306bCapistrano\u3092\u5c0e\u5165\u3057\u307e\u3059\u3002Gemfile\u306b\u4ee5\u4e0b\u306e\u8a18\u8ff0\u3092\u8ffd\u52a0\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">group :development do\n  gem 'capistrano', '~&gt; 3.17'\n  gem 'capistrano-rails', '~&gt; 1.6'\n  gem 'capistrano-rbenv', '~&gt; 2.2'\n  gem 'capistrano-bundler', '~&gt; 2.1'\n  gem 'capistrano3-puma', '~&gt; 5.2'\nend<\/pre>\n\n\n\n<p>\u5fc5\u8981\u306a\u30d5\u30a1\u30a4\u30eb\u3092\u751f\u6210\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Capistrano\u306e\u521d\u671f\u5316\nbundle exec cap install\n\n# \u751f\u6210\u3055\u308c\u308b\u30d5\u30a1\u30a4\u30eb\u69cb\u6210\n\u251c\u2500\u2500 Capfile\n\u251c\u2500\u2500 config\n\u2502   \u251c\u2500\u2500 deploy.rb\n\u2502   \u2514\u2500\u2500 deploy\n\u2502       \u251c\u2500\u2500 production.rb\n\u2502       \u2514\u2500\u2500 staging.rb<\/pre>\n\n\n\n<p>Capfile\u3092\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u8a2d\u5b9a\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Capfile\nrequire 'capistrano\/setup'\nrequire 'capistrano\/deploy'\nrequire 'capistrano\/rbenv'\nrequire 'capistrano\/bundler'\nrequire 'capistrano\/rails\/assets'\nrequire 'capistrano\/rails\/migrations'\nrequire 'capistrano\/puma'\n\ninstall_plugin Capistrano::Puma<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">2. \u30c7\u30d7\u30ed\u30a4\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u4f5c\u6210\u3068\u69cb\u6210<\/h3>\n\n\n\n<p>deploy.rb\u306b\u57fa\u672c\u8a2d\u5b9a\u3092\u8a18\u8ff0\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># config\/deploy.rb\nlock \"~&gt; 3.17.3\"\n\nset :application, \"your_app_name\"\nset :repo_url, \"git@github.com:username\/repository.git\"\n\n# \u30c7\u30d7\u30ed\u30a4\u5148\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u6210\nset :deploy_to, \"\/var\/www\/#{fetch(:application)}\"\n\n# \u4fdd\u6301\u3059\u308b\u30d0\u30fc\u30b8\u30e7\u30f3\u6570\nset :keep_releases, 5\n\n# \u5171\u6709\u3059\u308b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\/\u30d5\u30a1\u30a4\u30eb\nappend :linked_dirs, \n  'log',\n  'tmp\/pids',\n  'tmp\/cache',\n  'tmp\/sockets',\n  'vendor\/bundle',\n  'public\/system',\n  'public\/uploads'\n\nappend :linked_files,\n  'config\/database.yml',\n  'config\/master.key'\n\n# \u30c7\u30d7\u30ed\u30a4\u8a2d\u5b9a\nset :rbenv_type, :user\nset :rbenv_ruby, '3.2.2'\nset :rbenv_prefix, \"RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}\/bin\/rbenv exec\"\n\n# \u30bf\u30b9\u30af\u306e\u5b9a\u7fa9\nnamespace :deploy do\n  desc 'Restart application'\n  task :restart do\n    on roles(:app), in: :sequence, wait: 5 do\n      invoke 'puma:restart'\n    end\n  end\n\n  after :publishing, :restart\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">3. \u672c\u756a\u74b0\u5883\u306e\u63a5\u7d9a\u8a2d\u5b9a\u3068SSH\u30ad\u30fc\u306e\u7ba1\u7406<\/h3>\n\n\n\n<p>production.rb\u3067\u672c\u756a\u74b0\u5883\u306e\u8a2d\u5b9a\u3092\u884c\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># config\/deploy\/production.rb\nserver 'your.server.com',\n  user: 'deploy',\n  roles: %w{app db web},\n  ssh_options: {\n    keys: %w(~\/.ssh\/id_rsa),\n    forward_agent: true,\n    auth_methods: %w(publickey),\n    verify_host_key: :secure\n  }\n\nset :rails_env, 'production'\nset :branch, 'main'<\/pre>\n\n\n\n<p>SSH\u30ad\u30fc\u306e\u8a2d\u5b9a\u624b\u9806\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c7\u30d7\u30ed\u30a4\u7528\u30ad\u30fc\u306e\u751f\u6210<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ssh-keygen -t rsa -b 4096 -f ~\/.ssh\/deploy_key<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u516c\u958b\u30ad\u30fc\u3092\u30b5\u30fc\u30d0\u30fc\u306b\u767b\u9332<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ssh-copy-id -i ~\/.ssh\/deploy_key.pub deploy@your.server.com<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>SSH\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u4f5c\u6210<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># ~\/.ssh\/config\nHost your.server.com\n  HostName your.server.com\n  User deploy\n  IdentityFile ~\/.ssh\/deploy_key\n  ForwardAgent yes<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">4. \u30c7\u30d7\u30ed\u30a4\u30bf\u30b9\u30af\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u56fa\u6709\u306e\u30bf\u30b9\u30af\u3092\u5b9a\u7fa9\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># lib\/capistrano\/tasks\/setup.rake\nnamespace :deploy do\n  namespace :check do\n    before :linked_files, :set_master_key do\n      on roles(:app), in: :sequence, wait: 10 do\n        unless test(\"[ -f #{shared_path}\/config\/master.key ]\")\n          upload! 'config\/master.key', \"#{shared_path}\/config\/master.key\"\n        end\n      end\n    end\n  end\n\n  desc 'Runs any pending migrations'\n  task :migrate_db do\n    on roles(:db) do\n      within release_path do\n        execute :rake, 'db:migrate RAILS_ENV=production'\n      end\n    end\n  end\n\n  desc 'Seed the database'\n  task :seed_db do\n    on roles(:db) do\n      within release_path do\n        execute :rake, 'db:seed RAILS_ENV=production'\n      end\n    end\n  end\n\n  desc 'Clear application cache'\n  task :clear_cache do\n    on roles(:app) do\n      within release_path do\n        execute :rake, 'tmp:cache:clear'\n      end\n    end\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">5. \u81ea\u52d5\u30c7\u30d7\u30ed\u30a4\u306e\u5b9f\u884c\u3068\u30ed\u30b0\u306e\u78ba\u8a8d<\/h3>\n\n\n\n<p>\u30c7\u30d7\u30ed\u30a4\u306e\u5b9f\u884c\u30b3\u30de\u30f3\u30c9\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u672c\u756a\u74b0\u5883\u306e\u6e96\u5099\u78ba\u8a8d\nbundle exec cap production deploy:check\n\n# \u672c\u756a\u74b0\u5883\u3078\u306e\u30c7\u30d7\u30ed\u30a4\nbundle exec cap production deploy\n\n# \u7279\u5b9a\u306e\u30bf\u30b9\u30af\u306e\u5b9f\u884c\nbundle exec cap production deploy:migrate_db\nbundle exec cap production deploy:seed_db<\/pre>\n\n\n\n<p>\u30c7\u30d7\u30ed\u30a4\u30ed\u30b0\u306e\u78ba\u8a8d\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30b5\u30fc\u30d0\u30fc\u4e0a\u306e\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\ntail -f \/var\/www\/your_app_name\/current\/log\/capistrano.log\n\n# \u30c7\u30d7\u30ed\u30a4\u5c65\u6b74\u306e\u78ba\u8a8d\nls -l \/var\/www\/your_app_name\/releases<\/pre>\n\n\n\n<p>\u91cd\u8981\u306a\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u306e\u5834\u6240\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/var\/www\/your_app_name\/current\/log\/production.log  # Rails\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30ed\u30b0\n\/var\/www\/your_app_name\/current\/log\/capistrano.log  # \u30c7\u30d7\u30ed\u30a4\u30ed\u30b0\n\/var\/www\/your_app_name\/current\/log\/puma.log        # Puma\u30b5\u30fc\u30d0\u30fc\u30ed\u30b0<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e5\u30b9\u30c6\u30c3\u30d7\u3092\u5b8c\u4e86\u3059\u308b\u3053\u3068\u3067\u3001\u5b89\u5b9a\u3057\u305f\u81ea\u52d5\u30c7\u30d7\u30ed\u30a4\u74b0\u5883\u304c\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u306e\u74b0\u5883\u3092\u6700\u5927\u9650\u6d3b\u7528\u3059\u308b\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-23\">\u73fe\u5834\u3067\u5f79\u7acb\u3064Capistrano\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-24\">\u30c7\u30d7\u30ed\u30a4\u5931\u6557\u3092\u9632\u3050\u305f\u3081\u306e\u8a2d\u5b9a\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-25\">1. \u30c7\u30d7\u30ed\u30a4\u524d\u306e\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># lib\/capistrano\/tasks\/health_check.rake\nnamespace :deploy do\n  desc '\u30b5\u30fc\u30d0\u30fc\u306e\u72b6\u614b\u30c1\u30a7\u30c3\u30af'\n  task :health_check do\n    on roles(:all) do\n      # \u30c7\u30a3\u30b9\u30af\u5bb9\u91cf\u30c1\u30a7\u30c3\u30af\n      disk_space = capture('df -h \/ | tail -1 | awk \\'{print $5}\\' | sed \\'s\/%\/\/\\'').to_i\n      if disk_space &gt; 90\n        error \"\u30c7\u30a3\u30b9\u30af\u4f7f\u7528\u7387\u304c90%\u3092\u8d85\u3048\u3066\u3044\u307e\u3059: #{disk_space}%\"\n        exit 1\n      end\n\n      # \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u30c1\u30a7\u30c3\u30af\n      free_memory = capture('free -m | grep Mem | awk \\'{print $4}\\'').to_i\n      if free_memory &lt; 512\n        error \"\u7a7a\u304d\u30e1\u30e2\u30ea\u304c\u4e0d\u8db3\u3057\u3066\u3044\u307e\u3059: #{free_memory}MB\"\n        exit 1\n      end\n\n      # \u30d7\u30ed\u30bb\u30b9\u6570\u30c1\u30a7\u30c3\u30af\n      process_count = capture('ps aux | wc -l').to_i\n      if process_count &gt; 300\n        error \"\u30d7\u30ed\u30bb\u30b9\u6570\u304c\u591a\u3059\u304e\u307e\u3059: #{process_count}\"\n        exit 1\n      end\n    end\n  end\n\n  before :starting, :health_check\nend<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-26\">2. \u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u30dd\u30a4\u30f3\u30c8\u306e\u78ba\u5b9f\u306a\u8a2d\u5b9a<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># config\/deploy.rb\nset :keep_releases, 3  # \u6700\u4f4e3\u3064\u306e\u904e\u53bb\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u4fdd\u6301\n\n# \u30c7\u30d7\u30ed\u30a4\u5931\u6557\u6642\u306e\u81ea\u52d5\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\nnamespace :deploy do\n  after :failed, :fix_permissions do\n    on roles(:app) do\n      execute :chmod, '-R', '755', release_path\n    end\n  end\n\n  after :failed, :rollback do\n    invoke 'deploy:revert_release'\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-27\">\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u6a5f\u80fd\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528\u8853<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-28\">1. \u6bb5\u968e\u7684\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u6226\u7565<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">namespace :deploy do\n  desc '\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u6bb5\u968e\u7684\u30ed\u30fc\u30eb\u30d0\u30c3\u30af'\n  task :phased_rollback do\n    on roles(:app) do\n      # \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u5236\u9650\n      execute 'sudo nginx -s reload'  # \u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u30da\u30fc\u30b8\u8868\u793a\n\n      # \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\n      within current_path do\n        execute :rake, 'db:rollback STEP=1'\n      end\n\n      # \u30b3\u30fc\u30c9\u306e\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\n      invoke 'deploy:revert_release'\n\n      # \u30a2\u30bb\u30c3\u30c8\u306e\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\n      within current_path do\n        execute :rake, 'assets:precompile'\n      end\n\n      # \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u518d\u8d77\u52d5\n      invoke 'puma:restart'\n\n      # \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u5fa9\u65e7\n      execute 'sudo nginx -s reload'\n    end\n  end\nend<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-29\">2. \u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u524d\u5f8c\u306e\u72b6\u614b\u76e3\u8996<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># lib\/capistrano\/tasks\/monitoring.rake\nnamespace :monitor do\n  desc '\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u72b6\u614b\u78ba\u8a8d'\n  task :check_status do\n    on roles(:app) do\n      # \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5fdc\u7b54\u78ba\u8a8d\n      response_code = capture(\"curl -s -o \/dev\/null -w '%{http_code}' http:\/\/localhost\/health_check\")\n      if response_code != \"200\"\n        error \"\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u304c\u6b63\u5e38\u306b\u5fdc\u7b54\u3057\u3066\u3044\u307e\u305b\u3093: #{response_code}\"\n      end\n\n      # \u30a8\u30e9\u30fc\u30ed\u30b0\u306e\u30c1\u30a7\u30c3\u30af\n      recent_errors = capture(\"tail -n 50 #{current_path}\/log\/production.log | grep ERROR | wc -l\").to_i\n      if recent_errors &gt; 0\n        warning \"\u6700\u8fd1\u306e\u30a8\u30e9\u30fc\u6570: #{recent_errors}\"\n      end\n    end\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-30\">\u5927\u898f\u6a21\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306e\u904b\u7528\u306e\u30b3\u30c4<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-31\">1. \u74b0\u5883\u5225\u306e\u8a2d\u5b9a\u7ba1\u7406<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># config\/deploy\/production.rb\nset :stage_settings do\n  {\n    web: {\n      instances: 4,\n      server_config: 'config\/nginx\/production.conf'\n    },\n    worker: {\n      instances: 2,\n      queue_prefix: 'production'\n    },\n    db: {\n      primary: 'db-primary.example.com',\n      replica: 'db-replica.example.com'\n    }\n  }\nend\n\n# \u30b5\u30fc\u30d0\u30fc\u8a2d\u5b9a\u306e\u52d5\u7684\u751f\u6210\nfetch(:stage_settings)[:web][:instances].times do |i|\n  server \"web-#{i}.example.com\",\n    roles: %w{app web},\n    ssh_options: fetch(:ssh_options)\nend<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-32\">2. \u4e26\u5217\u30c7\u30d7\u30ed\u30a4\u306e\u6700\u9069\u5316<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># config\/deploy.rb\nset :max_parallels, 3  # \u540c\u6642\u30c7\u30d7\u30ed\u30a4\u6570\u306e\u5236\u9650\n\n# \u30c7\u30d7\u30ed\u30a4\u51e6\u7406\u306e\u4e26\u5217\u5316\u8a2d\u5b9a\nnamespace :deploy do\n  task :parallel_deploy do\n    on roles(:app), in: :groups, limit: fetch(:max_parallels) do\n      # \u30a2\u30bb\u30c3\u30c8\u306e\u30d7\u30ea\u30b3\u30f3\u30d1\u30a4\u30eb\n      execute :rake, 'assets:precompile'\n\n      # \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\uff08\u30d7\u30e9\u30a4\u30de\u30ea\u30ce\u30fc\u30c9\u306e\u307f\uff09\n      if host.properties.primary\n        within current_path do\n          execute :rake, 'db:migrate'\n        end\n      end\n    end\n  end\nend<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-33\">3. \u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># lib\/capistrano\/tasks\/cache.rake\nnamespace :cache do\n  desc '\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6bb5\u968e\u7684\u30af\u30ea\u30a2'\n  task :smart_clear do\n    on roles(:app) do\n      within current_path do\n        # \u30da\u30fc\u30b8\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u30af\u30ea\u30a2\n        execute :rake, 'tmp:cache:clear'\n\n        # Redis\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u9078\u629e\u7684\u30af\u30ea\u30a2\n        execute :redis-cli, \"KEYS 'cache:*' | xargs redis-cli DEL\"\n\n        # CDN\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u30d1\u30fc\u30b8\n        execute :rake, 'cdn:purge:selective'\n      end\n    end\n  end\nend<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u52b9\u679c\u304c\u671f\u5f85\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c7\u30d7\u30ed\u30a4\u6210\u529f\u7387\u306e\u5411\u4e0a\uff0899.9%\u4ee5\u4e0a\uff09<\/li>\n\n\n\n<li>\u969c\u5bb3\u767a\u751f\u6642\u306e\u5e73\u5747\u5fa9\u65e7\u6642\u9593\uff08MTTR\uff09\u306e\u77ed\u7e2e<\/li>\n\n\n\n<li>\u5927\u898f\u6a21\u30b7\u30b9\u30c6\u30e0\u3067\u306e\u30b9\u30b1\u30fc\u30e9\u30d6\u30eb\u306a\u904b\u7528<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u9593\u306e\u9023\u643a\u5f37\u5316<\/li>\n<\/ol>\n\n\n\n<p>\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b9f\u969b\u306e\u904b\u7528\u3067\u906d\u9047\u3059\u308b\u53ef\u80fd\u6027\u306e\u3042\u308b\u554f\u984c\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-34\">\u5b9f\u8df5\u7684\u306a\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u96c6<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-35\">\u3088\u304f\u3042\u308b\u30c7\u30d7\u30ed\u30a4\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-36\">1. Permission Denied \u30a8\u30e9\u30fc<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u4f8b\nPermission denied (publickey,password)<\/pre>\n\n\n\n<p>\u89e3\u6c7a\u624b\u9806\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>SSH\u30ad\u30fc\u306e\u78ba\u8a8d<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30ed\u30fc\u30ab\u30eb\u3067\u306e\u78ba\u8a8d\nssh-add -l\n# \u30ad\u30fc\u306e\u8ffd\u52a0\nssh-add ~\/.ssh\/deploy_key<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30b5\u30fc\u30d0\u30fc\u5074\u306e\u6a29\u9650\u8a2d\u5b9a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># lib\/capistrano\/tasks\/fix_permissions.rake\nnamespace :deploy do\n  desc '\u6a29\u9650\u306e\u4fee\u6b63'\n  task :fix_permissions do\n    on roles(:app) do\n      execute :chmod, \"g+rx,u+rwx\", deploy_to\n      execute :chown, \"-R\", \"#{fetch(:deploy_user)}:#{fetch(:deploy_group)}\", deploy_to\n    end\n  end\nend<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-37\">2. Bundler\u306b\u95a2\u9023\u3059\u308b\u30a8\u30e9\u30fc<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u4f8b\nbundler: command not found: bundle<\/pre>\n\n\n\n<p>\u89e3\u6c7a\u7b56\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># config\/deploy.rb\nset :default_env, {\n  'PATH' =&gt; \"\/usr\/local\/rbenv\/shims:\/usr\/local\/rbenv\/bin:$PATH\",\n  'BUNDLER_VERSION' =&gt; '2.4.10'\n}\n\n# Bundler\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3092\u78ba\u5b9f\u306b\nnamespace :deploy do\n  before 'deploy:check', :ensure_bundler do\n    on roles(:app) do\n      execute :gem, 'install bundler -v', fetch(:bundler_version)\n    end\n  end\nend<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-38\">3. \u30a2\u30bb\u30c3\u30c8\u30d7\u30ea\u30b3\u30f3\u30d1\u30a4\u30eb\u306e\u5931\u6557<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># config\/deploy.rb\n# \u30e1\u30e2\u30ea\u4e0d\u8db3\u5bfe\u7b56\nset :assets_roles, [:web, :app]\nset :assets_prefix, 'packs'\n\nnamespace :deploy do\n  namespace :assets do\n    task :precompile do\n      on roles(fetch(:assets_roles)) do\n        within release_path do\n          with rails_env: fetch(:rails_env), rails_groups: 'assets' do\n            # \u30e1\u30e2\u30ea\u5236\u9650\u4ed8\u304d\u3067\u30d7\u30ea\u30b3\u30f3\u30d1\u30a4\u30eb\n            execute :nice, \"-n 19 bundle exec rake assets:precompile\"\n          end\n        end\n      end\n    end\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-39\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u305f\u3081\u306e\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-40\">1. \u30c7\u30d7\u30ed\u30a4\u901f\u5ea6\u306e\u6539\u5584<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># config\/deploy.rb\n# \u4e26\u5217\u51e6\u7406\u306e\u8a2d\u5b9a\nset :format, :pretty\nset :log_level, :debug\nset :pty, false  # \u4e26\u5217\u51e6\u7406\u3092\u6709\u52b9\u306b\n\n# \u9ad8\u901f\u5316\u306e\u305f\u3081\u306e\u8a2d\u5b9a\nset :git_shallow_clone, 1  # \u30b7\u30e3\u30ed\u30fc\u30af\u30ed\u30fc\u30f3\nset :git_copy_strategy, :clone  # \u9ad8\u901f\u306a\u30af\u30ed\u30fc\u30f3\u6226\u7565\n\n# \u4e0d\u8981\u306a\u30bf\u30b9\u30af\u306e\u30b9\u30ad\u30c3\u30d7\nnamespace :deploy do\n  Rake::Task[\"deploy:assets:backup_manifest\"].clear_actions\nend<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-41\">2. \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># lib\/capistrano\/tasks\/optimize_memory.rake\nnamespace :optimize do\n  desc '\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316'\n  task :memory do\n    on roles(:app) do\n      # Rails\u306e\u30ac\u30d9\u30fc\u30b8\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u8a2d\u5b9a\n      execute \"echo 'RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000' &gt;&gt; #{shared_path}\/.env\"\n      execute \"echo 'RUBY_GC_HEAP_INIT_SLOTS=600000' &gt;&gt; #{shared_path}\/.env\"\n\n      # Puma\u30ef\u30fc\u30ab\u30fc\u6570\u306e\u6700\u9069\u5316\n      execute :sed, \"-i\", \"'s\/workers .*\/workers #{fetch(:puma_workers)}\/g'\",\n              \"#{shared_path}\/config\/puma.rb\"\n    end\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-42\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u305f\u8a2d\u5b9a\u306e\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-43\">1. \u6a5f\u5bc6\u60c5\u5831\u306e\u5b89\u5168\u306a\u7ba1\u7406<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># config\/deploy.rb\n# \u74b0\u5883\u5909\u6570\u306e\u5b89\u5168\u306a\u7ba1\u7406\nset :linked_files, %w{.env config\/master.key}\n\nnamespace :deploy do\n  namespace :check do\n    before :linked_files, :upload_env do\n      on roles(:app) do\n        unless test(\"[ -f #{shared_path}\/.env ]\")\n          upload! '.env.production', \"#{shared_path}\/.env\"\n        end\n      end\n    end\n  end\nend<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-44\">2. \u30bb\u30ad\u30e5\u30a2\u306a\u30c7\u30d7\u30ed\u30a4\u8a2d\u5b9a<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># config\/deploy\/production.rb\n# SSH\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5f37\u5316\nset :ssh_options, {\n  forward_agent: true,\n  auth_methods: %w(publickey),\n  keys: %w(~\/.ssh\/deploy_key),\n  verify_host_key: :secure,\n  compression: false,\n  config: false\n}\n\n# sudo\u6a29\u9650\u306e\u5236\u9650\nset :use_sudo, false\nset :deploy_user, 'deploy'<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-45\">3. \u30c7\u30d7\u30ed\u30a4\u30ed\u30b0\u306e\u76e3\u67fb<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># lib\/capistrano\/tasks\/audit.rake\nnamespace :deploy do\n  desc '\u30c7\u30d7\u30ed\u30a4\u76e3\u67fb\u30ed\u30b0\u306e\u8a18\u9332'\n  task :audit_log do\n    on roles(:app) do\n      within release_path do\n        execute :logger,\n                \"-t capistrano \" \\\n                \"'Deploy completed by #{ENV['USER']} \" \\\n                \"at #{Time.now} \" \\\n                \"from #{fetch(:branch)} \" \\\n                \"to #{fetch(:stage)}'\"\n      end\n    end\n  end\n\n  after :finished, :audit_log\nend<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u554f\u984c\u89e3\u6c7a\u65b9\u6cd5\u3068\u6700\u9069\u5316\u8a2d\u5b9a\u306b\u3088\u308a\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u52b9\u679c\u304c\u671f\u5f85\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c7\u30d7\u30ed\u30a4\u5931\u6557\u306e\u8fc5\u901f\u306a\u89e3\u6c7a\uff08\u5e73\u5747\u89e3\u6c7a\u6642\u959315\u5206\u4ee5\u5185\uff09<\/li>\n\n\n\n<li>\u30b7\u30b9\u30c6\u30e0\u30ea\u30bd\u30fc\u30b9\u306e\u52b9\u7387\u7684\u306a\u4f7f\u7528<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30ea\u30b9\u30af\u306e\u6700\u5c0f\u5316<\/li>\n\n\n\n<li>\u904b\u7528\u30b3\u30b9\u30c8\u306e\u524a\u6e1b<\/li>\n<\/ol>\n\n\n\n<p>\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u77e5\u8b58\u3092\u6d3b\u7528\u3057\u3066CI\/CD\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u3092\u69cb\u7bc9\u3059\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-46\">Capistrano\u3092\u4f7f\u3063\u305f\u7d99\u7d9a\u7684\u30c7\u30ea\u30d0\u30ea\u30fc\u306e\u5b9f\u73fe<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-47\">CI\/CD\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-48\">GitHubActions\u3068\u306e\u9023\u643a\u4f8b<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># .github\/workflows\/deploy.yml\nname: Deploy to Production\n\non:\n  push:\n    branches: [ main ]\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\/checkout@v3\n\n      - name: Set up Ruby\n        uses: ruby\/setup-ruby@v1\n        with:\n          ruby-version: '3.2.2'\n          bundler-cache: true\n\n      - name: Install SSH key\n        uses: shimataro\/ssh-key-action@v2\n        with:\n          key: ${{ secrets.SSH_PRIVATE_KEY }}\n          known_hosts: ${{ secrets.KNOWN_HOSTS }}\n\n      - name: Deploy to production\n        run: |\n          gem install capistrano\n          bundle install\n          bundle exec cap production deploy\n        env:\n          RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-49\">CircleCI\u3068\u306e\u9023\u643a\u4f8b<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># .circleci\/config.yml\nversion: 2.1\n\njobs:\n  deploy:\n    docker:\n      - image: cimg\/ruby:3.2.2\n    steps:\n      - checkout\n      - add_ssh_keys:\n          fingerprints:\n            - \"xx:xx:xx:xx:xx:xx:xx:xx\"\n      - run:\n          name: Bundle Install\n          command: bundle install\n      - run:\n          name: Deploy to Production\n          command: bundle exec cap production deploy\n\nworkflows:\n  version: 2\n  build-deploy:\n    jobs:\n      - deploy:\n          filters:\n            branches:\n              only: main<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-50\">\u81ea\u52d5\u30c6\u30b9\u30c8\u3068\u306e\u52b9\u679c\u7684\u306a\u7d44\u307f\u5408\u308f\u305b\u65b9<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-51\">\u30c7\u30d7\u30ed\u30a4\u524d\u306e\u30c6\u30b9\u30c8\u5b9f\u884c<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># lib\/capistrano\/tasks\/test.rake\nnamespace :deploy do\n  desc '\u30c7\u30d7\u30ed\u30a4\u524d\u306e\u30c6\u30b9\u30c8\u5b9f\u884c'\n  task :run_tests do\n    on roles(:app) do\n      within release_path do\n        with rails_env: fetch(:rails_env) do\n          # \u30b7\u30b9\u30c6\u30e0\u30c6\u30b9\u30c8\n          execute :bundle, \"exec rspec spec\/system\"\n\n          # \u8ca0\u8377\u30c6\u30b9\u30c8\n          execute :bundle, \"exec rake performance:check\"\n\n          # \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30c6\u30b9\u30c8\n          execute :bundle, \"exec brakeman -q -z\"\n        end\n      end\n    end\n  end\n\n  before 'deploy:migrate', :run_tests\nend<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-52\">\u30b9\u30e2\u30fc\u30af\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># lib\/capistrano\/tasks\/smoke_test.rake\nnamespace :deploy do\n  desc '\u30c7\u30d7\u30ed\u30a4\u5f8c\u306e\u30b9\u30e2\u30fc\u30af\u30c6\u30b9\u30c8'\n  task :smoke_test do\n    on roles(:web) do |host|\n      # \u57fa\u672c\u7684\u306a\u758e\u901a\u78ba\u8a8d\n      response = Net::HTTP.get_response(URI(\"https:\/\/#{host}\/health_check\"))\n      unless response.code == \"200\"\n        raise \"Health check failed on #{host}\"\n      end\n\n      # \u91cd\u8981\u306a\u6a5f\u80fd\u306e\u78ba\u8a8d\n      crucial_endpoints = %w(\n        \/api\/v1\/status\n        \/api\/v1\/users\n        \/api\/v1\/products\n      )\n\n      crucial_endpoints.each do |endpoint|\n        response = Net::HTTP.get_response(URI(\"https:\/\/#{host}#{endpoint}\"))\n        unless response.code.start_with?(\"2\")\n          raise \"Endpoint #{endpoint} failed on #{host}\"\n        end\n      end\n    end\n  end\n\n  after 'deploy:finished', :smoke_test\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-53\">\u30c7\u30d7\u30ed\u30a4\u76e3\u8996\u3068\u901a\u77e5\u306e\u8a2d\u5b9a\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-54\">Slack\u3078\u306e\u901a\u77e5\u8a2d\u5b9a<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># lib\/capistrano\/tasks\/notify.rake\nrequire 'net\/http'\nrequire 'json'\n\nnamespace :deploy do\n  desc 'Slack\u901a\u77e5\u306e\u9001\u4fe1'\n  task :notify_slack do\n    on roles(:app) do\n      webhook_url = fetch(:slack_webhook_url)\n      environment = fetch(:stage)\n      revision = capture(\"cd #{current_path} &amp;&amp; git rev-parse --short HEAD\")\n\n      message = {\n        text: \":rocket: \u30c7\u30d7\u30ed\u30a4\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\",\n        attachments: [{\n          color: \"good\",\n          fields: [\n            {\n              title: \"Environment\",\n              value: environment,\n              short: true\n            },\n            {\n              title: \"Branch\",\n              value: fetch(:branch),\n              short: true\n            },\n            {\n              title: \"Revision\",\n              value: revision,\n              short: true\n            },\n            {\n              title: \"Deployer\",\n              value: ENV['USER'],\n              short: true\n            }\n          ]\n        }]\n      }\n\n      uri = URI(webhook_url)\n      http = Net::HTTP.new(uri.host, uri.port)\n      http.use_ssl = true\n\n      request = Net::HTTP::Post.new(\n        uri.path,\n        'Content-Type' =&gt; 'application\/json'\n      )\n      request.body = message.to_json\n\n      http.request(request)\n    end\n  end\n\n  after 'deploy:finished', :notify_slack\nend<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-55\">\u30e1\u30c8\u30ea\u30af\u30b9\u76e3\u8996\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># lib\/capistrano\/tasks\/monitoring.rake\nnamespace :deploy do\n  desc '\u30c7\u30d7\u30ed\u30a4\u5f8c\u306e\u30e1\u30c8\u30ea\u30af\u30b9\u76e3\u8996'\n  task :monitor_metrics do\n    on roles(:app) do\n      # New Relic\u3078\u306e\u30c7\u30d7\u30ed\u30a4\u30de\u30fc\u30ab\u30fc\u8a2d\u5b9a\n      within current_path do\n        execute :bundle, \"exec newrelic deployment\"\n      end\n\n      # Datadog\u3078\u306e\u30a4\u30d9\u30f3\u30c8\u9001\u4fe1\n      api_key = fetch(:datadog_api_key)\n      app_key = fetch(:datadog_app_key)\n\n      event_data = {\n        title: \"Deployment to #{fetch(:stage)}\",\n        text: \"Deployed #{fetch(:application)} to #{fetch(:stage)}\",\n        tags: [\"environment:#{fetch(:stage)}\", \"deployer:#{ENV['USER']}\"],\n        alert_type: \"info\"\n      }\n\n      uri = URI(\"https:\/\/api.datadoghq.com\/api\/v1\/events\")\n      request = Net::HTTP::Post.new(uri)\n      request[\"Content-Type\"] = \"application\/json\"\n      request[\"DD-API-KEY\"] = api_key\n      request[\"DD-APPLICATION-KEY\"] = app_key\n      request.body = event_data.to_json\n\n      Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|\n        http.request(request)\n      end\n    end\n  end\n\n  after 'deploy:finished', :monitor_metrics\nend<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u8a2d\u5b9a\u306b\u3088\u308a\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u7d99\u7d9a\u7684\u30c7\u30ea\u30d0\u30ea\u30fc\u306e\u4f53\u5236\u304c\u69cb\u7bc9\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u81ea\u52d5\u5316\u3055\u308c\u305f\u30c7\u30d7\u30ed\u30a4\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30df\u30c3\u30c8\u2192\u30c6\u30b9\u30c8\u2192\u30c7\u30d7\u30ed\u30a4\u306e\u81ea\u52d5\u5316<\/li>\n\n\n\n<li>\u8907\u6570\u74b0\u5883\u3078\u306e\u6bb5\u968e\u7684\u30c7\u30d7\u30ed\u30a4<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u54c1\u8cea\u4fdd\u8a3c\u306e\u81ea\u52d5\u5316<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u81ea\u52d5\u30c6\u30b9\u30c8\u306e\u5b9f\u884c<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30c1\u30a7\u30c3\u30af<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c6\u30b9\u30c8<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u76e3\u8996\u4f53\u5236\u306e\u78ba\u7acb<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u306e\u76e3\u8996<\/li>\n\n\n\n<li>\u30a4\u30f3\u30b7\u30c7\u30f3\u30c8\u306e\u65e9\u671f\u767a\u898b<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u9593\u306e\u8fc5\u901f\u306a\u60c5\u5831\u5171\u6709<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306a\u4f53\u5236\u306b\u3088\u308a\u3001\u3088\u308a\u5b89\u5168\u3067\u52b9\u7387\u7684\u306a\u7d99\u7d9a\u7684\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u304c\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":{"0":"post-1223","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ruby","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1223","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1223"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1223\/revisions"}],"predecessor-version":[{"id":1224,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1223\/revisions\/1224"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1223"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1223"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}