{"id":3190,"date":"2025-03-24T08:46:42","date_gmt":"2025-03-23T23:46:42","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=3190"},"modified":"2025-03-24T08:47:12","modified_gmt":"2025-03-23T23:47:12","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91laravel-sail%e3%81%a7%e5%ae%9f%e7%8f%be%e3%81%99%e3%82%8b3%e5%88%86%e9%96%93%e3%81%ae%e7%88%86%e9%80%9f%e9%96%8b%e7%99%ba%e7%92%b0%e5%a2%83%e6%a7%8b","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=3190","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Laravel Sail\u3067\u5b9f\u73fe\u3059\u308b3\u5206\u9593\u306e\u7206\u901f\u958b\u767a\u74b0\u5883\u69cb\u7bc9 &#8211; \u5b8c\u5168\u30ac\u30a4\u30c92025"},"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\">Laravel Sail\u3068\u306f\u4f55\u304b\uff1f\u6ce8\u76ee\u3092\u96c6\u3081\u308b\u7406\u7531\u3092\u5fb9\u5e95\u89e3\u8aac<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">\u5f93\u6765\u306eDocker\u74b0\u5883\u69cb\u7bc9\u306b\u304a\u3051\u308b3\u3064\u306e\u8ab2\u984c<\/a>      <\/li>      <li>        <a href=\"#i-2\">Laravel Sail\u304c\u63d0\u4f9b\u3059\u308b\u753b\u671f\u7684\u306a\u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-3\">PHP\u30a8\u30f3\u30b8\u30cb\u30a2\u306e\u958b\u767a\u52b9\u7387\u304c3\u500d\u306b\u306a\u308b\u4ed5\u7d44\u307f<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-4\">Laravel Sail\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u624b\u9806<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-5\">\u524d\u63d0\u6761\u4ef6\u306e\u78ba\u8a8d\u3068Docker\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/a>      <\/li>      <li>        <a href=\"#i-6\">composer require\u30b3\u30de\u30f3\u30c9\u306b\u3088\u308bSail\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-7\">\u521d\u56de\u8d77\u52d5\u6642\u306e\u6ce8\u610f\u70b9\u3068\u78ba\u8a8d\u4e8b\u9805<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-8\">Laravel Sail\u306e\u4e3b\u8981\u30b3\u30de\u30f3\u30c9\u5b8c\u5168\u30ac\u30a4\u30c9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-9\">\u958b\u767a\u74b0\u5883\u306e\u8d77\u52d5\u30fb\u505c\u6b62\u30fb\u518d\u8d77\u52d5\u30b3\u30de\u30f3\u30c9<\/a>      <\/li>      <li>        <a href=\"#i-10\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u306b\u95a2\u3059\u308b\u4fbf\u5229\u306a\u30b3\u30de\u30f3\u30c9\u96c6<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-11\">\u30c6\u30b9\u30c8\u3084\u30ad\u30e3\u30c3\u30b7\u30e5\u30af\u30ea\u30a2\u306e\u52b9\u7387\u7684\u306a\u5b9f\u884c\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-12\">Laravel Sail\u306b\u3088\u308b\u958b\u767a\u74b0\u5883\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-13\">docker-compose.yml\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>      <li>        <a href=\"#i-14\">\u8ffd\u52a0\u30b5\u30fc\u30d3\u30b9\u306e\u5c0e\u5165\u624b\u9806\u3068\u6ce8\u610f\u70b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-15\">\u672c\u756a\u74b0\u5883\u3078\u306e\u79fb\u884c\u3092\u898b\u636e\u3048\u305f\u8a2d\u5b9a\u306e\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-16\">Laravel Sail\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-17\">\u8d77\u52d5\u6642\u306b\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-18\">\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-19\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u524a\u6e1b\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-20\">Laravel Sail\u3092\u4f7f\u3063\u305f\u5b9f\u8df5\u7684\u306a\u958b\u767a\u30d5\u30ed\u30fc<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-21\">\u30c1\u30fc\u30e0\u958b\u767a\u306b\u304a\u3051\u308b\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>      <li>        <a href=\"#i-22\">CI\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-23\">\u672c\u756a\u30c7\u30d7\u30ed\u30a4\u307e\u3067\u306e\u5177\u4f53\u7684\u306a\u624b\u9806<\/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\">Laravel Sail\u3068\u306f\u4f55\u304b\uff1f\u6ce8\u76ee\u3092\u96c6\u3081\u308b\u7406\u7531\u3092\u5fb9\u5e95\u89e3\u8aac<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">\u5f93\u6765\u306eDocker\u74b0\u5883\u69cb\u7bc9\u306b\u304a\u3051\u308b3\u3064\u306e\u8ab2\u984c<\/h3>\n\n\n\n<p>\u958b\u767a\u74b0\u5883\u306e\u69cb\u7bc9\u306f\u3001\u591a\u304f\u306ePHP\u30a8\u30f3\u30b8\u30cb\u30a2\u306b\u3068\u3063\u3066\u91cd\u8981\u304b\u3064\u6642\u9593\u306e\u304b\u304b\u308b\u30bf\u30b9\u30af\u3067\u3057\u305f\u3002\u7279\u306bDocker\u3092\u4f7f\u7528\u3057\u305f\u74b0\u5883\u69cb\u7bc9\u3067\u306f\u3001\u4ee5\u4e0b\u306e3\u3064\u306e\u4e3b\u8981\u306a\u8ab2\u984c\u304c\u5b58\u5728\u3057\u3066\u3044\u307e\u3057\u305f\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8907\u96d1\u306a\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u4f5c\u6210\u3068\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9069\u5207\u306aDockerfile\u306e\u4f5c\u6210\u306b\u5c02\u9580\u77e5\u8b58\u304c\u5fc5\u8981<\/li>\n\n\n\n<li>docker-compose.yml\u306e\u8a2d\u5b9a\u304c\u8907\u96d1\u3067\u9593\u9055\u3044\u3084\u3059\u3044<\/li>\n\n\n\n<li>\u7570\u306a\u308b\u30b5\u30fc\u30d3\u30b9\u9593\u306e\u9023\u643a\u8a2d\u5b9a\u306b\u6642\u9593\u304c\u304b\u304b\u308b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u74b0\u5883\u306e\u4e00\u8cab\u6027\u7dad\u6301\u306e\u96e3\u3057\u3055<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u958b\u767a\u8005\u9593\u3067\u7570\u306a\u308b\u8a2d\u5b9a\u304c\u4f7f\u308f\u308c\u3084\u3059\u3044<\/li>\n\n\n\n<li>\u30ed\u30fc\u30ab\u30eb\u74b0\u5883\u3068\u672c\u756a\u74b0\u5883\u306e\u5dee\u7570\u304c\u751f\u3058\u3084\u3059\u3044<\/li>\n\n\n\n<li>\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406\u306e\u8907\u96d1\u3055<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b66\u7fd2\u30b3\u30b9\u30c8\u3068\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u306e\u8ca0\u62c5<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker\u306e\u57fa\u672c\u6982\u5ff5\u306e\u7406\u89e3\u306b\u6642\u9593\u304c\u5fc5\u8981<\/li>\n\n\n\n<li>\u30c8\u30e9\u30d6\u30eb\u767a\u751f\u6642\u306e\u30c7\u30d0\u30c3\u30b0\u304c\u56f0\u96e3<\/li>\n\n\n\n<li>\u5b9a\u671f\u7684\u306a\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3068\u7ba1\u7406\u304c\u5fc5\u8981<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">Laravel Sail\u304c\u63d0\u4f9b\u3059\u308b\u753b\u671f\u7684\u306a\u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3<\/h3>\n\n\n\n<p>Laravel Sail\u306f\u3001\u3053\u308c\u3089\u306e\u8ab2\u984c\u306b\u5bfe\u3057\u3066\u9769\u65b0\u7684\u306a\u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3\u3092\u63d0\u4f9b\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=\"\"># \u305f\u3063\u305f1\u884c\u3067Laravel Sail\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\ncomposer require laravel\/sail --dev\n\n# \u7c21\u5358\u306a\u74b0\u5883\u8d77\u52d5\n.\/vendor\/bin\/sail up<\/pre>\n\n\n\n<p>\u4e3b\u306a\u7279\u5fb4\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u30b7\u30f3\u30d7\u30eb\u306a\u8a2d\u5b9a<\/strong><\/li>\n\n\n\n<li>\u4e8b\u524d\u5b9a\u7fa9\u3055\u308c\u305f\u6700\u9069\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>PHP\u3084MySQL\u306a\u3069\u4e3b\u8981\u30b5\u30fc\u30d3\u30b9\u306e\u81ea\u52d5\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u6700\u5c0f\u9650\u306e\u30b3\u30de\u30f3\u30c9\u3067\u74b0\u5883\u69cb\u7bc9\u304c\u5b8c\u4e86<\/li>\n\n\n\n<li><strong>\u958b\u767a\u306b\u7279\u5316\u3057\u305f\u6a5f\u80fd<\/strong><\/li>\n\n\n\n<li>Node.js\u3084Redis\u306a\u3069\u306e\u958b\u767a\u30c4\u30fc\u30eb\u304c\u6a19\u6e96\u642d\u8f09<\/li>\n\n\n\n<li>\u30e1\u30fc\u30eb\u30c6\u30b9\u30c8\u7528\u306eMailhog\u304c\u7d71\u5408\u6e08\u307f<\/li>\n\n\n\n<li>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30c6\u30b9\u30c8\u74b0\u5883\u306e\u81ea\u52d5\u8a2d\u5b9a<\/li>\n\n\n\n<li><strong>\u67d4\u8edf\u306a\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u6027<\/strong><\/li>\n\n\n\n<li>\u5fc5\u8981\u306a\u30b5\u30fc\u30d3\u30b9\u306e\u8ffd\u52a0\u304c\u5bb9\u6613<\/li>\n\n\n\n<li>\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u62e1\u5f35\u304c\u53ef\u80fd<\/li>\n\n\n\n<li>\u65e2\u5b58\u306eDocker\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3068\u306e\u7d71\u5408\u3082\u30b9\u30e0\u30fc\u30ba<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">PHP\u30a8\u30f3\u30b8\u30cb\u30a2\u306e\u958b\u767a\u52b9\u7387\u304c3\u500d\u306b\u306a\u308b\u4ed5\u7d44\u307f<\/h3>\n\n\n\n<p>Laravel Sail\u306f\u3001\u4ee5\u4e0b\u306e3\u3064\u306e\u65b9\u6cd5\u3067\u958b\u767a\u52b9\u7387\u3092\u5927\u5e45\u306b\u5411\u4e0a\u3055\u305b\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5373\u5ea7\u306e\u74b0\u5883\u69cb\u7bc9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u65b0\u898f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u4f5c\u6210\u304b\u3089\u5b9f\u884c\u307e\u30673\u5206\u4ee5\u5185<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u5168\u54e1\u304c\u540c\u3058\u74b0\u5883\u3092\u5373\u5ea7\u306b\u5171\u6709\u53ef\u80fd<\/li>\n\n\n\n<li>\u74b0\u5883\u306e\u518d\u69cb\u7bc9\u3082\u77ed\u6642\u9593\u3067\u5b8c\u4e86<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u76f4\u611f\u7684\u306a\u30b3\u30de\u30f3\u30c9\u4f53\u7cfb<\/strong><\/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=\"\">   # \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\n   sail artisan migrate\n\n   # npm\u30b3\u30de\u30f3\u30c9\u306e\u5b9f\u884c\n   sail npm run dev\n\n   # \u30c6\u30b9\u30c8\u306e\u5b9f\u884c\n   sail test<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u52b9\u7387\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u4f53\u5236<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30f3\u30c6\u30ca\u30ed\u30b0\u306e\u96c6\u4e2d\u7ba1\u7406<\/li>\n\n\n\n<li>Xdebug\u306b\u3088\u308bPHP\u30c7\u30d0\u30c3\u30b0\u306e\u7c21\u6613\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u5404\u7a2e\u958b\u767a\u30c4\u30fc\u30eb\u306e\u7d71\u5408\u3055\u308c\u305f\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9<\/li>\n<\/ul>\n\n\n\n<p>Laravel Sail\u306f\u3001\u300c\u8a2d\u5b9a\u3088\u308a\u898f\u7d04\u300d\u306e\u601d\u60f3\u3092 Docker\u74b0\u5883\u306b\u3082\u9069\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u958b\u767a\u8005\u304c\u30d3\u30b8\u30cd\u30b9\u30ed\u30b8\u30c3\u30af\u306e\u5b9f\u88c5\u306b\u96c6\u4e2d\u3067\u304d\u308b\u74b0\u5883\u3092\u63d0\u4f9b\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u7acb\u3061\u4e0a\u3052\u304b\u3089\u672c\u756a\u30c7\u30d7\u30ed\u30a4\u307e\u3067\u306e\u30b5\u30a4\u30af\u30eb\u304c\u5927\u5e45\u306b\u77ed\u7e2e\u3055\u308c\u3001\u73fe\u4ee3\u306e\u30a2\u30b8\u30e3\u30a4\u30eb\u958b\u767a\u306b\u6c42\u3081\u3089\u308c\u308b\u4fca\u654f\u6027\u3092\u5b9f\u73fe\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-4\">Laravel Sail\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u624b\u9806<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u524d\u63d0\u6761\u4ef6\u306e\u78ba\u8a8d\u3068Docker\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h3>\n\n\n\n<p>Laravel Sail\u3092\u4f7f\u7528\u3059\u308b\u524d\u306b\u3001\u4ee5\u4e0b\u306e\u74b0\u5883\u8981\u4ef6\u3092\u78ba\u8a8d\u3057\u307e\u3057\u3087\u3046\uff1a<\/p>\n\n\n\n<p><strong>\u5fc5\u9808\u8981\u4ef6\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker Engine 20.10.0\u4ee5\u4e0a<\/li>\n\n\n\n<li>Docker Compose v2.0.0\u4ee5\u4e0a<\/li>\n\n\n\n<li>Git<\/li>\n\n\n\n<li>Composer<\/li>\n<\/ul>\n\n\n\n<p>\u5404OS\u5225\u306eDocker\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u624b\u9806\uff1a<\/p>\n\n\n\n<p><strong>Windows<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>WSL2\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/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=\"\">   wsl --install<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Docker Desktop for Windows\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.docker.com\/products\/docker-desktop\">\u516c\u5f0f\u30b5\u30a4\u30c8<\/a>\u304b\u3089\u30a4\u30f3\u30b9\u30c8\u30fc\u30e9\u30fc\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/li>\n\n\n\n<li>WSL2\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u306e\u6709\u52b9\u5316\u3092\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<p><strong>macOS<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Docker Desktop for Mac\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/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=\"\">   brew install --cask docker<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u8d77\u52d5\u3068\u521d\u671f\u8a2d\u5b9a<\/li>\n<\/ol>\n\n\n\n<p><strong>Linux (Ubuntu)<\/strong><\/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=\"\"># \u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\nsudo apt-get update\nsudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin\n\n# Docker\u30b5\u30fc\u30d3\u30b9\u306e\u8d77\u52d5\nsudo systemctl start docker\nsudo systemctl enable docker<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">composer require\u30b3\u30de\u30f3\u30c9\u306b\u3088\u308bSail\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h3>\n\n\n\n<p>\u65b0\u898f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u5834\u5408\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=\"\"># Laravel \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210\u3068Sail\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\ncurl -s \"https:\/\/laravel.build\/example-app\" | bash\n\n# \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3078\u306e\u79fb\u52d5\ncd example-app<\/pre>\n\n\n\n<p>\u65e2\u5b58\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u5834\u5408\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=\"\"># Sail\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\ncomposer require laravel\/sail --dev\n\n# Sail\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u516c\u958b\nphp artisan sail:install<\/pre>\n\n\n\n<p>\u9078\u629e\u53ef\u80fd\u306a\u30b5\u30fc\u30d3\u30b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>mysql<\/li>\n\n\n\n<li>pgsql<\/li>\n\n\n\n<li>mariadb<\/li>\n\n\n\n<li>redis<\/li>\n\n\n\n<li>memcached<\/li>\n\n\n\n<li>meilisearch<\/li>\n\n\n\n<li>minio<\/li>\n\n\n\n<li>mailhog<\/li>\n\n\n\n<li>selenium<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u521d\u56de\u8d77\u52d5\u6642\u306e\u6ce8\u610f\u70b9\u3068\u78ba\u8a8d\u4e8b\u9805<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u74b0\u5883\u5909\u6570\u306e\u8a2d\u5b9a<\/strong><\/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=\"\">   # .env.example\u304b\u3089.env\u3092\u30b3\u30d4\u30fc\n   cp .env.example .env\n\n   # \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30ad\u30fc\u306e\u751f\u6210\n   .\/vendor\/bin\/sail artisan key:generate<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u306e\u8a2d\u5b9a<\/strong><\/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=\"\">   # storage\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u6a29\u9650\u8a2d\u5b9a\n   chmod -R 777 storage bootstrap\/cache<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u4f9d\u5b58\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/strong><\/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=\"\">   # Composer\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\n   .\/vendor\/bin\/sail composer install\n\n   # NPM\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\uff08\u5fc5\u8981\u306a\u5834\u5408\uff09\n   .\/vendor\/bin\/sail npm install<\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>\u52d5\u4f5c\u78ba\u8a8d<\/strong><\/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=\"\">   # \u30b3\u30f3\u30c6\u30ca\u306e\u8d77\u52d5\n   .\/vendor\/bin\/sail up -d\n\n   # \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\n   .\/vendor\/bin\/sail artisan migrate<\/pre>\n\n\n\n<p><strong>\u78ba\u8a8d\u9805\u76ee\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/strong>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] http:\/\/localhost \u3078\u306e\u30a2\u30af\u30bb\u30b9\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] \u5404\u30b3\u30f3\u30c6\u30ca\u306e\u8d77\u52d5\u72b6\u614b\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] \u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u306e\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>[ ] .env\u30d5\u30a1\u30a4\u30eb\u306e\u8a2d\u5b9a\u5185\u5bb9<\/li>\n<\/ul>\n\n\n\n<p>\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u5b8c\u4e86\u5f8c\u3001\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3067\u30b9\u30c6\u30fc\u30bf\u30b9\u78ba\u8a8d\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=\"\"># \u30b3\u30f3\u30c6\u30ca\u306e\u72b6\u614b\u78ba\u8a8d\n.\/vendor\/bin\/sail ps\n\n# \u30ed\u30b0\u306e\u78ba\u8a8d\n.\/vendor\/bin\/sail logs\n\n# PHP\u60c5\u5831\u306e\u78ba\u8a8d\n.\/vendor\/bin\/sail php -v<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-8\">Laravel Sail\u306e\u4e3b\u8981\u30b3\u30de\u30f3\u30c9\u5b8c\u5168\u30ac\u30a4\u30c9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u958b\u767a\u74b0\u5883\u306e\u8d77\u52d5\u30fb\u505c\u6b62\u30fb\u518d\u8d77\u52d5\u30b3\u30de\u30f3\u30c9<\/h3>\n\n\n\n<p><strong>\u57fa\u672c\u7684\u306a\u74b0\u5883\u7ba1\u7406\u30b3\u30de\u30f3\u30c9<\/strong><\/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=\"\"># \u958b\u767a\u74b0\u5883\u306e\u8d77\u52d5\uff08\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u5b9f\u884c\uff09\n.\/vendor\/bin\/sail up -d\n\n# \u958b\u767a\u74b0\u5883\u306e\u505c\u6b62\n.\/vendor\/bin\/sail down\n\n# \u30b3\u30f3\u30c6\u30ca\u306e\u518d\u8d77\u52d5\n.\/vendor\/bin\/sail restart\n\n# \u7279\u5b9a\u306e\u30b5\u30fc\u30d3\u30b9\u306e\u518d\u8d77\u52d5\n.\/vendor\/bin\/sail restart mysql<\/pre>\n\n\n\n<p><strong>\u5fdc\u7528\u7684\u306a\u8d77\u52d5\u30aa\u30d7\u30b7\u30e7\u30f3<\/strong><\/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\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u3067\u306e\u8d77\u52d5\uff08\u30ed\u30b0\u3092\u8868\u793a\uff09\n.\/vendor\/bin\/sail up\n\n# \u7279\u5b9a\u306e\u30b5\u30fc\u30d3\u30b9\u306e\u307f\u8d77\u52d5\n.\/vendor\/bin\/sail up mysql redis\n\n# \u30b3\u30f3\u30c6\u30ca\u306e\u5f37\u5236\u518d\u69cb\u7bc9\n.\/vendor\/bin\/sail build --no-cache<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u306b\u95a2\u3059\u308b\u4fbf\u5229\u306a\u30b3\u30de\u30f3\u30c9\u96c6<\/h3>\n\n\n\n<p><strong>\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u95a2\u9023<\/strong><\/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=\"\"># \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u884c\n.\/vendor\/bin\/sail artisan migrate\n\n# \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\n.\/vendor\/bin\/sail artisan migrate:rollback\n\n# \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u518d\u69cb\u7bc9\u3068\u30b7\u30fc\u30c9\n.\/vendor\/bin\/sail artisan migrate:fresh --seed<\/pre>\n\n\n\n<p><strong>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c<\/strong><\/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=\"\"># MySQL\u3078\u306e\u63a5\u7d9a\n.\/vendor\/bin\/sail mysql\n\n# \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\n.\/vendor\/bin\/sail mysql -e \"SHOW DATABASES\" &gt; databases.txt\n\n# \u30c7\u30fc\u30bf\u306e\u30a4\u30f3\u30dd\u30fc\u30c8\n.\/vendor\/bin\/sail mysql &lt; dump.sql<\/pre>\n\n\n\n<p><strong>Redis\u64cd\u4f5c<\/strong><\/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=\"\"># Redis\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3078\u306e\u63a5\u7d9a\n.\/vendor\/bin\/sail redis\n\n# \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u30af\u30ea\u30a2\n.\/vendor\/bin\/sail artisan cache:clear<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u30c6\u30b9\u30c8\u3084\u30ad\u30e3\u30c3\u30b7\u30e5\u30af\u30ea\u30a2\u306e\u52b9\u7387\u7684\u306a\u5b9f\u884c\u65b9\u6cd5<\/h3>\n\n\n\n<p><strong>\u30c6\u30b9\u30c8\u5b9f\u884c\u30b3\u30de\u30f3\u30c9<\/strong><\/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=\"\"># \u5168\u30c6\u30b9\u30c8\u306e\u5b9f\u884c\n.\/vendor\/bin\/sail test\n\n# \u7279\u5b9a\u306e\u30c6\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u306e\u5b9f\u884c\n.\/vendor\/bin\/sail test tests\/Feature\/UserTest.php\n\n# \u30d1\u30e9\u30ec\u30eb\u30c6\u30b9\u30c8\u306e\u5b9f\u884c\n.\/vendor\/bin\/sail test --parallel\n\n# \u30ab\u30d0\u30ec\u30c3\u30b8\u30ec\u30dd\u30fc\u30c8\u306e\u751f\u6210\n.\/vendor\/bin\/sail test --coverage<\/pre>\n\n\n\n<p><strong>\u30ad\u30e3\u30c3\u30b7\u30e5\u7ba1\u7406\u30b3\u30de\u30f3\u30c9<\/strong><\/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=\"\"># \u8a2d\u5b9a\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u30af\u30ea\u30a2\n.\/vendor\/bin\/sail artisan config:clear\n\n# \u30eb\u30fc\u30c8\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u30af\u30ea\u30a2\n.\/vendor\/bin\/sail artisan route:clear\n\n# \u30d3\u30e5\u30fc\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u30af\u30ea\u30a2\n.\/vendor\/bin\/sail artisan view:clear\n\n# \u5168\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u30af\u30ea\u30a2\n.\/vendor\/bin\/sail artisan optimize:clear<\/pre>\n\n\n\n<p><strong>\u958b\u767a\u52b9\u7387\u3092\u4e0a\u3052\u308b\u305d\u306e\u4ed6\u306e\u30b3\u30de\u30f3\u30c9<\/strong><\/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\u306e\u30b9\u30c6\u30fc\u30bf\u30b9\u78ba\u8a8d\n.\/vendor\/bin\/sail artisan about\n\n# \u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u30e2\u30fc\u30c9\u306e\u5207\u308a\u66ff\u3048\n.\/vendor\/bin\/sail artisan down\n.\/vendor\/bin\/sail artisan up\n\n# \u30ad\u30e5\u30fc\u30ef\u30fc\u30ab\u30fc\u306e\u8d77\u52d5\n.\/vendor\/bin\/sail artisan queue:work\n\n# \u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u30bf\u30b9\u30af\u306e\u5b9f\u884c\n.\/vendor\/bin\/sail artisan schedule:run<\/pre>\n\n\n\n<p>\u4fbf\u5229\u306a\u30a8\u30a4\u30ea\u30a2\u30b9\u8a2d\u5b9a\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=\"\"># ~\/.bashrc\u307e\u305f\u306f~\/.zshrc\u306b\u8ffd\u52a0\nalias sail='[ -f sail ] &amp;&amp; sh sail || sh vendor\/bin\/sail'<\/pre>\n\n\n\n<p>\u3053\u308c\u306b\u3088\u308a\u3001<code>sail up -d<\/code> \u306e\u3088\u3046\u306b\u77ed\u7e2e\u5f62\u3067\u5b9f\u884c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-12\">Laravel Sail\u306b\u3088\u308b\u958b\u767a\u74b0\u5883\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">docker-compose.yml\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<p>Docker\u74b0\u5883\u306e\u67d4\u8edf\u306a\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u306b\u306f\u3001docker-compose.yml\u30d5\u30a1\u30a4\u30eb\u306e\u9069\u5207\u306a\u8a2d\u5b9a\u304c\u4e0d\u53ef\u6b20\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u5b9f\u8df5\u7684\u306a\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u7d39\u4ecb\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<p><strong>1. \u57fa\u672c\u69cb\u6210\u306e\u6700\u9069\u5316<\/strong><\/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=\"\"># docker-compose.yml\nservices:\n    laravel.test:\n        build:\n            context: .\/vendor\/laravel\/sail\/runtimes\/8.2\n            dockerfile: Dockerfile\n            args:\n                WWWGROUP: '${WWWGROUP}'\n        image: sail-8.2\/app\n        ports:\n            - '${APP_PORT:-80}:80'\n            - '${VITE_PORT:-5173}:${VITE_PORT:-5173}'\n        environment:\n            WWWUSER: '${WWWUSER}'\n            LARAVEL_SAIL: 1\n        volumes:\n            - '.:\/var\/www\/html'\n        networks:\n            - sail\n        depends_on:\n            - mysql\n            - redis<\/pre>\n\n\n\n<p><strong>2. \u30ea\u30bd\u30fc\u30b9\u5236\u9650\u306e\u8a2d\u5b9a<\/strong><\/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=\"\">services:\n    laravel.test:\n        # ... \u4ed6\u306e\u8a2d\u5b9a ...\n        deploy:\n            resources:\n                limits:\n                    cpus: '2'\n                    memory: 4G\n                reservations:\n                    cpus: '1'\n                    memory: 2G<\/pre>\n\n\n\n<p><strong>3. \u958b\u767a\u74b0\u5883\u56fa\u6709\u306e\u6700\u9069\u5316<\/strong><\/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=\"\">services:\n    laravel.test:\n        # ... \u4ed6\u306e\u8a2d\u5b9a ...\n        environment:\n            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'\n            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u8ffd\u52a0\u30b5\u30fc\u30d3\u30b9\u306e\u5c0e\u5165\u624b\u9806\u3068\u6ce8\u610f\u70b9<\/h3>\n\n\n\n<p><strong>1. \u30e1\u30fc\u30eb\u30c6\u30b9\u30c8\u74b0\u5883\uff08Mailhog\uff09\u306e\u8ffd\u52a0<\/strong><\/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=\"\">services:\n    mailhog:\n        image: 'mailhog\/mailhog:latest'\n        ports:\n            - '${FORWARD_MAILHOG_PORT:-1025}:1025'\n            - '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'\n        networks:\n            - sail<\/pre>\n\n\n\n<p><strong>2. \u30ad\u30e3\u30c3\u30b7\u30e5\u30b5\u30fc\u30d0\u30fc\uff08Redis\uff09\u306e\u8a2d\u5b9a<\/strong><\/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=\"\">services:\n    redis:\n        image: 'redis:alpine'\n        ports:\n            - '${FORWARD_REDIS_PORT:-6379}:6379'\n        volumes:\n            - 'sail-redis:\/data'\n        networks:\n            - sail\n        healthcheck:\n            test: [\"CMD\", \"redis-cli\", \"ping\"]<\/pre>\n\n\n\n<p><strong>\u5c0e\u5165\u6642\u306e\u6ce8\u610f\u70b9\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u65b0\u3057\u3044\u30b5\u30fc\u30d3\u30b9\u3092\u8ffd\u52a0\u3057\u305f\u5f8c\u306f\u3001\u30b3\u30f3\u30c6\u30ca\u306e\u518d\u69cb\u7bc9\u304c\u5fc5\u8981<\/li>\n\n\n\n<li>\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u6c38\u7d9a\u5316\u8a2d\u5b9a\u3092\u5fd8\u308c\u305a\u306b\u884c\u3046<\/li>\n\n\n\n<li>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u8a2d\u5b9a\u306e\u6574\u5408\u6027\u3092\u78ba\u8a8d<\/li>\n\n\n\n<li>\u74b0\u5883\u5909\u6570\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u672c\u756a\u74b0\u5883\u3078\u306e\u79fb\u884c\u3092\u898b\u636e\u3048\u305f\u8a2d\u5b9a\u306e\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<p><strong>1. \u30de\u30eb\u30c1\u30b9\u30c6\u30fc\u30b8\u30d3\u30eb\u30c9\u306e\u6d3b\u7528<\/strong><\/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=\"\"># Dockerfile\nFROM php:8.2-fpm as base\n\n# \u958b\u767a\u74b0\u5883\u7528\nFROM base as local\nRUN pecl install xdebug\nCOPY xdebug.ini \/usr\/local\/etc\/php\/conf.d\/\n\n# \u672c\u756a\u74b0\u5883\u7528\nFROM base as production\nRUN php artisan config:cache\nRUN php artisan route:cache<\/pre>\n\n\n\n<p><strong>2. \u74b0\u5883\u5225\u306e\u8a2d\u5b9a\u5206\u96e2<\/strong><\/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=\"\"># docker-compose.prod.yml\nservices:\n    laravel.test:\n        build:\n            target: production\n        environment:\n            APP_ENV: production\n            APP_DEBUG: 'false'\n        volumes:\n            - .\/storage\/logs:\/var\/www\/html\/storage\/logs:delegated<\/pre>\n\n\n\n<p><strong>\u672c\u756a\u74b0\u5883\u79fb\u884c\u6642\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\uff1a<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e0d\u8981\u306a\u30dd\u30fc\u30c8\u306e\u9732\u51fa\u3092\u9632\u3050<\/li>\n\n\n\n<li>\u6a5f\u5bc6\u60c5\u5831\u306e\u74b0\u5883\u5909\u6570\u5316<\/li>\n\n\n\n<li>\u30a2\u30af\u30bb\u30b9\u5236\u9650\u306e\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OPcache\u306e\u8a2d\u5b9a<\/li>\n\n\n\n<li>Composer\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30a2\u30bb\u30c3\u30c8\u306e\u5727\u7e2e<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u76e3\u8996\u30fb\u30ed\u30b0\u8a2d\u5b9a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ed\u30b0\u30ed\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3\u306e\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u30c4\u30fc\u30eb\u306e\u5c0e\u5165<\/li>\n\n\n\n<li>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u6226\u7565\u306e\u78ba\u7acb<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u5bfe\u7b56<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6c34\u5e73\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u306e\u6e96\u5099<\/li>\n\n\n\n<li>\u30b9\u30c6\u30fc\u30c8\u30ec\u30b9\u5316\u306e\u5fb9\u5e95<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u6700\u9069\u5316<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-16\">Laravel Sail\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u8d77\u52d5\u6642\u306b\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<p><strong>1. \u30dd\u30fc\u30c8\u7af6\u5408\u306e\u554f\u984c<\/strong><\/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=\"\"># \u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\nError starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use\n\n# \u89e3\u6c7a\u65b9\u6cd5\n# \u4f7f\u7528\u4e2d\u306e\u30dd\u30fc\u30c8\u306e\u78ba\u8a8d\nsudo lsof -i :80\n\n# .env\u30d5\u30a1\u30a4\u30eb\u3067\u30dd\u30fc\u30c8\u756a\u53f7\u306e\u5909\u66f4\nAPP_PORT=8080<\/pre>\n\n\n\n<p><strong>2. \u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u95a2\u9023\u306e\u30a8\u30e9\u30fc<\/strong><\/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=\"\"># \u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\nfailed to solve: process \"\/dev\/init\" did not complete successfully\n\n# \u89e3\u6c7a\u65b9\u6cd5\n# \u30b9\u30c8\u30ec\u30fc\u30b8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u6a29\u9650\u4fee\u6b63\nchmod -R 775 storage bootstrap\/cache\nchown -R $USER:www-data storage bootstrap\/cache\n\n# Sail\u30b3\u30f3\u30c6\u30ca\u5185\u3067\u306e\u30e6\u30fc\u30b6\u30fc\u8a2d\u5b9a\nWWWUSER=$(id -u)\nWWWGROUP=$(id -g)<\/pre>\n\n\n\n<p><strong>3. \u30e1\u30e2\u30ea\u4e0d\u8db3\u30a8\u30e9\u30fc<\/strong><\/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=\"\"># \u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\nKilled\nOOM killed process\n\n# \u89e3\u6c7a\u65b9\u6cd5\n# docker-compose.yml\u3067\u30e1\u30e2\u30ea\u5236\u9650\u306e\u8abf\u6574\nservices:\n    laravel.test:\n        deploy:\n            resources:\n                limits:\n                    memory: 2G<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\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<p><strong>1. PHP\u306e\u8a2d\u5b9a\u6700\u9069\u5316<\/strong><\/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=\"\"># php.ini \u30ab\u30b9\u30bf\u30de\u30a4\u30ba\nmemory_limit = 256M\nmax_execution_time = 60\nopcache.enable=1\nopcache.memory_consumption=128\nopcache.interned_strings_buffer=8\nopcache.max_accelerated_files=4000<\/pre>\n\n\n\n<p><strong>2. MySQL\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0<\/strong><\/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=\"\"># my.cnf \u30ab\u30b9\u30bf\u30de\u30a4\u30ba\ninnodb_buffer_pool_size = 1G\ninnodb_log_file_size = 256M\nmax_connections = 100\nquery_cache_size = 64M<\/pre>\n\n\n\n<p><strong>\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ea\u30bd\u30fc\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u306e\u5c0e\u5165<\/li>\n\n\n\n<li>\u30af\u30a8\u30ea\u30ed\u30b0\u306e\u5206\u6790<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u5b9a\u671f\u7684\u306a\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u8a08\u753b<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u524a\u6e1b\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p><strong>1. Docker\u30a4\u30e1\u30fc\u30b8\u306e\u6700\u9069\u5316<\/strong><\/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=\"\"># \u30de\u30eb\u30c1\u30b9\u30c6\u30fc\u30b8\u30d3\u30eb\u30c9\u306e\u6d3b\u7528\nFROM php:8.2-fpm-alpine as base\n\n# \u5fc5\u8981\u6700\u5c0f\u9650\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\nRUN apk add --no-cache \\\n    postgresql-dev \\\n    libzip-dev\n\n# \u958b\u767a\u74b0\u5883\u4e0d\u8981\u306a\u30c4\u30fc\u30eb\u306e\u9664\u5916\nFROM base as production\nRUN rm -rf \/var\/cache\/apk\/* \/tmp\/*<\/pre>\n\n\n\n<p><strong>2. \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30ec\u30d9\u30eb\u306e\u6700\u9069\u5316<\/strong><\/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=\"\">\/\/ \u30ad\u30e5\u30fc\u306e\u6700\u9069\u5316\nphp artisan queue:work --memory=128 --timeout=60\n\n\/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u52b9\u7387\u7684\u306a\u5229\u7528\nCache::remember('key', 3600, function () {\n    return expensive_operation();\n});<\/pre>\n\n\n\n<p><strong>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u524a\u6e1b\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\uff1a<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30b3\u30f3\u30c6\u30ca\u306e\u6700\u9069\u5316<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e0d\u8981\u306a\u30b5\u30fc\u30d3\u30b9\u306e\u7121\u52b9\u5316<\/li>\n\n\n\n<li>\u30a2\u30eb\u30d1\u30a4\u30f3\u30d9\u30fc\u30b9\u30a4\u30e1\u30fc\u30b8\u306e\u4f7f\u7528<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30ac\u30d9\u30fc\u30b8\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u8a2d\u5b9a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30ed\u30b0\u30ed\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3\u306e\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u306e\u5b9a\u671f\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u958b\u767a\u30c4\u30fc\u30eb\u306e\u7ba1\u7406<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u958b\u767a\u74b0\u5883\u5c02\u7528\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u5206\u96e2<\/li>\n\n\n\n<li>\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u306e\u9069\u5207\u306a\u5236\u5fa1<\/li>\n\n\n\n<li>\u672a\u4f7f\u7528\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u524a\u9664<\/li>\n<\/ul>\n\n\n\n<p><strong>\u76e3\u8996\u3068\u30a2\u30e9\u30fc\u30c8\u8a2d\u5b9a\uff1a<\/strong><\/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=\"\"># \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996\ndocker stats\n\n# \u30a2\u30e9\u30fc\u30c8\u95be\u5024\u306e\u8a2d\u5b9a\ndocker run -m 2g --memory-reservation 1.5g laravel.test<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-20\">Laravel Sail\u3092\u4f7f\u3063\u305f\u5b9f\u8df5\u7684\u306a\u958b\u767a\u30d5\u30ed\u30fc<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u30c1\u30fc\u30e0\u958b\u767a\u306b\u304a\u3051\u308b\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<p>\u30c1\u30fc\u30e0\u958b\u767a\u3067Laravel Sail\u3092\u52b9\u679c\u7684\u306b\u6d3b\u7528\u3059\u308b\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u3054\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>1. \u74b0\u5883\u8a2d\u5b9a\u306e\u7d71\u4e00\u5316<\/strong><\/p>\n\n\n\n<p><code>.env.example<\/code>\u306e\u6a19\u6e96\u5316\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=\"\"># \u57fa\u672c\u8a2d\u5b9a\nAPP_NAME=YourApp\nAPP_ENV=local\nAPP_DEBUG=true\n\n# \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u8a2d\u5b9a\nDB_CONNECTION=mysql\nDB_HOST=mysql\nDB_PORT=3306\nDB_DATABASE=laravel\nDB_USERNAME=sail\nDB_PASSWORD=password\n\n# Sail\u306e\u8ffd\u52a0\u8a2d\u5b9a\nFORWARD_DB_PORT=3307\nFORWARD_REDIS_PORT=6380\nSAIL_XDEBUG_MODE=develop,debug<\/pre>\n\n\n\n<p><strong>2. \u958b\u767a\u74b0\u5883\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u306e\u81ea\u52d5\u5316<\/strong><\/p>\n\n\n\n<p>\u65b0\u898f\u30e1\u30f3\u30d0\u30fc\u5411\u3051\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u30b9\u30af\u30ea\u30d7\u30c8\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=\"\">#!\/bin\/bash\n# setup-project.sh\n\n# \u74b0\u5883\u30d5\u30a1\u30a4\u30eb\u306e\u6e96\u5099\ncp .env.example .env\n\n# \u4f9d\u5b58\u95a2\u4fc2\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\ncomposer install\n\n# Sail\u306e\u8d77\u52d5\n.\/vendor\/bin\/sail up -d\n\n# \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3068\u30b7\u30fc\u30c9\n.\/vendor\/bin\/sail artisan migrate --seed\n\n# \u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u74b0\u5883\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\n.\/vendor\/bin\/sail npm install\n.\/vendor\/bin\/sail npm run dev<\/pre>\n\n\n\n<p><strong>3. \u5171\u901a\u306e\u958b\u767a\u898f\u7d04<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30df\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8<\/li>\n<\/ul>\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=\"\"># \u4f8b\uff1a\nfeat: \u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u6a5f\u80fd\u306e\u8ffd\u52a0\nfix: \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u30a8\u30e9\u30fc\u306e\u4fee\u6b63\ndocs: README\u306e\u66f4\u65b0<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d6\u30e9\u30f3\u30c1\u547d\u540d\u898f\u5247<\/li>\n<\/ul>\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=\"\">feature\/user-authentication\nbugfix\/db-connection\nhotfix\/security-patch\nrelease\/v1.2.0<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">CI\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/h3>\n\n\n\n<p><strong>1. GitHub Actions\u306e\u8a2d\u5b9a<\/strong><\/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=\"\"># .github\/workflows\/laravel.yml\nname: Laravel CI\/CD\n\non:\n  push:\n    branches: [ main, develop ]\n  pull_request:\n    branches: [ main, develop ]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions\/checkout@v3\n\n    - name: Setup Laravel Sail\n      run: |\n        cp .env.example .env\n        composer install\n        php artisan key:generate\n\n    - name: Start Docker containers\n      run: |\n        .\/vendor\/bin\/sail up -d\n        .\/vendor\/bin\/sail php artisan config:cache\n\n    - name: Run Tests\n      run: |\n        .\/vendor\/bin\/sail php artisan test --parallel\n        .\/vendor\/bin\/sail php artisan test:coverage\n\n    - name: Static Analysis\n      run: |\n        .\/vendor\/bin\/sail php artisan insights --no-interaction<\/pre>\n\n\n\n<p><strong>2. \u81ea\u52d5\u30c6\u30b9\u30c8\u306e\u6574\u5099<\/strong><\/p>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u30c6\u30b9\u30c8\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\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=\"\">\/\/ tests\/Feature\/UserRegistrationTest.php\npublic function test_user_can_register()\n{\n    $response = $this-&gt;post('\/register', [\n        'name' =&gt; 'Test User',\n        'email' =&gt; 'test@example.com',\n        'password' =&gt; 'password',\n        'password_confirmation' =&gt; 'password',\n    ]);\n\n    $response-&gt;assertRedirect('\/home');\n    $this-&gt;assertDatabaseHas('users', [\n        'email' =&gt; 'test@example.com'\n    ]);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-23\">\u672c\u756a\u30c7\u30d7\u30ed\u30a4\u307e\u3067\u306e\u5177\u4f53\u7684\u306a\u624b\u9806<\/h3>\n\n\n\n<p><strong>1. \u30c7\u30d7\u30ed\u30a4\u524d\u306e\u6e96\u5099<\/strong><\/p>\n\n\n\n<p>\u672c\u756a\u74b0\u5883\u7528\u306e\u6700\u9069\u5316\u30b9\u30af\u30ea\u30d7\u30c8\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=\"\">#!\/bin\/bash\n# optimize-production.sh\n\n# \u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u30e2\u30fc\u30c9\u306e\u958b\u59cb\n.\/vendor\/bin\/sail artisan down\n\n# \u4f9d\u5b58\u95a2\u4fc2\u306e\u6700\u9069\u5316\n.\/vendor\/bin\/sail composer install --no-dev --optimize-autoloader\n\n# \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6700\u9069\u5316\n.\/vendor\/bin\/sail artisan config:cache\n.\/vendor\/bin\/sail artisan route:cache\n.\/vendor\/bin\/sail artisan view:cache\n.\/vendor\/bin\/sail artisan storage:link\n\n# \u30a2\u30bb\u30c3\u30c8\u306e\u30d3\u30eb\u30c9\n.\/vendor\/bin\/sail npm ci\n.\/vendor\/bin\/sail npm run build\n\n# \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u66f4\u65b0\n.\/vendor\/bin\/sail artisan migrate --force\n\n# \u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u30e2\u30fc\u30c9\u306e\u89e3\u9664\n.\/vendor\/bin\/sail artisan up<\/pre>\n\n\n\n<p><strong>2. \u30c7\u30d7\u30ed\u30a4\u8a2d\u5b9a\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/strong><\/p>\n\n\n\n<p>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\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=\"\"># Nginx\u306e\u8a2d\u5b9a\u4f8b\nserver {\n    listen 443 ssl http2;\n    server_name example.com;\n\n    # SSL\u306e\u8a2d\u5b9a\n    ssl_certificate \/etc\/nginx\/ssl\/live\/example.com\/fullchain.pem;\n    ssl_certificate_key \/etc\/nginx\/ssl\/live\/example.com\/privkey.pem;\n\n    # \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30d8\u30c3\u30c0\u30fc\n    add_header X-Frame-Options \"SAMEORIGIN\";\n    add_header X-XSS-Protection \"1; mode=block\";\n    add_header X-Content-Type-Options \"nosniff\";\n\n    # \u305d\u306e\u4ed6\u306e\u8a2d\u5b9a...\n}<\/pre>\n\n\n\n<p><strong>3. \u672c\u756a\u74b0\u5883\u3067\u306e\u76e3\u8996\u4f53\u5236<\/strong><\/p>\n\n\n\n<p>\u76e3\u8996\u8a2d\u5b9a\u306e\u4f8b\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\/logging.php\n'production' =&gt; [\n    'driver' =&gt; 'stack',\n    'channels' =&gt; ['daily', 'slack'],\n    'ignore_exceptions' =&gt; false,\n],\n\n'slack' =&gt; [\n    'driver' =&gt; 'slack',\n    'url' =&gt; env('LOG_SLACK_WEBHOOK_URL'),\n    'username' =&gt; 'Laravel Log',\n    'emoji' =&gt; ':boom:',\n    'level' =&gt; env('LOG_LEVEL', 'critical'),\n],<\/pre>\n\n\n\n<p><strong>\u30c7\u30d7\u30ed\u30a4\u5f8c\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u52d5\u4f5c\u78ba\u8a8d<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u57fa\u672c\u6a5f\u80fd\u306e\u52d5\u4f5c\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30ed\u30b0\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u78ba\u8a8d<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SSL\u8a3c\u660e\u66f8\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30a2\u30af\u30bb\u30b9\u6a29\u9650\u306e\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u78ba\u8a8d<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d0\u30c3\u30af\u30a2\u30c3\u30d7<\/li>\n\n\n\n<li>\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d0\u30c3\u30af\u30a2\u30c3\u30d7<\/li>\n\n\n\n<li>\u30ea\u30b9\u30c8\u30a2\u624b\u9806\u306e\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u8a2d\u5b9a\u3068\u624b\u9806\u3092\u9069\u5207\u306b\u5b9f\u65bd\u3059\u308b\u3053\u3068\u3067\u3001Laravel Sail\u3092\u4f7f\u7528\u3057\u305f\u958b\u767a\u304b\u3089\u30c7\u30d7\u30ed\u30a4\u307e\u3067\u306e\u4e00\u8cab\u3057\u305f\u6d41\u308c\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u30c1\u30fc\u30e0\u5168\u4f53\u3067\u5171\u6709\u3057\u3001\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u66f4\u65b0\u3057\u3066\u3044\u304f\u3053\u3068\u3067\u3001\u3088\u308a\u52b9\u7387\u7684\u306a\u958b\u767a\u30d7\u30ed\u30bb\u30b9\u3092\u78ba\u7acb\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":[33,12],"tags":[],"class_list":{"0":"post-3190","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php-laravel","7":"category-php","8":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3190","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=3190"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3190\/revisions"}],"predecessor-version":[{"id":3192,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3190\/revisions\/3192"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3190"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3190"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3190"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}