{"id":237,"date":"2022-09-17T20:18:26","date_gmt":"2023-06-23T18:12:33","guid":{"rendered":"https:\/\/www.silicloud.com\/ja\/blog\/index.php\/2023\/11\/30\/node-js%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92nginx%e3%80%81lets-encrypt%e3%80%81%e3%81%8a%e3%82%88%e3%81%b3docker-compose%e3%81%a7%e5%ae%89%e5%85%a8\/"},"modified":"2025-07-31T21:53:04","modified_gmt":"2025-07-31T12:53:04","slug":"node-js%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92nginx%e3%80%81lets-encrypt%e3%80%81%e3%81%8a%e3%82%88%e3%81%b3docker-compose%e3%81%a7%e5%ae%89%e5%85%a8","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/ja\/blog\/node-js%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92nginx%e3%80%81lets-encrypt%e3%80%81%e3%81%8a%e3%82%88%e3%81%b3docker-compose%e3%81%a7%e5%ae%89%e5%85%a8\/","title":{"rendered":"Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092Nginx\u3001Let&#8217;s Encrypt\u3001\u304a\u3088\u3073Docker Compose\u3067\u5b89\u5168\u306b\u30b3\u30f3\u30c6\u30ca\u5316\u306e\u65b9\u6cd5"},"content":{"rendered":"<h3>\u5e8f\u6587<\/h3>\n<p>Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u67d4\u8edf\u6027\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u5411\u4e0a\u3055\u305b\u308b\u65b9\u6cd5\u306f\u8907\u6570\u3042\u308a\u307e\u3059\u3002Nginx\u306e\u3088\u3046\u306a\u30ea\u30d0\u30fc\u30b9\u30d7\u30ed\u30ad\u30b7\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u8ca0\u8377\u5206\u6563\u3001\u9759\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u3001\u30c8\u30e9\u30f3\u30b9\u30dd\u30fc\u30c8\u5c64\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\uff08TLS\uff09\u306e\u5b9f\u88c5\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u30b5\u30fc\u30d0\u30fc\u3067\u6697\u53f7\u5316\u3055\u308c\u305fHTTPS\u3092\u6709\u52b9\u306b\u3059\u308b\u3053\u3068\u306b\u3088\u308a\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3078\u306e\u901a\u4fe1\u306f\u5b89\u5168\u306b\u4fdd\u305f\u308c\u307e\u3059\u3002<\/p>\n<p>\u30b3\u30f3\u30c6\u30ca\u4e0a\u3067TLS\/SSL\u3092\u4f7f\u7528\u3057\u305f\u30ea\u30d0\u30fc\u30b9\u30d7\u30ed\u30ad\u30b7\u3092\u5b9f\u88c5\u3059\u308b\u5834\u5408\u3001\u30db\u30b9\u30c8\u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0\u4e0a\u3067\u76f4\u63a5\u4f5c\u696d\u3059\u308b\u5834\u5408\u3068\u306f\u7570\u306a\u308b\u624b\u9806\u304c\u5fc5\u8981\u3067\u3059\u3002\u4f8b\u3048\u3070\u3001\u30b5\u30fc\u30d0\u4e0a\u3067\u52d5\u4f5c\u3057\u3066\u3044\u308b\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u305f\u3081\u306bLet&#8217;s Encrypt\u304b\u3089\u8a3c\u660e\u66f8\u3092\u53d6\u5f97\u3059\u308b\u5834\u5408\u3001\u5fc5\u8981\u306a\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u3092\u30db\u30b9\u30c8\u306b\u76f4\u63a5\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002\u3057\u304b\u3057\u3001\u30b3\u30f3\u30c6\u30ca\u3092\u4f7f\u7528\u3059\u308b\u3068\u7570\u306a\u308b\u65b9\u6cd5\u3067\u9032\u3081\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002Docker Compose\u3092\u4f7f\u7528\u3057\u3066\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3001\u30a6\u30a7\u30d6\u30b5\u30fc\u30d0\u3001\u304a\u3088\u3073Certbot\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u30b3\u30f3\u30c6\u30ca\u3092\u4f5c\u6210\u3057\u3001\u8a3c\u660e\u66f8\u3092\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002\u3053\u308c\u3089\u306e\u624b\u9806\u306b\u5f93\u3046\u3053\u3068\u3067\u3001\u30b3\u30f3\u30c6\u30ca\u5316\u3055\u308c\u305f\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u306e\u30e2\u30b8\u30e5\u30e9\u30ea\u30c6\u30a3\u3068\u79fb\u690d\u6027\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u3067\u306f\u3001Docker Compose\u3092\u4f7f\u7528\u3057\u3066Nginx\u30ea\u30d0\u30fc\u30b9\u30d7\u30ed\u30ad\u30b7\u3092\u4f7f\u3063\u305fNode.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30c7\u30d7\u30ed\u30a4\u3057\u307e\u3059\u3002\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u95a2\u9023\u3059\u308b\u30c9\u30e1\u30a4\u30f3\u306eTLS\/SSL\u8a3c\u660e\u66f8\u3092\u53d6\u5f97\u3057\u3001SSL Labs\u304b\u3089\u9ad8\u3044\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8a55\u4fa1\u3092\u53d7\u3051\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002\u6700\u5f8c\u306b\u3001\u8a3c\u660e\u66f8\u3092\u66f4\u65b0\u3057\u3066\u30c9\u30e1\u30a4\u30f3\u3092\u5b89\u5168\u306a\u72b6\u614b\u306b\u4fdd\u3064\u305f\u3081\u306b\u3001cron\u30b8\u30e7\u30d6\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<h2>\u524d\u63d0\u6761\u4ef6<\/h2>\n<p>\u3053\u306e\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u306b\u5f93\u3046\u305f\u3081\u306b\u306f\u3001\u6b21\u306e\u3082\u306e\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n<ul class=\"post-ul\">\n<li>An Ubuntu 18.04 server, a non-root user with sudo privileges, and an active firewall. For guidance on how to set these up, please read this Initial Server Setup guide.<\/li>\n<li>Docker and Docker Compose installed on your server. For guidance on installing Docker, follow Steps 1 and 2 of How To Install and Use Docker on Ubuntu 18.04. For guidance on installing Compose, follow Step 1 of How To Install Docker Compose on Ubuntu 18.04.<\/li>\n<li>A registered domain name. This tutorial will use your_domain throughout. You can get one for free at Freenom, or use the domain registrar of your choice.<\/li>\n<li>Both of the following DNS records set up for your server. You can follow this introduction to Silicon Cloud DNS for details on how to add them to a Silicon Cloud account, if that\u2019s what you\u2019re using:An A record with your_domain pointing to your server\u2019s public IP address.<br \/>\nAn A record with www.your_domain pointing to your server\u2019s public IP address.<\/li>\n<\/ul>\n<p>\u3059\u3079\u3066\u306e\u6e96\u5099\u304c\u6574\u3063\u305f\u3089\u3001\u6700\u521d\u306e\u30b9\u30c6\u30c3\u30d7\u3092\u59cb\u3081\u308b\u6e96\u5099\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<h2>\u30b9\u30c6\u30c3\u30d71 \u2014 \u30ce\u30fc\u30c9\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u8907\u88fd\u3068\u30c6\u30b9\u30c8<\/h2>\n<p>\u6700\u521d\u306e\u30b9\u30c6\u30c3\u30d7\u3068\u3057\u3066\u3001Node\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b3\u30fc\u30c9\u3092\u542b\u3080\u30ea\u30dd\u30b8\u30c8\u30ea\u3092\u30af\u30ed\u30fc\u30f3\u3057\u307e\u3059\u3002\u3053\u306e\u4e2d\u306b\u306fCompose\u3092\u4f7f\u3063\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30a4\u30e1\u30fc\u30b8\u3092\u30d3\u30eb\u30c9\u3059\u308b\u305f\u3081\u306eDockerfile\u3082\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002\u6b21\u306b\u3001\u30ea\u30d0\u30fc\u30b9\u30d7\u30ed\u30ad\u30b7\u3084SSL\u306a\u3057\u3067docker run\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30d3\u30eb\u30c9\u304a\u3088\u3073\u5b9f\u884c\u3057\u3066\u30c6\u30b9\u30c8\u3057\u307e\u3059\u3002<\/p>\n<p>\u3042\u306a\u305f\u306e\u975e\u30eb\u30fc\u30c8\u30e6\u30fc\u30b6\u30fc\u306e\u30db\u30fc\u30e0\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u306f\u3001Silicon Cloud Community\u306eGitHub\u30a2\u30ab\u30a6\u30f3\u30c8\u304b\u3089nodejs-image-demo\u30ea\u30dd\u30b8\u30c8\u30ea\u3092\u30af\u30ed\u30fc\u30cb\u30f3\u30b0\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u306e\u30ea\u30dd\u30b8\u30c8\u30ea\u306b\u306f\u3001Docker\u3092\u4f7f\u7528\u3057\u3066Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u69cb\u7bc9\u3059\u308b\u624b\u9806\u3067\u8aac\u660e\u3055\u308c\u3066\u3044\u308b\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u306e\u30b3\u30fc\u30c9\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u30ea\u30dd\u30b8\u30c8\u30ea\u3092\u8907\u88fd\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u306e\u4f8b\u3067\u306f\u3001\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u540d\u3068\u3057\u3066node_project\u3092\u4f7f\u7528\u3057\u3066\u3044\u307e\u3059\u3002\u304a\u597d\u307f\u306b\u5408\u308f\u305b\u3066\u3001\u3053\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u9069\u5207\u306a\u540d\u524d\u3092\u4ed8\u3051\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">git<\/span> clone https:\/\/github.com\/do-community\/nodejs-image-demo.git <mark>node_project<\/mark><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u300cnode_project\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u300d<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token builtin class-name\">cd<\/span> node_project<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u3053\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u306f\u3001Docker node:10\u30a4\u30e1\u30fc\u30b8\u3068\u73fe\u5728\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u5185\u5bb9\u3092\u4f7f\u7528\u3057\u3066Node\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30d3\u30eb\u30c9\u3059\u308b\u305f\u3081\u306e\u6307\u793a\u3092\u542b\u3080Docker\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3067Docker\u30d5\u30a1\u30a4\u30eb\u306e\u5185\u5bb9\u3092\u30d7\u30ec\u30d3\u30e5\u30fc\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">cat<\/span> Dockerfile<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>FROM node:10-alpine RUN mkdir -p \/home\/node\/app\/node_modules &amp;&amp; chown -R node:node \/home\/node\/app WORKDIR \/home\/node\/app COPY package*.json .\/ USER node RUN npm install COPY &#8211;chown=node:node . . EXPOSE 8080 CMD [ &#8220;node&#8221;, &#8220;app.js&#8221; ]<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u3053\u308c\u3089\u306e\u624b\u9806\u306f\u3001\u73fe\u5728\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304b\u3089\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30b3\u30fc\u30c9\u3092\u30b3\u30f3\u30c6\u30ca\u306b\u30b3\u30d4\u30fc\u3057\u3001npm install\u3067\u4f9d\u5b58\u95a2\u4fc2\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u3053\u3068\u3067\u3001Node\u306e\u30a4\u30e1\u30fc\u30b8\u3092\u69cb\u7bc9\u3057\u307e\u3059\u3002\u307e\u305f\u3001Docker\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u3068\u30a4\u30e1\u30fc\u30b8\u30ec\u30a4\u30e4\u30fc\u3092\u5229\u7528\u3059\u308b\u305f\u3081\u306b\u3001package.json\u3068package-lock.json\u306e\u30b3\u30d4\u30fc\u3092\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b3\u30fc\u30c9\u306e\u6b8b\u308a\u306e\u90e8\u5206\u3068\u306f\u5225\u306b\u4fdd\u6301\u3057\u307e\u3059\u3002\u6700\u5f8c\u306b\u3001\u30b3\u30f3\u30c6\u30ca\u3092\u975e\u30eb\u30fc\u30c8\u306e\u30ce\u30fc\u30c9\u30e6\u30fc\u30b6\u30fc\u3068\u3057\u3066\u5b9f\u884c\u3057\u3001\u9069\u5207\u306a\u6a29\u9650\u3092\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b3\u30fc\u30c9\u3068node_modules\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u8a2d\u5b9a\u3059\u308b\u3068\u3044\u3046\u6307\u793a\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u3053\u306eDockerfile\u3068Node\u306e\u30a4\u30e1\u30fc\u30b8\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306e\u8a73\u7d30\u306b\u3064\u3044\u3066\u306f\u3001Docker\u3092\u4f7f\u7528\u3057\u305fNode.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d3\u30eb\u30c9\u65b9\u6cd5\u306e\u30b9\u30c6\u30c3\u30d73\u3067\u5b8c\u5168\u306a\u30c7\u30a3\u30b9\u30ab\u30c3\u30b7\u30e7\u30f3\u3092\u3054\u89a7\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>SSL\u306a\u3057\u3067\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30c6\u30b9\u30c8\u3059\u308b\u305f\u3081\u306b\u3001docker build\u30b3\u30de\u30f3\u30c9\u3068-t\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u4f7f\u7528\u3057\u3066\u30a4\u30e1\u30fc\u30b8\u3092\u30d3\u30eb\u30c9\u304a\u3088\u3073\u30bf\u30b0\u4ed8\u3051\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u3053\u306e\u4f8b\u3067\u306f\u30a4\u30e1\u30fc\u30b8\u540d\u3092node-demo\u3068\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u4ed6\u306e\u540d\u524d\u3092\u81ea\u7531\u306b\u4ed8\u3051\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker<\/span> build <span class=\"token parameter variable\">-t<\/span> node-demo <span class=\"token builtin class-name\">.<\/span><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u30d3\u30eb\u30c9\u30d7\u30ed\u30bb\u30b9\u304c\u5b8c\u4e86\u3057\u305f\u3089\u3001docker images \u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30a4\u30e1\u30fc\u30b8\u3092\u4e00\u89a7\u8868\u793a\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker<\/span> images<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u4ee5\u4e0b\u306e\u51fa\u529b\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30a4\u30e1\u30fc\u30b8\u30d3\u30eb\u30c9\u304c\u6b63\u5e38\u306b\u5b8c\u4e86\u3057\u305f\u3053\u3068\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>REPOSITORY TAG IMAGE ID CREATED SIZE node-demo latest 23961524051d 7 seconds ago 73MB node 10-alpine 8a752d5af4ce 3 weeks ago 70.7MB<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u6b21\u306b\u3001docker run\u3067\u30b3\u30f3\u30c6\u30ca\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u3053\u306e\u30b3\u30de\u30f3\u30c9\u306b\u306f3\u3064\u306e\u30d5\u30e9\u30b0\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<ul class=\"post-ul\">\n<li>-p: This publishes the port on the container and maps it to a port on your host. You will use port 80 on the host in this example, but feel free to modify this as necessary if you have another process running on that port. For more information about how this works, review this discussion in the Docker documentation on port binding.<\/li>\n<li>-d: This runs the container in the background.<\/li>\n<li>&#8211;name: This allows you to give the container a memorable name.<\/li>\n<\/ul>\n<p>\u30b3\u30f3\u30c6\u30ca\u3092\u30d3\u30eb\u30c9\u3059\u308b\u305f\u3081\u306b\u3001\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;name<\/span> <mark>node-demo<\/mark> <span class=\"token parameter variable\">-p<\/span> <span class=\"token number\">80<\/span>:8080 <span class=\"token parameter variable\">-d<\/span> <mark>node-demo<\/mark><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Docker ps\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u5b9f\u884c\u4e2d\u306e\u30b3\u30f3\u30c6\u30ca\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker<\/span> <span class=\"token function\">ps<\/span><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u6b21\u306e\u51fa\u529b\u306f\u3001\u3042\u306a\u305f\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b3\u30f3\u30c6\u30ca\u304c\u5b9f\u884c\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4133b72391da node-demo &#8220;node app.js&#8221; 17 seconds ago Up 16 seconds 0.0.0.0:80-&gt;8080\/tcp node-demo<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u3042\u306a\u305f\u306f\u4eca\u3001\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3092\u30c6\u30b9\u30c8\u3059\u308b\u305f\u3081\u306b\u3042\u306a\u305f\u306e\u30c9\u30e1\u30a4\u30f3\u3092\u8a2a\u308c\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 http:\/\/your_domain \u3092\u4f7f\u7528\u3057\u3066\u3001your_domain\u3092\u3042\u306a\u305f\u81ea\u8eab\u306e\u30c9\u30e1\u30a4\u30f3\u540d\u3067\u7f6e\u304d\u63db\u3048\u308b\u3053\u3068\u3092\u5fd8\u308c\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002\u3042\u306a\u305f\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306f\u4ee5\u4e0b\u306e\u30e9\u30f3\u30c7\u30a3\u30f3\u30b0\u30da\u30fc\u30b8\u3092\u8868\u793a\u3057\u307e\u3059\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65647ad7daa94e2bdf7b8c59\/35-0.png\" alt=\"Application Landing Page\" \/><\/div>\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c6\u30b9\u30c8\u304c\u5b8c\u4e86\u3057\u305f\u306e\u3067\u3001\u30b3\u30f3\u30c6\u30ca\u3092\u505c\u6b62\u3057\u3001\u30a4\u30e1\u30fc\u30b8\u3092\u524a\u9664\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002CONTAINER ID\u3092\u53d6\u5f97\u3059\u308b\u305f\u3081\u306b\u3001docker ps\u3092\u4f7f\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker<\/span> <span class=\"token function\">ps<\/span><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES <mark>4133b72391da<\/mark> node-demo &#8220;node app.js&#8221; 17 seconds ago Up 16 seconds 0.0.0.0:80-&gt;8080\/tcp node-demo<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Docker stop\u30b3\u30de\u30f3\u30c9\u3067\u30b3\u30f3\u30c6\u30ca\u3092\u505c\u6b62\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u3053\u3067\u793a\u3055\u308c\u3066\u3044\u308bCONTAINER ID\u306f\u3001\u3054\u81ea\u8eab\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306eCONTAINER ID\u306b\u7f6e\u304d\u63db\u3048\u308b\u3088\u3046\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker<\/span> stop <mark>4133b72391da<\/mark><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>docker system prune\u3068 -a\u30d5\u30e9\u30b0\u3092\u4f7f\u7528\u3057\u3066\u3001\u505c\u6b62\u3057\u305f\u30b3\u30f3\u30c6\u30ca\u3068\u672a\u4f7f\u7528\u306e\u30a4\u30e1\u30fc\u30b8\u3001\u30c9\u30f3\u30b0\u30ea\u30f3\u30b0\u30a4\u30e1\u30fc\u30b8\u3092\u542b\u3080\u3059\u3079\u3066\u306e\u30a4\u30e1\u30fc\u30b8\u3092\u524a\u9664\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker<\/span> system prune <span class=\"token parameter variable\">-a<\/span><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u51fa\u529b\u3067\u30d7\u30ed\u30f3\u30d7\u30c8\u304c\u8868\u793a\u3055\u308c\u305f\u3089\u3001\u300cy\u300d\u3092\u62bc\u3057\u3066\u3001\u505c\u6b62\u3057\u305f\u30b3\u30f3\u30c6\u30ca\u3068\u30a4\u30e1\u30fc\u30b8\u3092\u524a\u9664\u3059\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u305f\u3060\u3057\u3001\u30d3\u30eb\u30c9\u30ad\u30e3\u30c3\u30b7\u30e5\u3082\u524a\u9664\u3055\u308c\u307e\u3059\u306e\u3067\u3001\u3054\u6ce8\u610f\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30a4\u30e1\u30fc\u30b8\u304c\u30c6\u30b9\u30c8\u3055\u308c\u305f\u3089\u3001Docker Compose\u3092\u4f7f\u3063\u3066\u6b8b\u308a\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002<\/p>\n<h2>\u30b9\u30c6\u30c3\u30d72- \u30a6\u30a7\u30d6\u30b5\u30fc\u30d0\u30fc\u306e\u8a2d\u5b9a\u3092\u5b9a\u7fa9\u3059\u308b<\/h2>\n<p>\u79c1\u305f\u3061\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306eDockerfile\u304c\u3042\u308b\u72b6\u614b\u3067\u3001Nginx\u30b3\u30f3\u30c6\u30ca\u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u30c9\u30e1\u30a4\u30f3\u540d\u3001\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u30eb\u30fc\u30c8\u3001\u30d7\u30ed\u30ad\u30b7\u60c5\u5831\u3092\u542b\u3080\u6700\u5c0f\u9650\u306e\u8a2d\u5b9a\u304b\u3089\u59cb\u3081\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u307e\u305f\u3001Certbot\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092.well-known\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u3059\u308b\u305f\u3081\u306e\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\u30d6\u30ed\u30c3\u30af\u3082\u542b\u307e\u308c\u307e\u3059\u3002\u305d\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u306f\u3001\u30c9\u30e1\u30a4\u30f3\u306eDNS\u304c\u30b5\u30fc\u30d0\u30fc\u306b\u89e3\u6c7a\u3055\u308c\u308b\u304b\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306e\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u304c\u914d\u7f6e\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>\u6700\u521d\u306b\u3001\u73fe\u5728\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\uff08node_project\uff09\u306b\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u305f\u3081\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">mkdir<\/span> nginx-conf<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Nano\u307e\u305f\u306f\u304a\u6c17\u306b\u5165\u308a\u306e\u30a8\u30c7\u30a3\u30bf\u3092\u4f7f\u7528\u3057\u3066\u3001\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u3066\u958b\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> nginx-conf\/nginx.conf<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u6b21\u306e\u30b5\u30fc\u30d0\u30fc\u30d6\u30ed\u30c3\u30af\u3092\u8ffd\u52a0\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092Node\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b3\u30f3\u30c6\u30ca\u306b\u30d7\u30ed\u30ad\u30b7\u3057\u3001Certbot\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092.well-known\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u3057\u3066\u304f\u3060\u3055\u3044\u3002&#8221;your_domain&#8221;\u306f\u3054\u81ea\u8eab\u306e\u30c9\u30e1\u30a4\u30f3\u540d\u3067\u7f6e\u304d\u63db\u3048\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div>\u4ee5\u4e0b\u306e\u5185\u5bb9\u3092\u65e5\u672c\u8a9e\u3067\u8a00\u3044\u63db\u3048\u3066\u304f\u3060\u3055\u3044\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\u306f1\u3064\u3060\u3051\u5fc5\u8981\u3067\u3059\uff09:<br \/>\n~\/node_project\/nginx-conf\/nginx.conf<\/div>\n<pre class=\"post-pre\"><code><span class=\"token directive\"><span class=\"token keyword\">server<\/span><\/span> <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">listen<\/span> <span class=\"token number\">80<\/span><\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">listen<\/span> [::]:80<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">root<\/span> \/var\/www\/html<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">index<\/span> index.html index.htm index.nginx-debian.html<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">server_name<\/span> <mark>your_domain<\/mark> www.<mark>your_domain<\/mark><\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">location<\/span> \/<\/span> <span class=\"token punctuation\">{<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">proxy_pass<\/span> http:\/\/nodejs:8080<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token punctuation\">}<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">location<\/span> ~ \/.well-known\/acme-challenge<\/span> <span class=\"token punctuation\">{<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">allow<\/span> all<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">root<\/span> \/var\/www\/html<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>\u3053\u306e\u30b5\u30fc\u30d0\u30fc\u30d6\u30ed\u30c3\u30af\u306f\u3001Nginx\u30b3\u30f3\u30c6\u30ca\u3092\u30ea\u30d0\u30fc\u30b9\u30d7\u30ed\u30ad\u30b7\u3068\u3057\u3066\u8d77\u52d5\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u3001\u30ea\u30af\u30a8\u30b9\u30c8\u3092Node\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b3\u30f3\u30c6\u30ca\u306b\u8ee2\u9001\u3057\u307e\u3059\u3002\u307e\u305f\u3001Certbot\u306ewebroot\u30d7\u30e9\u30b0\u30a4\u30f3\u3092\u4f7f\u7528\u3057\u3066\u30c9\u30e1\u30a4\u30f3\u306e\u8a3c\u660e\u66f8\u3092\u53d6\u5f97\u3059\u308b\u3053\u3068\u3082\u53ef\u80fd\u3067\u3059\u3002\u3053\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u306f\u3001HTTP-01\u306e\u691c\u8a3c\u65b9\u6cd5\u306b\u4f9d\u5b58\u3057\u3066\u304a\u308a\u3001\u4e0e\u3048\u3089\u308c\u305f\u30c9\u30e1\u30a4\u30f3\u540d\u306b\u5fdc\u7b54\u3059\u308b\u30b5\u30fc\u30d0\u30fc\u304b\u3089\u30ea\u30bd\u30fc\u30b9\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u3053\u3068\u3092\u8a3c\u660e\u3059\u308b\u305f\u3081\u306eHTTP\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n<p>\u7de8\u96c6\u304c\u7d42\u308f\u3063\u305f\u3089\u3001\u30d5\u30a1\u30a4\u30eb\u3092\u4fdd\u5b58\u3057\u3066\u9589\u3058\u3066\u304f\u3060\u3055\u3044\u3002\u3082\u3057nano\u3092\u4f7f\u7528\u3057\u3066\u3044\u308b\u5834\u5408\u3001CTRL + X\u3001Y\u3001ENTER\u3092\u62bc\u3059\u3053\u3068\u3067\u3053\u308c\u3092\u884c\u3046\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002Nginx\u30b5\u30fc\u30d0\u30fc\u3068\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\u30d6\u30ed\u30c3\u30af\u306e\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u5b66\u3073\u305f\u3044\u5834\u5408\u306f\u3001Understanding Nginx Server and Location Block Selection Algorithms\u3068\u3044\u3046\u8a18\u4e8b\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u30a6\u30a7\u30d6\u30b5\u30fc\u30d0\u30fc\u306e\u8a2d\u5b9a\u8a73\u7d30\u304c\u6574\u3063\u305f\u3089\u3001docker-compose.yml\u30d5\u30a1\u30a4\u30eb\u306e\u4f5c\u6210\u306b\u9032\u3080\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u3067\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d3\u30b9\u3068\u8a3c\u660e\u66f8\u3092\u53d6\u5f97\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3059\u308bCertbot\u30b3\u30f3\u30c6\u30ca\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<h2>\u30b9\u30c6\u30c3\u30d73 \u2014 Docker Compose\u30d5\u30a1\u30a4\u30eb\u306e\u4f5c\u6210<\/h2>\n<p>docker-compose.yml\u30d5\u30a1\u30a4\u30eb\u306f\u3001Node\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3084\u30a6\u30a7\u30d6\u30b5\u30fc\u30d0\u30fc\u306a\u3069\u306e\u30b5\u30fc\u30d3\u30b9\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u3067\u306f\u3001\u30cd\u30fc\u30e0\u30c9\u30dc\u30ea\u30e5\u30fc\u30e0\u306a\u3069\u306e\u8a73\u7d30\u304c\u6307\u5b9a\u3055\u308c\u307e\u3059\u3002\u3053\u308c\u3089\u306f\u3001\u30b3\u30f3\u30c6\u30ca\u9593\u3067SSL\u8a8d\u8a3c\u60c5\u5831\u3092\u5171\u6709\u3059\u308b\u305f\u3081\u306b\u91cd\u8981\u3067\u3059\u3002\u3055\u3089\u306b\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3084\u30dd\u30fc\u30c8\u60c5\u5831\u3082\u6307\u5b9a\u3057\u307e\u3059\u3002\u307e\u305f\u3001\u30b3\u30f3\u30c6\u30ca\u304c\u4f5c\u6210\u3055\u308c\u308b\u969b\u306b\u5b9f\u884c\u3059\u308b\u30b3\u30de\u30f3\u30c9\u3082\u6307\u5b9a\u3067\u304d\u307e\u3059\u3002\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u306f\u3001\u30b5\u30fc\u30d3\u30b9\u304c\u3069\u306e\u3088\u3046\u306b\u9023\u643a\u3057\u3066\u52d5\u4f5c\u3059\u308b\u304b\u3092\u5b9a\u7fa9\u3059\u308b\u4e2d\u5fc3\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u3067\u3059\u3002<\/p>\n<p>\u73fe\u5728\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u3001\u958b\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> docker-compose.yml<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u6700\u521d\u306b\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d3\u30b9\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/p>\n<div>\n<p>\u4ee5\u4e0b\u306e\u300c~\/node_project\/docker-compose.yml\u300d\u3068\u3044\u3046\u30d5\u30a1\u30a4\u30eb\u306e\u5185\u5bb9\u3092\u65e5\u672c\u8a9e\u3067\u8a00\u3044\u63db\u3048\u308b\u3068\u3001\u6b21\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u300c\u30db\u30fc\u30e0\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306enode_project\u30d5\u30a9\u30eb\u30c0\u306b\u3042\u308bdocker-compose.yml\u30d5\u30a1\u30a4\u30eb\u300d<\/p>\n<\/div>\n<pre class=\"post-pre\"><code><span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'3'<\/span>\r\n\r\n<span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">nodejs<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">build<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token key atrule\">context<\/span><span class=\"token punctuation\">:<\/span> .\r\n      <span class=\"token key atrule\">dockerfile<\/span><span class=\"token punctuation\">:<\/span> Dockerfile\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> nodejs\r\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> nodejs\r\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">-<\/span>stopped\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0b\u306e\u3082\u306e\u304cNode.js\u306e\u30b5\u30fc\u30d3\u30b9\u5b9a\u7fa9\u306b\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<ul class=\"post-ul\">\n<li>build: This defines the configuration options, including the context and dockerfile, that will be applied when Compose builds the application image. If you wanted to use an existing image from a registry like Docker Hub, you could use the image instruction instead, with information about your username, repository, and image tag.<\/li>\n<li>context: This defines the build context for the application image build. In this case, it\u2019s the current project directory which is represented with the ..<\/li>\n<li>dockerfile: This specifies the Dockerfile that Compose will use for the build \u2014 the Dockerfile reviewed at in Step 1.<\/li>\n<li>image, container_name: These apply names to the image and container.<\/li>\n<li>restart: This defines the restart policy. The default is no, but in this example, the container is set to restart unless it is stopped.<\/li>\n<\/ul>\n<p>\u3053\u306e\u30b5\u30fc\u30d3\u30b9\u3067\u306f\u30d0\u30a4\u30f3\u30c9\u30de\u30a6\u30f3\u30c8\u306f\u542b\u307e\u308c\u3066\u3044\u306a\u3044\u3053\u3068\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u306f\u958b\u767a\u3088\u308a\u3082\u30c7\u30d7\u30ed\u30a4\u306b\u7126\u70b9\u3092\u5f53\u3066\u3066\u3044\u308b\u305f\u3081\u3067\u3059\u3002\u8a73\u7d30\u306f\u3001\u30d0\u30a4\u30f3\u30c9\u30de\u30a6\u30f3\u30c8\u3068\u30dc\u30ea\u30e5\u30fc\u30e0\u306b\u95a2\u3059\u308bDocker\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u3054\u89a7\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3068Web\u30b5\u30fc\u30d0\u30fc\u30b3\u30f3\u30c6\u30ca\u9593\u306e\u901a\u4fe1\u3092\u53ef\u80fd\u306b\u3059\u308b\u305f\u3081\u306b\u3001\u518d\u8d77\u52d5\u306e\u5b9a\u7fa9\u5f8c\u306b\u300capp-network\u300d\u3068\u3044\u3046\u30d6\u30ea\u30c3\u30b8\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div>\u4ee5\u4e0b\u306f\u3001\u65e5\u672c\u8a9e\u3067\u306e\u540c\u7b49\u306e\u8868\u73fe\u3067\u3059\uff08\u4e00\u3064\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\uff09\uff1a<br \/>\n~\/node_project\/docker-compose.yml \u2192 \u30db\u30fc\u30e0\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u4e2d\u306b\u3042\u308bnode_project\u30d5\u30a9\u30eb\u30c0\u5185\u306edocker-compose.yml\u30d5\u30a1\u30a4\u30eb<\/div>\n<pre class=\"post-pre\"><code><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">nodejs<\/span><span class=\"token punctuation\">:<\/span>\r\n<span class=\"token punctuation\">...<\/span>\r\n    <mark><span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span><\/mark>\r\n      <mark><span class=\"token punctuation\">-<\/span> app<span class=\"token punctuation\">-<\/span>network<\/mark>\r\n<\/code><\/pre>\n<p>\u3053\u306e\u3088\u3046\u306a\u30e6\u30fc\u30b6\u30fc\u5b9a\u7fa9\u306e\u30d6\u30ea\u30c3\u30b8\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306f\u3001\u540c\u3058Docker\u30c7\u30fc\u30e2\u30f3\u30db\u30b9\u30c8\u4e0a\u306e\u30b3\u30f3\u30c6\u30ca\u9593\u3067\u306e\u901a\u4fe1\u3092\u53ef\u80fd\u306b\u3057\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u540c\u3058\u30d6\u30ea\u30c3\u30b8\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u5185\u306e\u30b3\u30f3\u30c6\u30ca\u9593\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3068\u901a\u4fe1\u304c\u52b9\u7387\u5316\u3055\u308c\u307e\u3059\u3002\u540c\u6642\u306b\u3001\u5916\u90e8\u306b\u30dd\u30fc\u30c8\u3092\u516c\u958b\u305b\u305a\u306b\u3001\u540c\u3058\u30d6\u30ea\u30c3\u30b8\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u4e0a\u306e\u30b3\u30f3\u30c6\u30ca\u9593\u306e\u3059\u3079\u3066\u306e\u30dd\u30fc\u30c8\u304c\u958b\u304b\u308c\u307e\u3059\u3002\u305d\u306e\u305f\u3081\u3001\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u30b5\u30fc\u30d3\u30b9\u3092\u516c\u958b\u3059\u308b\u306e\u306b\u5fc5\u8981\u306a\u30dd\u30fc\u30c8\u3060\u3051\u3092\u9078\u629e\u7684\u306b\u958b\u304f\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u6b21\u306b\u3001\u30a6\u30a7\u30d6\u30b5\u30fc\u30d0\u30fc\u30b5\u30fc\u30d3\u30b9\u3092\u5b9a\u7fa9\u3057\u3066\u304f\u3060\u3055\u3044\u3002 (Tsugi ni, webu s\u0101b\u0101 s\u0101bisu o teigi shite kudasai.)<\/p>\n<div>~\/node_project\/docker-compose.yml\u3092\u65e5\u672c\u8a9e\u3067\u81ea\u7136\u306b\u8a00\u3044\u63db\u3048\u3066\u304f\u3060\u3055\u3044\u30021\u3064\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u304c\u5fc5\u8981\u3067\u3059\u3002<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n <span class=\"token key atrule\">webserver<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> nginx<span class=\"token punctuation\">:<\/span>mainline<span class=\"token punctuation\">-<\/span>alpine\r\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> webserver\r\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">-<\/span>stopped\r\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> <span class=\"token string\">\"80:80\"<\/span>\r\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> web<span class=\"token punctuation\">-<\/span>root<span class=\"token punctuation\">:<\/span>\/var\/www\/html\r\n      <span class=\"token punctuation\">-<\/span> .\/nginx<span class=\"token punctuation\">-<\/span>conf<span class=\"token punctuation\">:<\/span>\/etc\/nginx\/conf.d\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>etc<span class=\"token punctuation\">:<\/span>\/etc\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>var<span class=\"token punctuation\">:<\/span>\/var\/lib\/letsencrypt\r\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> nodejs\r\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> app<span class=\"token punctuation\">-<\/span>network\r\n<\/code><\/pre>\n<p>\u3053\u3053\u3067\u5b9a\u7fa9\u3055\u308c\u305fNode.js\u306e\u30b5\u30fc\u30d3\u30b9\u306e\u8a2d\u5b9a\u306e\u4e00\u90e8\u306f\u5909\u308f\u308a\u307e\u305b\u3093\u304c\u3001\u4ee5\u4e0b\u306e\u5909\u66f4\u304c\u884c\u308f\u308c\u307e\u3057\u305f\u3002<\/p>\n<ul class=\"post-ul\">\n<li>image: This tells Compose to pull the latest Alpine-based Nginx image from Docker Hub. For more information about alpine images, please read Step 3 of How To Build a Node.js Application with Docker.<\/li>\n<li>ports: This exposes port 80 to enable the configuration options you\u2019ve defined in your Nginx configuration.<\/li>\n<\/ul>\n<p>\u6b21\u306b\u3001\u6307\u5b9a\u3055\u308c\u308b\u540d\u524d\u4ed8\u304d\u30dc\u30ea\u30e5\u30fc\u30e0\u3068\u30d0\u30a4\u30f3\u30c9\u30de\u30a6\u30f3\u30c8\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<ul class=\"post-ul\">\n<li>web-root:\/var\/www\/html: This will add your site\u2019s static assets, copied to a volume called web-root, to the the \/var\/www\/html directory on the container.<\/li>\n<li>.\/nginx-conf:\/etc\/nginx\/conf.d: This will bind mount the Nginx configuration directory on the host to the relevant directory on the container, ensuring that any changes you make to files on the host will be reflected in the container.<\/li>\n<li>certbot-etc:\/etc\/letsencrypt: This will mount the relevant Let\u2019s Encrypt certificates and keys for your domain to the appropriate directory on the container.<\/li>\n<li>certbot-var:\/var\/lib\/letsencrypt: This mounts Let\u2019s Encrypt\u2019s default working directory to the appropriate directory on the container.<\/li>\n<\/ul>\n<p>\u6b21\u306b\u3001certbot\u30b3\u30f3\u30c6\u30ca\u306e\u8a2d\u5b9a\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u30c9\u30e1\u30a4\u30f3\u3068\u30e1\u30fc\u30eb\u60c5\u5831\u3092\u3054\u81ea\u8eab\u306e\u30c9\u30e1\u30a4\u30f3\u540d\u3068\u9023\u7d61\u5148\u306e\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3067\u7f6e\u304d\u63db\u3048\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div>\n<p>~\/node_project\/docker-compose.yml \u3092\u65e5\u672c\u8a9e\u3067\u81ea\u7136\u306b\u8a00\u3044\u63db\u3048\u3066\u304f\u3060\u3055\u3044\u30021\u3064\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3060\u3051\u3067\u69cb\u3044\u307e\u305b\u3093\u3002<\/p>\n<p>&#8211; \u300c~\/node_project\/docker-compose.yml\u300d\u306e\u65e5\u672c\u8a9e\u8868\u73fe\u3092\u4ee5\u4e0b\u306b\u793a\u3057\u307e\u3059\u3002<br \/>\n~ \/ node_project \/ docker-compose.yml<\/p>\n<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n  <span class=\"token key atrule\">certbot<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> certbot\/certbot\r\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> certbot\r\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>etc<span class=\"token punctuation\">:<\/span>\/etc\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>var<span class=\"token punctuation\">:<\/span>\/var\/lib\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> web<span class=\"token punctuation\">-<\/span>root<span class=\"token punctuation\">:<\/span>\/var\/www\/html\r\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> webserver\r\n    <span class=\"token key atrule\">command<\/span><span class=\"token punctuation\">:<\/span> certonly <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>webroot <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>webroot<span class=\"token punctuation\">-<\/span>path=\/var\/www\/html <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>email <mark>sammy@your_domain<\/mark> <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>agree<span class=\"token punctuation\">-<\/span>tos <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>no<span class=\"token punctuation\">-<\/span>eff<span class=\"token punctuation\">-<\/span>email <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>staging <span class=\"token punctuation\">-<\/span>d <mark>your_domain<\/mark>  <span class=\"token punctuation\">-<\/span>d www.<mark>your_domain<\/mark> \r\n<\/code><\/pre>\n<p>\u3053\u306e\u5b9a\u7fa9\u3067\u306f\u3001Compose\u306bcertbot\/certbot\u30a4\u30e1\u30fc\u30b8\u3092Docker Hub\u304b\u3089\u53d6\u5f97\u3059\u308b\u3088\u3046\u6307\u793a\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u307e\u305f\u3001\u540d\u524d\u4ed8\u304d\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u4f7f\u7528\u3057\u3066\u3001Nginx\u30b3\u30f3\u30c6\u30ca\u3068\u30ea\u30bd\u30fc\u30b9\u3092\u5171\u6709\u3057\u307e\u3059\u3002\u3053\u308c\u306b\u306f\u3001certbot-etc\u5185\u306e\u30c9\u30e1\u30a4\u30f3\u306e\u8a3c\u660e\u66f8\u3068\u30ad\u30fc\u3001certbot-var\u5185\u306eLet&#8217;s Encrypt\u4f5c\u696d\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3001\u304a\u3088\u3073web-root\u5185\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b3\u30fc\u30c9\u304c\u542b\u307e\u308c\u307e\u3059\u3002<\/p>\n<p>\u518d\u3073\u3001webserver\u30b5\u30fc\u30d3\u30b9\u304c\u5b9f\u884c\u3055\u308c\u3066\u3044\u308b\u6642\u306bcertbot\u30b3\u30f3\u30c6\u30ca\u3092\u958b\u59cb\u3059\u308b\u305f\u3081\u306bdepends_on\u3092\u4f7f\u7528\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>\u30b3\u30f3\u30c6\u30ca\u304c\u958b\u59cb\u3055\u308c\u308b\u969b\u306b\u5b9f\u884c\u3059\u308b\u30b3\u30de\u30f3\u30c9\u3092\u6307\u5b9a\u3059\u308b\u30b3\u30de\u30f3\u30c9\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u3059\u3002\u6b21\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u4f7f\u7528\u3057\u3066certonly\u30b5\u30d6\u30b3\u30de\u30f3\u30c9\u3092\u542b\u3081\u307e\u3059\u3002<\/p>\n<ul class=\"post-ul\">\n<li>&#8211;webroot: This tells Certbot to use the webroot plugin to place files in the webroot folder for authentication.<\/li>\n<li>&#8211;webroot-path: This specifies the path of the webroot directory.<\/li>\n<li>&#8211;email: Your preferred email for registration and recovery.<\/li>\n<li>&#8211;agree-tos: This specifies that you agree to ACME\u2019s Subscriber Agreement.<\/li>\n<li>&#8211;no-eff-email: This tells Certbot that you do not wish to share your email with the Electronic Frontier Foundation (EFF). Feel free to omit this if you would prefer.<\/li>\n<li>&#8211;staging: This tells Certbot that you would like to use Let\u2019s Encrypt\u2019s staging environment to obtain test certificates. Using this option allows you to test your configuration options and avoid possible domain request limits. For more information about these limits, please read Let\u2019s Encrypt\u2019s rate limits documentation.<\/li>\n<li>-d: This allows you to specify domain names you would like to apply to your request. In this case, you\u2019ve included your_domain and www.your_domain. Be sure to replace these with your own domains.<\/li>\n<\/ul>\n<p>\u6700\u5f8c\u306e\u624b\u9806\u3068\u3057\u3066\u3001\u30dc\u30ea\u30e5\u30fc\u30e0\u3068\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u5b9a\u7fa9\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u3053\u3067\u306e\u30e6\u30fc\u30b6\u30fc\u540d\u3092\u81ea\u5206\u306e\u975e\u7ba1\u7406\u8005\u30e6\u30fc\u30b6\u30fc\u306b\u7f6e\u304d\u63db\u3048\u308b\u3053\u3068\u3092\u5fd8\u308c\u305a\u306b\u3002<\/p>\n<div>\u4ee5\u4e0b\u306e\u5185\u5bb9\u3092\u65e5\u672c\u8a9e\u3067\u8868\u73fe\u3057\u307e\u3059\uff081\u3064\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u307f\uff09\uff1a<br \/>\n~\/node_project\/docker-compose.yml~\/node_project\/docker-compose.yml\u30d5\u30a1\u30a4\u30eb<\/p>\n<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">certbot-etc<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">certbot-var<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">web-root<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> local\r\n    <span class=\"token key atrule\">driver_opts<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token key atrule\">type<\/span><span class=\"token punctuation\">:<\/span> none\r\n      <span class=\"token key atrule\">device<\/span><span class=\"token punctuation\">:<\/span> \/home\/<mark>sammy<\/mark>\/<mark>node_project<\/mark>\/views\/\r\n      <span class=\"token key atrule\">o<\/span><span class=\"token punctuation\">:<\/span> bind\r\n\r\n<span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">app-network<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> bridge\r\n<\/code><\/pre>\n<p>\u540d\u524d\u4ed8\u304d\u30dc\u30ea\u30e5\u30fc\u30e0\u306b\u306f\u3001Certbot\u8a3c\u660e\u66f8\u3084\u4f5c\u696d\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3001\u304a\u3088\u3073\u30b5\u30a4\u30c8\u306e\u9759\u7684\u30a2\u30bb\u30c3\u30c8\u3067\u3042\u308bweb-root\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002\u307b\u3068\u3093\u3069\u306e\u5834\u5408\u3001Docker\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u30c9\u30e9\u30a4\u30d0\u306f\u30ed\u30fc\u30ab\u30eb\u30c9\u30e9\u30a4\u30d0\u3067\u3042\u308a\u3001Linux\u3067\u306f\u30de\u30a6\u30f3\u30c8\u30b3\u30de\u30f3\u30c9\u306b\u4f3c\u305f\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u53d7\u3051\u5165\u308c\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001driver_opts\u3092\u4f7f\u7528\u3057\u3066\u30db\u30b9\u30c8\u4e0a\u306eviews\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u30de\u30a6\u30f3\u30c8\u3059\u308b\u30c9\u30e9\u30a4\u30d0\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u30ea\u30b9\u30c8\u3092\u6307\u5b9a\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002views\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u9759\u7684\u30a2\u30bb\u30c3\u30c8\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002\u5b9f\u884c\u6642\u306b\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3068\u5171\u6709\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002views\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u5185\u5bb9\u306b\u3064\u3044\u3066\u306e\u8a73\u7d30\u306f\u3001\u300cDocker\u3092\u4f7f\u7528\u3057\u305fNode.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4f5c\u308a\u65b9\u300d\u306e\u30b9\u30c6\u30c3\u30d72\u3092\u304a\u8aad\u307f\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u4ee5\u4e0b\u306f\u5b8c\u5168\u306adocker-compose.yml\u30d5\u30a1\u30a4\u30eb\u3067\u3059\u3002<\/p>\n<div>\u4ee5\u4e0b\u306e\u5185\u5bb9\u3092\u65e5\u672c\u8a9e\u3067\u8868\u73fe\u3057\u307e\u3059\uff08\u4e00\u3064\u306e\u30d1\u30bf\u30fc\u30f3\uff09\uff1a<br \/>\n~\/node_project\/docker-compose.yml\u3092\u4f7f\u3044\u307e\u3059\u3002<\/div>\n<pre class=\"post-pre\"><code><span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'3'<\/span>\r\n\r\n<span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">nodejs<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">build<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token key atrule\">context<\/span><span class=\"token punctuation\">:<\/span> .\r\n      <span class=\"token key atrule\">dockerfile<\/span><span class=\"token punctuation\">:<\/span> Dockerfile\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> nodejs\r\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> nodejs\r\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">-<\/span>stopped\r\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> app<span class=\"token punctuation\">-<\/span>network\r\n\r\n  <span class=\"token key atrule\">webserver<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> nginx<span class=\"token punctuation\">:<\/span>mainline<span class=\"token punctuation\">-<\/span>alpine\r\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> webserver\r\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">-<\/span>stopped\r\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> <span class=\"token string\">\"80:80\"<\/span>\r\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> web<span class=\"token punctuation\">-<\/span>root<span class=\"token punctuation\">:<\/span>\/var\/www\/html\r\n      <span class=\"token punctuation\">-<\/span> .\/nginx<span class=\"token punctuation\">-<\/span>conf<span class=\"token punctuation\">:<\/span>\/etc\/nginx\/conf.d\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>etc<span class=\"token punctuation\">:<\/span>\/etc\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>var<span class=\"token punctuation\">:<\/span>\/var\/lib\/letsencrypt\r\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> nodejs\r\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> app<span class=\"token punctuation\">-<\/span>network\r\n\r\n  <span class=\"token key atrule\">certbot<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> certbot\/certbot\r\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> certbot\r\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>etc<span class=\"token punctuation\">:<\/span>\/etc\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>var<span class=\"token punctuation\">:<\/span>\/var\/lib\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> web<span class=\"token punctuation\">-<\/span>root<span class=\"token punctuation\">:<\/span>\/var\/www\/html\r\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> webserver\r\n    <span class=\"token key atrule\">command<\/span><span class=\"token punctuation\">:<\/span> certonly <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>webroot <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>webroot<span class=\"token punctuation\">-<\/span>path=\/var\/www\/html <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>email <mark>sammy@your_domain<\/mark> <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>agree<span class=\"token punctuation\">-<\/span>tos <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>no<span class=\"token punctuation\">-<\/span>eff<span class=\"token punctuation\">-<\/span>email <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>staging <span class=\"token punctuation\">-<\/span>d <mark>your_domain<\/mark>  <span class=\"token punctuation\">-<\/span>d www.<mark>your_domain<\/mark> \r\n\r\n<span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">certbot-etc<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">certbot-var<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">web-root<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> local\r\n    <span class=\"token key atrule\">driver_opts<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token key atrule\">type<\/span><span class=\"token punctuation\">:<\/span> none\r\n      <span class=\"token key atrule\">device<\/span><span class=\"token punctuation\">:<\/span> \/home\/<mark>sammy<\/mark>\/<mark>node_project<\/mark>\/views\/\r\n      <span class=\"token key atrule\">o<\/span><span class=\"token punctuation\">:<\/span> bind\r\n\r\n<span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">app-network<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> bridge  \r\n<\/code><\/pre>\n<p>\u30b5\u30fc\u30d3\u30b9\u306e\u5b9a\u7fa9\u304c\u5b8c\u4e86\u3057\u305f\u3089\u3001\u30b3\u30f3\u30c6\u30ca\u3092\u8d77\u52d5\u3057\u3066\u8a3c\u660e\u66f8\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u30c6\u30b9\u30c8\u3059\u308b\u6e96\u5099\u304c\u3067\u304d\u307e\u3057\u305f\u3002<\/p>\n<h2>\u300c\u30b9\u30c6\u30c3\u30d74 \u2014 SSL\u8a3c\u660e\u66f8\u304a\u3088\u3073\u30af\u30ec\u30c7\u30f3\u30b7\u30e3\u30eb\u306e\u53d6\u5f97\u300d<\/h2>\n<p>docker-compose up\u3092\u4f7f\u7528\u3057\u3066\u3001\u30b3\u30f3\u30c6\u30ca\u3092\u8d77\u52d5\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u6307\u5b9a\u3057\u305f\u9806\u5e8f\u3067\u30b3\u30f3\u30c6\u30ca\u3068\u30b5\u30fc\u30d3\u30b9\u304c\u4f5c\u6210\u304a\u3088\u3073\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002\u30c9\u30e1\u30a4\u30f3\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u6210\u529f\u3057\u305f\u3089\u3001\u8a3c\u660e\u66f8\u306fWeb\u30b5\u30fc\u30d0\u30fc\u30b3\u30f3\u30c6\u30ca\u306e\/etc\/letsencrypt\/live\u30d5\u30a9\u30eb\u30c0\u306b\u30de\u30a6\u30f3\u30c8\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u3067nodejs\u3068webserver\u306e\u30b3\u30f3\u30c6\u30ca\u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u306b\u3001docker-compose up\u30b3\u30de\u30f3\u30c9\u3092 -d \u30d5\u30e9\u30b0\u3068\u3068\u3082\u306b\u4f7f\u7528\u3057\u3066\u30b5\u30fc\u30d3\u30b9\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> up <span class=\"token parameter variable\">-d<\/span><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u3042\u306a\u305f\u306e\u30a2\u30a6\u30c8\u30d7\u30c3\u30c8\u306f\u3001\u3042\u306a\u305f\u306e\u30b5\u30fc\u30d3\u30b9\u304c\u4f5c\u6210\u3055\u308c\u305f\u3053\u3068\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Creating nodejs &#8230; <mark>done<\/mark> Creating webserver &#8230; <mark>done<\/mark> Creating certbot &#8230; <mark>done<\/mark><\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>docker-compose ps\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u30b5\u30fc\u30d3\u30b9\u306e\u72b6\u614b\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> <span class=\"token function\">ps<\/span><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u3082\u3057\u5168\u3066\u6210\u529f\u3057\u305f\u5834\u5408\u3001\u3042\u306a\u305f\u306eNode.js\u3068Web\u30b5\u30fc\u30d0\u30fc\u306e\u30b5\u30fc\u30d3\u30b9\u306f\u8d77\u52d5\u3057\u3001certbot\u30b3\u30f3\u30c6\u30ca\u306f0\u306e\u30b9\u30c6\u30fc\u30bf\u30b9\u30e1\u30c3\u30bb\u30fc\u30b8\u3067\u7d42\u4e86\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Name Command State Ports &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; certbot certbot certonly &#8211;webroot &#8230; Exit 0 nodejs node app.js Up 8080\/tcp webserver nginx -g daemon off; Up 0.0.0.0:80-&gt;80\/tcp<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u3082\u3057\u3001nodejs\u3068webserver\u306e\u30b5\u30fc\u30d3\u30b9\u306e\u72b6\u614b\u5217\u306bUp\u4ee5\u5916\u306e\u72b6\u614b\u3092\u78ba\u8a8d\u3057\u305f\u5834\u5408\u3084\u3001certbot\u30b3\u30f3\u30c6\u30ca\u306e\u7d42\u4e86\u30b9\u30c6\u30fc\u30bf\u30b9\u304c0\u4ee5\u5916\u306e\u5834\u5408\u306f\u3001docker-compose logs\u30b3\u30de\u30f3\u30c9\u3067\u30b5\u30fc\u30d3\u30b9\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u4f8b\u3048\u3070\u3001Certbot\u306e\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u305f\u3044\u5834\u5408\u306f\u3001\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> logs certbot<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u4eca\u3001docker-compose exec\u3092\u4f7f\u7528\u3057\u3066\u3001\u81ea\u5206\u306e\u8a8d\u8a3c\u60c5\u5831\u304c\u30a6\u30a7\u30d6\u30b5\u30fc\u30d0\u30fc\u306e\u30b3\u30f3\u30c6\u30ca\u306b\u30de\u30a6\u30f3\u30c8\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> <span class=\"token builtin class-name\">exec<\/span> webserver <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> \/etc\/letsencrypt\/live<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u8981\u6c42\u304c\u6210\u529f\u3057\u305f\u5834\u5408\u3001\u51fa\u529b\u7d50\u679c\u306b\u306f\u4ee5\u4e0b\u306e\u60c5\u5831\u304c\u660e\u3089\u304b\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>total 16 drwx&#8212;&#8212; 3 root root 4096 Dec 23 16:48 . drwxr-xr-x 9 root root 4096 Dec 23 16:48 .. -rw-r&#8211;r&#8211; 1 root root 740 Dec 23 16:48 README drwxr-xr-x 2 root root 4096 Dec 23 16:48 <mark>your_domain<\/mark><\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u3042\u306a\u305f\u304c\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u6210\u529f\u3059\u308b\u3053\u3068\u3092\u77e5\u3063\u305f\u4eca\u3001&#8211;staging\u30d5\u30e9\u30b0\u3092\u524a\u9664\u3059\u308b\u305f\u3081\u306bcertbot\u30b5\u30fc\u30d3\u30b9\u306e\u5b9a\u7fa9\u3092\u7de8\u96c6\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>docker-compose.yml\u30d5\u30a1\u30a4\u30eb\u3092\u958b\u3044\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> docker-compose.yml<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u30d5\u30a1\u30a4\u30eb\u306e\u4e2d\u3067\u3001certbot\u30b5\u30fc\u30d3\u30b9\u306e\u5b9a\u7fa9\u90e8\u5206\u3092\u63a2\u3057\u3001\u30b3\u30de\u30f3\u30c9\u30aa\u30d7\u30b7\u30e7\u30f3\u306e&#8211;staging\u30d5\u30e9\u30b0\u3092&#8211;force-renewal\u30d5\u30e9\u30b0\u306b\u7f6e\u304d\u63db\u3048\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u65e2\u5b58\u306e\u8a3c\u660e\u66f8\u3068\u540c\u3058\u30c9\u30e1\u30a4\u30f3\u3067\u65b0\u3057\u3044\u8a3c\u660e\u66f8\u3092\u8981\u6c42\u3059\u308b\u3088\u3046Certbot\u306b\u4f1d\u3048\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002certbot\u30b5\u30fc\u30d3\u30b9\u306e\u5b9a\u7fa9\u306b\u306f\u3001\u4ee5\u4e0b\u306e\u5b9a\u7fa9\u304c\u542b\u307e\u308c\u3066\u3044\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<div>~\/node_project\/docker-compose.yml\u306e\u5185\u5bb9\u3092\u65e5\u672c\u8a9e\u3067\u8a00\u3044\u63db\u3048\u308b\u3068\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\uff1a<br \/>\n\u300c~\/\u30ce\u30fc\u30c9\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\/docker-compose.yml\u300d<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n  <span class=\"token key atrule\">certbot<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> certbot\/certbot\r\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> certbot\r\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>etc<span class=\"token punctuation\">:<\/span>\/etc\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>var<span class=\"token punctuation\">:<\/span>\/var\/lib\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> web<span class=\"token punctuation\">-<\/span>root<span class=\"token punctuation\">:<\/span>\/var\/www\/html\r\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> webserver\r\n    <span class=\"token key atrule\">command<\/span><span class=\"token punctuation\">:<\/span> certonly <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>webroot <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>webroot<span class=\"token punctuation\">-<\/span>path=\/var\/www\/html <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>email <mark>sammy@your_domain<\/mark> <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>agree<span class=\"token punctuation\">-<\/span>tos <span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>no<span class=\"token punctuation\">-<\/span>eff<span class=\"token punctuation\">-<\/span>email <mark><span class=\"token punctuation\">-<\/span><span class=\"token punctuation\">-<\/span>force<span class=\"token punctuation\">-<\/span>renewal<\/mark> <span class=\"token punctuation\">-<\/span>d <mark>your_domain<\/mark> <span class=\"token punctuation\">-<\/span>d www.<mark>your_domain<\/mark>\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u7de8\u96c6\u304c\u7d42\u308f\u3063\u305f\u3089\u3001\u30d5\u30a1\u30a4\u30eb\u3092\u4fdd\u5b58\u3057\u3066\u7d42\u4e86\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u305d\u306e\u5f8c\u3001docker-compose up\u3092\u5b9f\u884c\u3057\u3066\u3001certbot\u30b3\u30f3\u30c6\u30ca\u3068\u95a2\u9023\u3059\u308b\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u518d\u4f5c\u6210\u3067\u304d\u307e\u3059\u3002&#8211;no-deps\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u542b\u3081\u308b\u3053\u3068\u3067\u3001\u65e2\u306b\u5b9f\u884c\u4e2d\u306eWeb\u30b5\u30fc\u30d0\u30fc\u30b5\u30fc\u30d3\u30b9\u306e\u8d77\u52d5\u3092Compose\u306b\u30b9\u30ad\u30c3\u30d7\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> up &#8211;force-recreate &#8211;no-deps certbot<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u6b21\u306e\u51fa\u529b\u306f\u3001\u8a3c\u660e\u66f8\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u6210\u529f\u3057\u305f\u3053\u3068\u3092\u793a\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Recreating certbot &#8230; done Attaching to certbot certbot | Account registered. certbot | Renewing an existing certificate for <mark>your_domain<\/mark> and www.<mark>your_domain<\/mark> certbot | certbot | Successfully received certificate. certbot | Certificate is saved at: \/etc\/letsencrypt\/live\/<mark>your_domain<\/mark>\/fullchain.pem certbot | Key is saved at: \/etc\/letsencrypt\/live\/<mark>your_domain<\/mark> phd.com\/privkey.pem certbot | This certificate expires on 2022-11-03. certbot | These files will be updated when the certificate renews. certbot | NEXT STEPS: certbot | &#8211; The certificate will need to be renewed before it expires. Cert bot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https:\/\/certbot.org\/renewal-setu p for instructions. certbot | Saving debug log to \/var\/log\/letsencrypt\/letsencrypt.log certbot | certbot | &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; certbot | If you like Certbot, please consider supporting our work by: certbot | * Donating to ISRG \/ Let&#8217;s Encrypt: https:\/\/letsencrypt.org\/do nate certbot | * Donating to EFF: https:\/\/eff.org\/donate-le certbot | &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; certbot exited with code 0<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u8a3c\u660e\u66f8\u3092\u6e96\u5099\u3067\u304d\u305f\u3089\u3001Nginx\u306e\u8a2d\u5b9a\u3092\u4fee\u6b63\u3057\u3066SSL\u3092\u7d44\u307f\u8fbc\u3080\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<h2>\u30b9\u30c6\u30c3\u30d75 &#8211; \u30a6\u30a7\u30d6\u30b5\u30fc\u30d0\u30fc\u306e\u8a2d\u5b9a\u3068\u30b5\u30fc\u30d3\u30b9\u5b9a\u7fa9\u306e\u4fee\u6b63<\/h2>\n<p>Nginx\u306e\u8a2d\u5b9a\u3067SSL\u3092\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u3001HTTP\u304b\u3089HTTPS\u3078\u306e\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u3092\u8ffd\u52a0\u3057\u3001SSL\u8a3c\u660e\u66f8\u3068\u30ad\u30fc\u306e\u5834\u6240\u3092\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u307e\u305f\u3001\u5b8c\u5168\u306a\u8ee2\u9001\u79d8\u533f\u6027\u306e\u305f\u3081\u306b\u4f7f\u7528\u3059\u308bDiffie-Hellman\u30b0\u30eb\u30fc\u30d7\u3082\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u3053\u308c\u3089\u306e\u8ffd\u52a0\u3092\u542b\u3081\u305f\u30a6\u30a7\u30d6\u30b5\u30fc\u30d0\u30fc\u30b5\u30fc\u30d3\u30b9\u3092\u518d\u4f5c\u6210\u3059\u308b\u4e88\u5b9a\u3067\u3059\u306e\u3067\u3001\u4eca\u505c\u6b62\u3057\u3066\u3082\u69cb\u3044\u307e\u305b\u3093\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> stop webserver<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u6b21\u306b\u3001\u73fe\u5728\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306bDiffie-Hellman\u9375\u306e\u305f\u3081\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">mkdir<\/span> dhparam<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>openssl\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u9375\u3092\u751f\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">sudo<\/span> openssl dhparam <span class=\"token parameter variable\">-out<\/span> \/home\/<mark>sammy<\/mark>\/<mark>node_project<\/mark>\/dhparam\/dhparam-2048.pem <span class=\"token number\">2048<\/span><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u9375\u3092\u751f\u6210\u3059\u308b\u306b\u306f\u3001\u6570\u79d2\u304b\u304b\u308a\u307e\u3059\u3002<\/p>\n<p>Nginx\u306e\u8a2d\u5b9a\u306b\u95a2\u9023\u3059\u308bDiffie-Hellman\u3068SSL\u306e\u60c5\u5831\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6700\u521d\u306b\u524d\u306b\u4f5c\u6210\u3057\u305fNginx\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">rm<\/span> nginx-conf\/nginx.conf<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u30d5\u30a1\u30a4\u30eb\u306e\u5225\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u958b\u304f\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> nginx-conf\/nginx.conf<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u30d5\u30a1\u30a4\u30eb\u306b\u8ffd\u52a0\u3057\u3066\u3001HTTP\u3092HTTPS\u306b\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u3057\u3001SSL\u306e\u8a8d\u8a3c\u60c5\u5831\u3001\u30d7\u30ed\u30c8\u30b3\u30eb\u3001\u304a\u3088\u3073\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30d8\u30c3\u30c0\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002your_domain\u3092\u3054\u81ea\u5206\u306e\u30c9\u30e1\u30a4\u30f3\u306b\u7f6e\u304d\u63db\u3048\u308b\u3053\u3068\u3092\u5fd8\u308c\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002<\/p>\n<div>\u4ee5\u4e0b\u306e\u5185\u5bb9\u306e\u65e5\u672c\u8a9e\u8868\u73fe\u3092\u4e00\u3064\u63d0\u4f9b\u3057\u307e\u3059\uff1a<br \/>\n~\/node_project\/nginx-conf\/nginx.conf\uff5e\/node_project\/nginx-conf\/nginx.conf<\/p>\n<\/div>\n<pre class=\"post-pre\"><code>\r\n<span class=\"token directive\"><span class=\"token keyword\">server<\/span><\/span> <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">listen<\/span> <span class=\"token number\">80<\/span><\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">listen<\/span> [::]:80<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">server_name<\/span> <mark>your_domain<\/mark> www.<mark>your_domain<\/mark><\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">location<\/span> ~ \/.well-known\/acme-challenge<\/span> <span class=\"token punctuation\">{<\/span>\r\n          <span class=\"token directive\"><span class=\"token keyword\">allow<\/span> all<\/span><span class=\"token punctuation\">;<\/span>\r\n          <span class=\"token directive\"><span class=\"token keyword\">root<\/span> \/var\/www\/html<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token punctuation\">}<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">location<\/span> \/<\/span> <span class=\"token punctuation\">{<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">rewrite<\/span> ^ https:\/\/<span class=\"token variable\">$host<\/span><span class=\"token variable\">$request_uri?<\/span> permanent<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n\r\n<span class=\"token directive\"><span class=\"token keyword\">server<\/span><\/span> <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">listen<\/span> <span class=\"token number\">443<\/span> ssl http2<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">listen<\/span> [::]:443 ssl http2<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">server_name<\/span> <mark>your_domain<\/mark> www.<mark>your_domain<\/mark><\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">server_tokens<\/span> <span class=\"token boolean\">off<\/span><\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_certificate<\/span> \/etc\/letsencrypt\/live\/<mark>your_domain<\/mark>\/fullchain.pem<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_certificate_key<\/span> \/etc\/letsencrypt\/live\/<mark>your_domain<\/mark>\/privkey.pem<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_buffer_size<\/span> <span class=\"token number\">8k<\/span><\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_dhparam<\/span> \/etc\/ssl\/certs\/dhparam-2048.pem<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_protocols<\/span> TLSv1.2<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_prefer_server_ciphers<\/span> <span class=\"token boolean\">on<\/span><\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_ciphers<\/span> ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_ecdh_curve<\/span> secp384r1<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_session_tickets<\/span> <span class=\"token boolean\">off<\/span><\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_stapling<\/span> <span class=\"token boolean\">on<\/span><\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">ssl_stapling_verify<\/span> <span class=\"token boolean\">on<\/span><\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">resolver<\/span> 8.8.8.8<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">location<\/span> \/<\/span> <span class=\"token punctuation\">{<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">try_files<\/span> <span class=\"token variable\">$uri<\/span> @nodejs<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token punctuation\">}<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">location<\/span> @nodejs<\/span> <span class=\"token punctuation\">{<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">proxy_pass<\/span> http:\/\/nodejs:8080<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> X-Frame-Options <span class=\"token string\">\"SAMEORIGIN\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> X-XSS-Protection <span class=\"token string\">\"1; mode=block\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> X-Content-Type-Options <span class=\"token string\">\"nosniff\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> Referrer-Policy <span class=\"token string\">\"no-referrer-when-downgrade\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> Content-Security-Policy <span class=\"token string\">\"default-src * data: 'unsafe-eval' 'unsafe-inline'\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token comment\">#add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains; preload\" always;<\/span>\r\n                <span class=\"token comment\"># enable strict transport security only if you understand the implications<\/span>\r\n        <span class=\"token punctuation\">}<\/span>\r\n\r\n        <span class=\"token directive\"><span class=\"token keyword\">root<\/span> \/var\/www\/html<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token directive\"><span class=\"token keyword\">index<\/span> index.html index.htm index.nginx-debian.html<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0b\u306e\u6587\u3092\u65e5\u672c\u8a9e\u306b\u30cd\u30a4\u30c6\u30a3\u30d6\u306a\u8868\u73fe\u306b\u8a00\u3044\u63db\u3048\u307e\u3059\u3002\u8907\u6570\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u5fc5\u8981\u3042\u308a\u307e\u305b\u3093\uff1a<\/p>\n<p>HTTP\u30b5\u30fc\u30d0\u30fc\u30d6\u30ed\u30c3\u30af\u3067\u306f\u3001Certbot\u306e\u66f4\u65b0\u30ea\u30af\u30a8\u30b9\u30c8\u306ewebroot\u3092.well-known\/acme-challenge\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3068\u3057\u3066\u6307\u5b9a\u3057\u307e\u3059\u3002\u307e\u305f\u3001HTTP\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u30eb\u30fc\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304b\u3089HTTPS\u306b\u30ea\u30e9\u30a4\u30c8\u3059\u308b\u305f\u3081\u306e\u30ea\u30e9\u30a4\u30c8\u6307\u793a\u3082\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>HTTPS\u30b5\u30fc\u30d0\u30fc\u30d6\u30ed\u30c3\u30af\u306f\u3001SSL\u3068HTTP2\u3092\u6709\u52b9\u306b\u3057\u307e\u3059\u3002HTTP\/2\u304cHTTP\u30d7\u30ed\u30c8\u30b3\u30eb\u3092\u6539\u5584\u3057\u3001\u30a6\u30a7\u30d6\u30b5\u30a4\u30c8\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306b\u3069\u306e\u3088\u3046\u306a\u5229\u70b9\u304c\u3042\u308b\u304b\u306b\u3064\u3044\u3066\u306f\u3001Ubuntu 18.04\u3067\u306eNginx\u306eHTTP\/2\u30b5\u30dd\u30fc\u30c8\u306e\u8a2d\u5b9a\u65b9\u6cd5\u306e\u7d39\u4ecb\u3092\u8aad\u3093\u3067\u304f\u3060\u3055\u3044\u3002\u3053\u306e\u30d6\u30ed\u30c3\u30af\u306b\u306f\u3001\u6700\u65b0\u306eSSL\u30d7\u30ed\u30c8\u30b3\u30eb\u3068\u6697\u53f7\u5316\u65b9\u5f0f\u3092\u4f7f\u7528\u3057\u3066\u304a\u308a\u3001\u307e\u305fOSCP\u30b9\u30c6\u30fc\u30d7\u30ea\u30f3\u30b0\u3082\u6709\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002OSCP\u30b9\u30c6\u30fc\u30d7\u30ea\u30f3\u30b0\u306f\u3001\u521d\u671f\u306eTLS\u30cf\u30f3\u30c9\u30b7\u30a7\u30a4\u30af\u4e2d\u306b\u8a3c\u660e\u66f8\u306e\u8a8d\u8a3c\u60c5\u5831\u3092\u63d0\u4f9b\u3059\u308b\u3053\u3068\u3067\u3001\u8a8d\u8a3c\u30d7\u30ed\u30bb\u30b9\u306e\u9ad8\u901f\u5316\u3092\u53ef\u80fd\u306b\u3057\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e\u30d6\u30ed\u30c3\u30af\u306f\u3001SSL\u3068Diffie-Hellman\u306e\u8cc7\u683c\u60c5\u5831\u3068\u30ad\u30fc\u306e\u5834\u6240\u3082\u6307\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u6700\u7d42\u7684\u306b\u3001\u30d7\u30ed\u30ad\u30b7\u30d1\u30b9\u60c5\u5831\u306f\u3053\u306e\u30d6\u30ed\u30c3\u30af\u306b\u79fb\u52d5\u3057\u307e\u3057\u305f\u3002\u3053\u308c\u306b\u306f\u3001\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u30a8\u30a4\u30ea\u30a2\u30b9\u3055\u308c\u305fNode.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b3\u30f3\u30c6\u30ca\u306b\u30dd\u30a4\u30f3\u30c8\u3059\u308btry_files\u30c7\u30a3\u30ec\u30af\u30c6\u30a3\u30d6\u3092\u542b\u3080location\u30d6\u30ed\u30c3\u30af\u3001\u304a\u3088\u3073\u305d\u306e\u30a8\u30a4\u30ea\u30a2\u30b9\u306e\u305f\u3081\u306elocation\u30d6\u30ed\u30c3\u30af\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002\u307e\u305f\u3001\u3053\u308c\u3089\u306e\u30a8\u30a4\u30ea\u30a2\u30b9\u306b\u306f\u3001SSL Labs\u3084Security Headers\u30b5\u30fc\u30d0\u30fc\u30c6\u30b9\u30c8\u30b5\u30a4\u30c8\u306a\u3069\u3067A\u306e\u8a55\u4fa1\u3092\u53d6\u5f97\u3059\u308b\u305f\u3081\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30d8\u30c3\u30c0\u30fc\u3082\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002\u3053\u308c\u3089\u306e\u30d8\u30c3\u30c0\u30fc\u306b\u306f\u3001X-Frame-Options\u3001X-Content-Type-Options\u3001Referrer Policy\u3001Content-Security-Policy\u3001\u304a\u3088\u3073X-XSS-Protection\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002HTTP Strict Transport Security\uff08HSTS\uff09\u30d8\u30c3\u30c0\u30fc\u306f\u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\u3055\u308c\u3066\u3044\u307e\u3059\u304c\u3001\u9069\u5207\u306a\u7406\u89e3\u3068\u300cpreload\u300d\u6a5f\u80fd\u306e\u8a55\u4fa1\u304c\u3042\u308b\u5834\u5408\u306b\u306e\u307f\u3001\u6709\u52b9\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u7de8\u96c6\u304c\u7d42\u308f\u3063\u305f\u3089\u3001\u30d5\u30a1\u30a4\u30eb\u3092\u4fdd\u5b58\u3057\u3066\u9589\u3058\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>web\u30b5\u30fc\u30d0\u30fc\u30b5\u30fc\u30d3\u30b9\u3092\u518d\u4f5c\u6210\u3059\u308b\u524d\u306b\u3001docker-compose.yml\u30d5\u30a1\u30a4\u30eb\u306e\u30b5\u30fc\u30d3\u30b9\u5b9a\u7fa9\u306b\u3044\u304f\u3064\u304b\u306e\u9805\u76ee\u3092\u8ffd\u52a0\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u308c\u306b\u306fHTTPS\u306e\u95a2\u9023\u3059\u308b\u30dd\u30fc\u30c8\u60c5\u5831\u3068Diffie-Hellman\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u5b9a\u7fa9\u304c\u542b\u307e\u308c\u307e\u3059\u3002<\/p>\n<p>\u30d5\u30a1\u30a4\u30eb\u3092\u958b\u3051\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> docker-compose.yml<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u30a6\u30a7\u30d6\u30b5\u30fc\u30d0\u30fc\u30b5\u30fc\u30d3\u30b9\u306e\u5b9a\u7fa9\u306b\u3001\u6b21\u306e\u30dd\u30fc\u30c8\u30de\u30c3\u30d4\u30f3\u30b0\u3068dhparam\u3068\u3044\u3046\u540d\u524d\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div>\u4ee5\u4e0b\u306f\u3001\u30cd\u30a4\u30c6\u30a3\u30d6\u306a\u65e5\u672c\u8a9e\u3067\u306e1\u3064\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u306e\u30d1\u30e9\u30d5\u30ec\u30fc\u30ba\u3067\u3059:<br \/>\n~\/node_project\/docker-compose.yml \u2192 ~\/\u30ce\u30fc\u30c9\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\/\u30c9\u30c3\u30ab\u30fc\u30b3\u30f3\u30dd\u30fc\u30ba.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n <span class=\"token key atrule\">webserver<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> nginx<span class=\"token punctuation\">:<\/span>latest\r\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> webserver\r\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">-<\/span>stopped\r\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> <span class=\"token string\">\"80:80\"<\/span>\r\n      <span class=\"token punctuation\">-<\/span> <mark><span class=\"token string\">\"443:443\"<\/span><\/mark>\r\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> web<span class=\"token punctuation\">-<\/span>root<span class=\"token punctuation\">:<\/span>\/var\/www\/html\r\n      <span class=\"token punctuation\">-<\/span> .\/nginx<span class=\"token punctuation\">-<\/span>conf<span class=\"token punctuation\">:<\/span>\/etc\/nginx\/conf.d\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>etc<span class=\"token punctuation\">:<\/span>\/etc\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> certbot<span class=\"token punctuation\">-<\/span>var<span class=\"token punctuation\">:<\/span>\/var\/lib\/letsencrypt\r\n      <span class=\"token punctuation\">-<\/span> <mark>dhparam<span class=\"token punctuation\">:<\/span>\/etc\/ssl\/certs<\/mark>\r\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> nodejs\r\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> app<span class=\"token punctuation\">-<\/span>network\r\n<\/code><\/pre>\n<p>\u6b21\u306b\u3001volumes\u306e\u5b9a\u7fa9\u306bdhparam\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002sammy\u3068node_project\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u81ea\u5206\u306e\u3082\u306e\u306b\u7f6e\u304d\u63db\u3048\u308b\u3053\u3068\u3092\u5fd8\u308c\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002<\/p>\n<div>\n<p>\u4ee5\u4e0b\u306e~\/node_project\/docker-compose.yml\u306e\u5185\u5bb9\u3092\u65e5\u672c\u8a9e\u3067\u8a00\u3044\u63db\u3048\u307e\u3059\uff08\u4e00\u3064\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u307f\uff09:<\/p>\n<p>\u30e6\u30fc\u30b6\u30fc\/\u30ce\u30fc\u30c9_\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\/\u30c9\u30c3\u30ab\u30fc_\u30b3\u30f3\u30dd\u30fc\u30ba.yml<\/p>\n<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token punctuation\">...<\/span>\r\n  <span class=\"token key atrule\">webroot<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token punctuation\">...<\/span>\r\n  <mark><span class=\"token key atrule\">dhparam<\/span><span class=\"token punctuation\">:<\/span><\/mark>\r\n    <mark><span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> local<\/mark>\r\n    <mark><span class=\"token key atrule\">driver_opts<\/span><span class=\"token punctuation\">:<\/span><\/mark>\r\n      <mark><span class=\"token key atrule\">type<\/span><span class=\"token punctuation\">:<\/span> none<\/mark>\r\n      <mark><span class=\"token key atrule\">device<\/span><span class=\"token punctuation\">:<\/span> \/home\/sammy\/node_project\/dhparam\/<\/mark>\r\n      <mark><span class=\"token key atrule\">o<\/span><span class=\"token punctuation\">:<\/span> bind<\/mark>\r\n<\/code><\/pre>\n<p>\u30a6\u30a7\u30d6\u30eb\u30fc\u30c8\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3068\u540c\u69d8\u306b\u3001dhparam\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u306f\u30db\u30b9\u30c8\u306b\u4fdd\u5b58\u3055\u308c\u305fDiffie-Hellman\u9375\u3092\u30a6\u30a7\u30d6\u30b5\u30fc\u30d0\u30fc\u306e\u30b3\u30f3\u30c6\u30ca\u306b\u30de\u30a6\u30f3\u30c8\u3057\u307e\u3059\u3002<\/p>\n<p>\u7de8\u96c6\u304c\u7d42\u308f\u3063\u305f\u3089\u3001\u30d5\u30a1\u30a4\u30eb\u3092\u4fdd\u5b58\u3057\u3066\u9589\u3058\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u30a6\u30a7\u30d6\u30b5\u30fc\u30d0\u30fc\u30b5\u30fc\u30d3\u30b9\u3092\u518d\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> up <span class=\"token parameter variable\">-d<\/span> &#8211;force-recreate &#8211;no-deps webserver<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Docker-compose ps\u3067\u30b5\u30fc\u30d3\u30b9\u3092\u30c1\u30a7\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> <span class=\"token function\">ps<\/span><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u6b21\u306e\u51fa\u529b\u306f\u3001\u304a\u4f7f\u3044\u306eNode.js\u3068\u30a6\u30a7\u30d6\u30b5\u30fc\u30d0\u30fc\u30b5\u30fc\u30d3\u30b9\u304c\u5b9f\u884c\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u793a\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Name Command State Ports &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- certbot certbot certonly &#8211;webroot &#8230; Exit 0 nodejs node app.js Up 8080\/tcp webserver nginx -g daemon off; Up 0.0.0.0:443-&gt;443\/tcp, 0.0.0.0:80-&gt;80\/tcp<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u6700\u5f8c\u306b\u3001\u3059\u3079\u3066\u304c\u4e88\u60f3\u901a\u308a\u306b\u52d5\u4f5c\u3057\u3066\u3044\u308b\u304b\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306b\u3001\u3054\u81ea\u8eab\u306e\u30c9\u30e1\u30a4\u30f3\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u3059\u3002\u30d6\u30e9\u30a6\u30b6\u3067https:\/\/your_domain\u306b\u79fb\u52d5\u3057\u3001your_domain\u3092\u3054\u81ea\u8eab\u306e\u30c9\u30e1\u30a4\u30f3\u540d\u306b\u7f6e\u304d\u63db\u3048\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65647ad7daa94e2bdf7b8c59\/159-0.png\" alt=\"Application Landing Page\" \/><\/div>\n<p>\u30d6\u30e9\u30a6\u30b6\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u6307\u793a\u306b\u306f\u3001\u30ed\u30c3\u30af\u30a2\u30a4\u30b3\u30f3\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002\u3054\u5e0c\u671b\u3067\u3042\u308c\u3070\u3001SSL Labs Server Test \u30e9\u30f3\u30c7\u30a3\u30f3\u30b0\u30da\u30fc\u30b8\u307e\u305f\u306f Security Headers server test \u30e9\u30f3\u30c7\u30a3\u30f3\u30b0\u30da\u30fc\u30b8\u306b\u79fb\u52d5\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u69cb\u6210\u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u306f\u3001SSL Labs Server Test \u3067 A \u8a55\u4fa1\u3092\u7372\u5f97\u3059\u308b\u305f\u3081\u306e\u8a2d\u5b9a\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002Security Headers server test \u3067 A \u8a55\u4fa1\u3092\u7372\u5f97\u3059\u308b\u306b\u306f\u3001nginx-conf\/nginx.conf \u30d5\u30a1\u30a4\u30eb\u3067 Strict Transport Security (HSTS) \u30d8\u30c3\u30c0\u30fc\u306e\u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\u3092\u89e3\u9664\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<div>\u4ee5\u4e0b\u306e\u5185\u5bb9\u3092\u65e5\u672c\u8a9e\u3067\u8a00\u3044\u63db\u3048\u307e\u3059\uff08\u4e00\u3064\u306e\u9078\u629e\u80a2\uff09:<br \/>\n~\/node_project\/nginx-conf\/nginx.conf<\/div>\n<pre class=\"post-pre\"><code>\u2026\r\n<span class=\"token directive\"><span class=\"token keyword\">location<\/span> @nodejs<\/span> <span class=\"token punctuation\">{<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">proxy_pass<\/span> http:\/\/nodejs:8080<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> X-Frame-Options <span class=\"token string\">\"SAMEORIGIN\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> X-XSS-Protection <span class=\"token string\">\"1; mode=block\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> X-Content-Type-Options <span class=\"token string\">\"nosniff\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> Referrer-Policy <span class=\"token string\">\"no-referrer-when-downgrade\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> Content-Security-Policy <span class=\"token string\">\"default-src * data: 'unsafe-eval' 'unsafe-inline'\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span>\r\n                <mark><span class=\"token directive\"><span class=\"token keyword\">add_header<\/span> Strict-Transport-Security <span class=\"token string\">\"max-age=31536000; includeSubDomains; preload\"<\/span> always<\/span><span class=\"token punctuation\">;<\/span><\/mark>\r\n                <span class=\"token comment\"># enable strict transport security only if you understand the implications<\/span>\r\n        <span class=\"token punctuation\">}<\/span>\r\n\u2026\r\n<\/code><\/pre>\n<p>\u3082\u3057\u610f\u5473\u3092\u7406\u89e3\u3057\u3001\u305d\u306e&#8221;\u30d7\u30ea\u30ed\u30fc\u30c9&#8221;\u6a5f\u80fd\u3092\u8a55\u4fa1\u3057\u305f\u4e0a\u3067\u306e\u307f\u3001\u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u6709\u52b9\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<h2>\u30b9\u30c6\u30c3\u30d76 \u2014 \u8a3c\u660e\u66f8\u306e\u66f4\u65b0<\/h2>\n<p>Let&#8217;s Encrypt\u306e\u8a3c\u660e\u66f8\u306f90\u65e5\u9593\u6709\u52b9\u3067\u3059\u3002\u305d\u308c\u304c\u5207\u308c\u306a\u3044\u3088\u3046\u306b\u3001\u81ea\u52d5\u66f4\u65b0\u30d7\u30ed\u30bb\u30b9\u3092\u8a2d\u5b9a\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u3053\u308c\u3092\u884c\u3046\u65b9\u6cd5\u306e\u4e00\u3064\u306f\u3001cron\u30b9\u30b1\u30b8\u30e5\u30fc\u30ea\u30f3\u30b0\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u3067\u30b8\u30e7\u30d6\u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\u3067\u3059\u3002\u8a3c\u660e\u66f8\u3092\u66f4\u65b0\u3057\u3066Nginx\u306e\u8a2d\u5b9a\u3092\u30ea\u30ed\u30fc\u30c9\u3059\u308b\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3001cron\u30b8\u30e7\u30d6\u3092\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u3067\u3001ssl_renew.sh\u3068\u3044\u3046\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u958b\u3044\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> ssl_renew.sh<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u8a3c\u660e\u66f8\u3092\u66f4\u65b0\u3057\u3001Web\u30b5\u30fc\u30d0\u30fc\u306e\u8a2d\u5b9a\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3059\u308b\u305f\u3081\u306b\u3001\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u30b9\u30af\u30ea\u30d7\u30c8\u306b\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div>\u4ee5\u4e0b\u306e\u30d5\u30ec\u30fc\u30ba\u3092\u65e5\u672c\u8a9e\u3067\u8868\u73fe\u3057\u3066\u304f\u3060\u3055\u3044\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\u306f1\u3064\u306e\u307f\uff09:<br \/>\n~\/node_project\/ssl_renew.sh~\/node_project\/ssl_renew.sh<\/p>\n<\/div>\n<pre class=\"post-pre\"><code><span class=\"token shebang important\">#!\/bin\/bash<\/span>\r\n\r\n<span class=\"token assign-left variable\">COMPOSE<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">\"\/usr\/local\/bin\/docker-compose --ansi never\"<\/span>\r\n<span class=\"token assign-left variable\">DOCKER<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">\"\/usr\/bin\/docker\"<\/span>\r\n\r\n<span class=\"token builtin class-name\">cd<\/span> \/home\/<mark>sammy<\/mark>\/<mark>node_project<\/mark>\/\r\n<span class=\"token variable\">$COMPOSE<\/span> run certbot renew --dry-run <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token variable\">$COMPOSE<\/span> <span class=\"token function\">kill<\/span> <span class=\"token parameter variable\">-s<\/span> SIGHUP webserver\r\n<span class=\"token variable\">$DOCKER<\/span> system prune <span class=\"token parameter variable\">-af<\/span>\r\n<\/code><\/pre>\n<p>\u3053\u306e\u30b9\u30af\u30ea\u30d7\u30c8\u306f\u307e\u305a\u3001docker-compose\u30d0\u30a4\u30ca\u30ea\u3092COMPOSE\u3068\u3044\u3046\u5909\u6570\u306b\u5272\u308a\u5f53\u3066\u3001&#8211;no-ansi\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001docker-compose\u30b3\u30de\u30f3\u30c9\u3092ANSI\u5236\u5fa1\u6587\u5b57\u306a\u3057\u3067\u5b9f\u884c\u3057\u307e\u3059\u3002\u6b21\u306b\u3001\u540c\u3058\u3088\u3046\u306bdocker\u30d0\u30a4\u30ca\u30ea\u3082\u540c\u69d8\u306b\u8a2d\u5b9a\u3057\u307e\u3059\u3002\u6700\u5f8c\u306b\u3001~\/node_project\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5\u3057\u3001\u4ee5\u4e0b\u306edocker-compose\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n<ul class=\"post-ul\">\n<li>docker-compose run: This will start a certbot container and override the command provided in the certbot service definition. Instead of using the certonly subcommand use the renew subcommand, which will renew certificates that are close to expiring. Also included is the &#8211;dry-run option to test the script.<\/li>\n<li>docker-compose kill: This will send a SIGHUP signal to the webserver container to reload the Nginx configuration.<\/li>\n<\/ul>\n<p>\u305d\u308c\u304b\u3089\u3001\u4f7f\u7528\u3055\u308c\u3066\u3044\u306a\u3044\u3059\u3079\u3066\u306e\u30b3\u30f3\u30c6\u30ca\u3068\u30a4\u30e1\u30fc\u30b8\u3092\u524a\u9664\u3059\u308b\u305f\u3081\u306b\u3001docker system prune\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n<p>\u7de8\u96c6\u304c\u7d42\u308f\u3063\u305f\u3089\u30d5\u30a1\u30a4\u30eb\u3092\u9589\u3058\u3066\u304b\u3089\u3001\u5b9f\u884c\u53ef\u80fd\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">chmod<\/span> +x ssl_renew.sh<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u6b21\u306b\u3001\u6307\u5b9a\u3055\u308c\u305f\u9593\u9694\u3067\u66f4\u65b0\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u306b\u3001\u30eb\u30fc\u30c8\u306e\u30af\u30fc\u30ed\u30f3\u30bf\u30d6\u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code>sudo crontab -e \r\n<\/code><\/pre>\n<p>\u3082\u3057\u521d\u3081\u3066\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u7de8\u96c6\u3059\u308b\u5834\u5408\u3001\u30a8\u30c7\u30a3\u30bf\u3092\u9078\u629e\u3059\u308b\u3088\u3046\u306b\u6c42\u3081\u3089\u308c\u307e\u3059\u3002<\/p>\n<div>\u30af\u30ed\u30f3\u30b8\u30e7\u30d6<\/div>\n<pre class=\"post-pre\"><code>no crontab for root - using an empty one\r\nSelect an editor.  To change later, run 'select-editor'.\r\n  1. \/bin\/ed\r\n  2. \/bin\/nano        &lt;---- easiest\r\n  3. \/usr\/bin\/vim.basic\r\n  4. \/usr\/bin\/vim.tiny\r\nChoose 1-4 [2]: \r\n...\r\n<\/code><\/pre>\n<p>\u30d5\u30a1\u30a4\u30eb\u306e\u6700\u5f8c\u306b\u3001\u4ee5\u4e0b\u306e\u884c\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div>\u30af\u30ed\u30f3\u30bf\u30d6<\/div>\n<pre class=\"post-pre\"><code>...\r\n*\/5 * * * * \/home\/<mark>sammy<\/mark>\/<mark>node_project<\/mark>\/ssl_renew.sh &gt;&gt; \/var\/log\/cron.log 2&gt;&amp;1\r\n<\/code><\/pre>\n<p>\u6b21\u306e\u6587\u3092\u65e5\u672c\u8a9e\u3067\u8a00\u3044\u63db\u3048\u308b\u3068\uff1a\u300c\u3053\u308c\u306b\u3088\u308a\u3001\u30b8\u30e7\u30d6\u306e\u9593\u9694\u30925\u5206\u3054\u3068\u306b\u8a2d\u5b9a\u3057\u3001\u66f4\u65b0\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u610f\u56f3\u3057\u305f\u901a\u308a\u306b\u6a5f\u80fd\u3057\u3066\u3044\u308b\u304b\u3069\u3046\u304b\u3092\u30c6\u30b9\u30c8\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u307e\u305f\u3001cron.log\u3068\u3044\u3046\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u3082\u4f5c\u6210\u3055\u308c\u3001\u30b8\u30e7\u30d6\u304b\u3089\u306e\u95a2\u9023\u3059\u308b\u51fa\u529b\u3092\u8a18\u9332\u3057\u307e\u3059\u3002\u300d<\/p>\n<p>5\u5206\u5f8c\u306b\u3001cron.log\u3092\u78ba\u8a8d\u3057\u3066\u66f4\u65b0\u8981\u6c42\u304c\u6210\u529f\u3057\u305f\u304b\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">tail<\/span> <span class=\"token parameter variable\">-f<\/span> \/var\/log\/cron.log<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u6570\u79d2\u5f8c\u3001\u6b21\u306e\u51fa\u529b\u306b\u3088\u3063\u3066\u6210\u529f\u3057\u305f\u66f4\u65b0\u304c\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; ** DRY RUN: simulating &#8216;certbot renew&#8217; close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: \/etc\/letsencrypt\/live\/<mark>your_domain<\/mark>\/fullchain.pem (success) ** DRY RUN: simulating &#8216;certbot renew&#8217; close to cert expiry ** (The test certificates above have not been saved.) &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; Killing webserver &#8230; <mark>done<\/mark><\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u2026 Congratulations, all simulated renewals succeeded: \/etc\/letsencrypt\/live\/<mark>your_domain<\/mark>\/fullchain.pem (success) &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; Saving debug log to \/var\/log\/letsencrypt\/letsencrypt.log Killing webserver &#8230; Killing webserver &#8230; done Deleted Containers: 00cad94050985261e5b377de43e314b30ad0a6a724189753a9a23ec76488fd78 Total reclaimed space: 824.5kB<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u7aef\u672b\u3067CTRL + C \u3092\u5165\u529b\u3057\u3066\u7d42\u4e86\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3001cron\u30bf\u30d6\u30d5\u30a1\u30a4\u30eb\u3092\u7de8\u96c6\u3057\u3066\u6bce\u65e5\u306e\u9593\u9694\u3092\u8a2d\u5b9a\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u4f8b\u3048\u3070\u3001\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u6bce\u65e5\u6b63\u5348\u306b\u5b9f\u884c\u3059\u308b\u5834\u5408\u3001\u30d5\u30a1\u30a4\u30eb\u306e\u6700\u5f8c\u306e\u884c\u3092\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u5909\u66f4\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<div>crontab\u3092\u65e5\u672c\u8a9e\u3067\u8a00\u3044\u63db\u3048\u308b\u3068\u3001\u6b21\u306e\u901a\u308a\u3067\u3059\uff1a\u300c\u30af\u30ed\u30f3\u30bf\u30d6\u300d<\/div>\n<pre class=\"post-pre\"><code>...\r\n0 12 * * * \/home\/<mark>sammy<\/mark>\/<mark>node_project<\/mark>\/ssl_renew.sh &gt;&gt; \/var\/log\/cron.log 2&gt;&amp;1\r\n<\/code><\/pre>\n<p>\u3042\u306a\u305f\u306f\u3001ssl_renew.sh\u30b9\u30af\u30ea\u30d7\u30c8\u304b\u3089&#8211;dry-run\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u524a\u9664\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002<\/p>\n<div>\u4ee5\u4e0b\u306e\u6587\u3092\u65e5\u672c\u8a9e\u3067\u518d\u8868\u73fe\u3057\u307e\u3059\uff081\u3064\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u307f\uff09\uff1a<br \/>\n~\/node_project\/ssl_renew.sh \u2192 \u30db\u30fc\u30e0\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306enode_project\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u3042\u308bssl_renew.sh\u30d5\u30a1\u30a4\u30eb\u3067\u3059\u3002<\/div>\n<pre class=\"post-pre\"><code><span class=\"token shebang important\">#!\/bin\/bash<\/span>\r\n\r\n<span class=\"token assign-left variable\">COMPOSE<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">\"\/usr\/local\/bin\/docker-compose --no-ansi\"<\/span>\r\n<span class=\"token assign-left variable\">DOCKER<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">\"\/usr\/bin\/docker\"<\/span>\r\n\r\n<span class=\"token builtin class-name\">cd<\/span> \/home\/<mark>sammy<\/mark>\/<mark>node_project<\/mark>\/\r\n<span class=\"token variable\">$COMPOSE<\/span> run certbot renew <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token variable\">$COMPOSE<\/span> <span class=\"token function\">kill<\/span> <span class=\"token parameter variable\">-s<\/span> SIGHUP webserver\r\n<span class=\"token variable\">$DOCKER<\/span> system prune <span class=\"token parameter variable\">-af<\/span>\r\n<\/code><\/pre>\n<p>\u3042\u306a\u305f\u306ecron\u30b8\u30e7\u30d6\u306f\u3001Let&#8217;s Encrypt\u306e\u8a3c\u660e\u66f8\u306e\u6709\u52b9\u671f\u9650\u304c\u5207\u308c\u306a\u3044\u3088\u3046\u306b\u3001\u5bfe\u8c61\u306e\u8a3c\u660e\u66f8\u304c\u66f4\u65b0\u3055\u308c\u308b\u3053\u3068\u3092\u4fdd\u8a3c\u3057\u307e\u3059\u3002\u307e\u305f\u3001Logrotate\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u3092\u4f7f\u7528\u3057\u3066\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u306e\u30ed\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3\u3068\u5727\u7e2e\u3082\u8a2d\u5b9a\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<h2>\u7d50\u8ad6<\/h2>\n<p>Node\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092Nginx\u30ea\u30d0\u30fc\u30b9\u30d7\u30ed\u30ad\u30b7\u3092\u7528\u3044\u3066\u8a2d\u5b9a\u3057\u3001\u5b9f\u884c\u3059\u308b\u305f\u3081\u306b\u30b3\u30f3\u30c6\u30ca\u3092\u4f7f\u7528\u3057\u307e\u3057\u305f\u3002\u307e\u305f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c9\u30e1\u30a4\u30f3\u306b\u5bfe\u3057\u3066SSL\u8a3c\u660e\u66f8\u3092\u53d6\u5f97\u3057\u3001\u3053\u308c\u3089\u306e\u8a3c\u660e\u66f8\u3092\u5fc5\u8981\u306a\u5834\u5408\u306b\u66f4\u65b0\u3059\u308b\u305f\u3081\u306b\u30af\u30ed\u30f3\u30b8\u30e7\u30d6\u3092\u8a2d\u5b9a\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>\u300c\u3082\u3057Let&#8217;s Encrypt\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u306b\u3064\u3044\u3066\u3082\u3063\u3068\u5b66\u3073\u305f\u3044\u3068\u601d\u308f\u308c\u308b\u306a\u3089\u3001Nginx\u30d7\u30e9\u30b0\u30a4\u30f3\u307e\u305f\u306f\u30b9\u30bf\u30f3\u30c9\u30a2\u30ed\u30f3\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u4f7f\u7528\u306b\u95a2\u3059\u308b\u5f53\u793e\u306e\u8a18\u4e8b\u3092\u3054\u89a7\u304f\u3060\u3055\u3044\u3002\u300d<\/p>\n<p>\u4ee5\u4e0b\u306e\u30ea\u30bd\u30fc\u30b9\u3092\u4f7f\u3063\u3066\u3001Docker Compose\u306b\u3064\u3044\u3066\u3055\u3089\u306b\u5b66\u3076\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002<\/p>\n<ul class=\"post-ul\">\n<li>How To Install Docker Compose on Ubuntu 18.04.<\/li>\n<li>How To Configure a Continuous Integration Testing Environment with Docker and Docker Compose on Ubuntu 16.04.<\/li>\n<li>How To Set Up Laravel, Nginx, and MySQL with Docker Compose.<\/li>\n<\/ul>\n<p>Compose\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3\u306f\u3001\u30de\u30eb\u30c1\u30b3\u30f3\u30c6\u30ca\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u5b66\u3076\u305f\u3081\u306e\u7d20\u6674\u3089\u3057\u3044\u30ea\u30bd\u30fc\u30b9\u3067\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5e8f\u6587 Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u67d4\u8edf\u6027\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u5411\u4e0a\u3055\u305b\u308b\u65b9\u6cd5\u306f\u8907\u6570\u3042\u308a\u307e\u3059\u3002Nginx\u306e\u3088\u3046\u306a\u30ea\u30d0\u30fc\u30b9\u30d7\u30ed\u30ad\u30b7\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u8ca0\u8377\u5206\u6563\u3001\u9759\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u3001\u30c8\u30e9\u30f3\u30b9\u30dd\u30fc\u30c8\u5c64\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[71,26],"class_list":["post-237","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-node-js","tag-26"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092Nginx\u3001Let&#039;s Encrypt\u3001\u304a\u3088\u3073Docker Compose\u3067\u5b89\u5168\u306b\u30b3\u30f3\u30c6\u30ca\u5316\u306e\u65b9\u6cd5 - Blog - Silicon Cloud<\/title>\n<meta name=\"description\" content=\"Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092NginxLet&#039;s Encrypt\u304a\u3088\u3073Docker Compose\u3067\u5b89\u5168\u306b\u30b3\u30f3\u30c6\u30ca\u5316\u306e\u65b9\u6cd5\u3092\u5206\u304b\u308a\u3084\u3059\u304f\u89e3\u8aac\u3002\u5b9f\u8df5\u7684\u306a\u4f8b\u3068\u30b3\u30fc\u30c9\u3001\u6ce8\u610f\u70b9\u3092\u542b\u3081\u3066\u521d\u5fc3\u8005\u306b\u3082\u7406\u89e3\u3067\u304d\u308b\u3088\u3046\u8aac\u660e\u3057\u307e\u3059\u3002\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/ja\/blog\/node-js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092nginx\u3001lets-encrypt\u3001\u304a\u3088\u3073docker-compose\u3067\u5b89\u5168\/\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092Nginx\u3001Let&#039;s Encrypt\u3001\u304a\u3088\u3073Docker Compose\u3067\u5b89\u5168\u306b\u30b3\u30f3\u30c6\u30ca\u5316\u306e\u65b9\u6cd5\" \/>\n<meta property=\"og:description\" content=\"Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092NginxLet&#039;s Encrypt\u304a\u3088\u3073Docker Compose\u3067\u5b89\u5168\u306b\u30b3\u30f3\u30c6\u30ca\u5316\u306e\u65b9\u6cd5\u3092\u5206\u304b\u308a\u3084\u3059\u304f\u89e3\u8aac\u3002\u5b9f\u8df5\u7684\u306a\u4f8b\u3068\u30b3\u30fc\u30c9\u3001\u6ce8\u610f\u70b9\u3092\u542b\u3081\u3066\u521d\u5fc3\u8005\u306b\u3082\u7406\u89e3\u3067\u304d\u308b\u3088\u3046\u8aac\u660e\u3057\u307e\u3059\u3002\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/ja\/blog\/node-js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092nginx\u3001lets-encrypt\u3001\u304a\u3088\u3073docker-compose\u3067\u5b89\u5168\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-23T18:12:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-31T12:53:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65647ad7daa94e2bdf7b8c59\/35-0.png\" \/>\n<meta name=\"author\" content=\"\u967d, \u5411\u5b87\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u57f7\u7b46\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u967d, \u5411\u5b87\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"64\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/node-js%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92nginx%e3%80%81lets-encrypt%e3%80%81%e3%81%8a%e3%82%88%e3%81%b3docker-compose%e3%81%a7%e5%ae%89%e5%85%a8\/\",\"url\":\"https:\/\/www.silicloud.com\/ja\/blog\/node-js%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92nginx%e3%80%81lets-encrypt%e3%80%81%e3%81%8a%e3%82%88%e3%81%b3docker-compose%e3%81%a7%e5%ae%89%e5%85%a8\/\",\"name\":\"Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092Nginx\u3001Let's Encrypt\u3001\u304a\u3088\u3073Docker Compose\u3067\u5b89\u5168\u306b\u30b3\u30f3\u30c6\u30ca\u5316\u306e\u65b9\u6cd5 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/#website\"},\"datePublished\":\"2023-06-23T18:12:33+00:00\",\"dateModified\":\"2025-07-31T12:53:04+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/#\/schema\/person\/4aef6196128551a0f5d66db46c42866c\"},\"description\":\"Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092NginxLet's Encrypt\u304a\u3088\u3073Docker Compose\u3067\u5b89\u5168\u306b\u30b3\u30f3\u30c6\u30ca\u5316\u306e\u65b9\u6cd5\u3092\u5206\u304b\u308a\u3084\u3059\u304f\u89e3\u8aac\u3002\u5b9f\u8df5\u7684\u306a\u4f8b\u3068\u30b3\u30fc\u30c9\u3001\u6ce8\u610f\u70b9\u3092\u542b\u3081\u3066\u521d\u5fc3\u8005\u306b\u3082\u7406\u89e3\u3067\u304d\u308b\u3088\u3046\u8aac\u660e\u3057\u307e\u3059\u3002\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/node-js%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92nginx%e3%80%81lets-encrypt%e3%80%81%e3%81%8a%e3%82%88%e3%81%b3docker-compose%e3%81%a7%e5%ae%89%e5%85%a8\/#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/ja\/blog\/node-js%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92nginx%e3%80%81lets-encrypt%e3%80%81%e3%81%8a%e3%82%88%e3%81%b3docker-compose%e3%81%a7%e5%ae%89%e5%85%a8\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/node-js%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92nginx%e3%80%81lets-encrypt%e3%80%81%e3%81%8a%e3%82%88%e3%81%b3docker-compose%e3%81%a7%e5%ae%89%e5%85%a8\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/ja\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092Nginx\u3001Let&#8217;s Encrypt\u3001\u304a\u3088\u3073Docker Compose\u3067\u5b89\u5168\u306b\u30b3\u30f3\u30c6\u30ca\u5316\u306e\u65b9\u6cd5\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/ja\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"ja\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/#\/schema\/person\/4aef6196128551a0f5d66db46c42866c\",\"name\":\"\u967d, \u5411\u5b87\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ad96b120e219751fa368cbd7d2c48ca01b59185e6ed394449bac72614a760bf3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ad96b120e219751fa368cbd7d2c48ca01b59185e6ed394449bac72614a760bf3?s=96&d=mm&r=g\",\"caption\":\"\u967d, \u5411\u5b87\"},\"url\":\"https:\/\/www.silicloud.com\/ja\/blog\/author\/hinatasora\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/node-js%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92nginx%e3%80%81lets-encrypt%e3%80%81%e3%81%8a%e3%82%88%e3%81%b3docker-compose%e3%81%a7%e5%ae%89%e5%85%a8\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092Nginx\u3001Let's Encrypt\u3001\u304a\u3088\u3073Docker Compose\u3067\u5b89\u5168\u306b\u30b3\u30f3\u30c6\u30ca\u5316\u306e\u65b9\u6cd5 - Blog - Silicon Cloud","description":"Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092NginxLet's Encrypt\u304a\u3088\u3073Docker Compose\u3067\u5b89\u5168\u306b\u30b3\u30f3\u30c6\u30ca\u5316\u306e\u65b9\u6cd5\u3092\u5206\u304b\u308a\u3084\u3059\u304f\u89e3\u8aac\u3002\u5b9f\u8df5\u7684\u306a\u4f8b\u3068\u30b3\u30fc\u30c9\u3001\u6ce8\u610f\u70b9\u3092\u542b\u3081\u3066\u521d\u5fc3\u8005\u306b\u3082\u7406\u89e3\u3067\u304d\u308b\u3088\u3046\u8aac\u660e\u3057\u307e\u3059\u3002","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/ja\/blog\/node-js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092nginx\u3001lets-encrypt\u3001\u304a\u3088\u3073docker-compose\u3067\u5b89\u5168\/","og_locale":"ja_JP","og_type":"article","og_title":"Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092Nginx\u3001Let's Encrypt\u3001\u304a\u3088\u3073Docker Compose\u3067\u5b89\u5168\u306b\u30b3\u30f3\u30c6\u30ca\u5316\u306e\u65b9\u6cd5","og_description":"Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092NginxLet's Encrypt\u304a\u3088\u3073Docker Compose\u3067\u5b89\u5168\u306b\u30b3\u30f3\u30c6\u30ca\u5316\u306e\u65b9\u6cd5\u3092\u5206\u304b\u308a\u3084\u3059\u304f\u89e3\u8aac\u3002\u5b9f\u8df5\u7684\u306a\u4f8b\u3068\u30b3\u30fc\u30c9\u3001\u6ce8\u610f\u70b9\u3092\u542b\u3081\u3066\u521d\u5fc3\u8005\u306b\u3082\u7406\u89e3\u3067\u304d\u308b\u3088\u3046\u8aac\u660e\u3057\u307e\u3059\u3002","og_url":"https:\/\/www.silicloud.com\/ja\/blog\/node-js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092nginx\u3001lets-encrypt\u3001\u304a\u3088\u3073docker-compose\u3067\u5b89\u5168\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-06-23T18:12:33+00:00","article_modified_time":"2025-07-31T12:53:04+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65647ad7daa94e2bdf7b8c59\/35-0.png"}],"author":"\u967d, \u5411\u5b87","twitter_card":"summary_large_image","twitter_misc":{"\u57f7\u7b46\u8005":"\u967d, \u5411\u5b87","\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"64\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/ja\/blog\/node-js%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92nginx%e3%80%81lets-encrypt%e3%80%81%e3%81%8a%e3%82%88%e3%81%b3docker-compose%e3%81%a7%e5%ae%89%e5%85%a8\/","url":"https:\/\/www.silicloud.com\/ja\/blog\/node-js%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92nginx%e3%80%81lets-encrypt%e3%80%81%e3%81%8a%e3%82%88%e3%81%b3docker-compose%e3%81%a7%e5%ae%89%e5%85%a8\/","name":"Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092Nginx\u3001Let's Encrypt\u3001\u304a\u3088\u3073Docker Compose\u3067\u5b89\u5168\u306b\u30b3\u30f3\u30c6\u30ca\u5316\u306e\u65b9\u6cd5 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/ja\/blog\/#website"},"datePublished":"2023-06-23T18:12:33+00:00","dateModified":"2025-07-31T12:53:04+00:00","author":{"@id":"https:\/\/www.silicloud.com\/ja\/blog\/#\/schema\/person\/4aef6196128551a0f5d66db46c42866c"},"description":"Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092NginxLet's Encrypt\u304a\u3088\u3073Docker Compose\u3067\u5b89\u5168\u306b\u30b3\u30f3\u30c6\u30ca\u5316\u306e\u65b9\u6cd5\u3092\u5206\u304b\u308a\u3084\u3059\u304f\u89e3\u8aac\u3002\u5b9f\u8df5\u7684\u306a\u4f8b\u3068\u30b3\u30fc\u30c9\u3001\u6ce8\u610f\u70b9\u3092\u542b\u3081\u3066\u521d\u5fc3\u8005\u306b\u3082\u7406\u89e3\u3067\u304d\u308b\u3088\u3046\u8aac\u660e\u3057\u307e\u3059\u3002","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/ja\/blog\/node-js%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92nginx%e3%80%81lets-encrypt%e3%80%81%e3%81%8a%e3%82%88%e3%81%b3docker-compose%e3%81%a7%e5%ae%89%e5%85%a8\/#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/ja\/blog\/node-js%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92nginx%e3%80%81lets-encrypt%e3%80%81%e3%81%8a%e3%82%88%e3%81%b3docker-compose%e3%81%a7%e5%ae%89%e5%85%a8\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/ja\/blog\/node-js%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92nginx%e3%80%81lets-encrypt%e3%80%81%e3%81%8a%e3%82%88%e3%81%b3docker-compose%e3%81%a7%e5%ae%89%e5%85%a8\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/ja\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092Nginx\u3001Let&#8217;s Encrypt\u3001\u304a\u3088\u3073Docker Compose\u3067\u5b89\u5168\u306b\u30b3\u30f3\u30c6\u30ca\u5316\u306e\u65b9\u6cd5"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/ja\/blog\/#website","url":"https:\/\/www.silicloud.com\/ja\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"ja"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/ja\/blog\/#\/schema\/person\/4aef6196128551a0f5d66db46c42866c","name":"\u967d, \u5411\u5b87","image":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/www.silicloud.com\/ja\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/ad96b120e219751fa368cbd7d2c48ca01b59185e6ed394449bac72614a760bf3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ad96b120e219751fa368cbd7d2c48ca01b59185e6ed394449bac72614a760bf3?s=96&d=mm&r=g","caption":"\u967d, \u5411\u5b87"},"url":"https:\/\/www.silicloud.com\/ja\/blog\/author\/hinatasora\/"},{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/www.silicloud.com\/ja\/blog\/node-js%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92nginx%e3%80%81lets-encrypt%e3%80%81%e3%81%8a%e3%82%88%e3%81%b3docker-compose%e3%81%a7%e5%ae%89%e5%85%a8\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/posts\/237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/comments?post=237"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/posts\/237\/revisions"}],"predecessor-version":[{"id":325763,"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/posts\/237\/revisions\/325763"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/media?parent=237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/categories?post=237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/tags?post=237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}