{"id":6548,"date":"2024-12-06T15:42:18","date_gmt":"2024-12-06T06:42:18","guid":{"rendered":"https:\/\/engineer-chanpu.blog\/?p=6548"},"modified":"2025-01-07T08:18:01","modified_gmt":"2025-01-06T23:18:01","slug":"redmine-azure-access-token-%ec%9d%b8%ec%a6%9d","status":"publish","type":"post","link":"https:\/\/engineer-chanpu.blog\/?p=6548","title":{"rendered":"MySQL for Flexible Server: Ubuntu \uc11c\ubc84 Redmine \uc124\uce58 \ubc0f Azure \uad00\ub9ac ID\ub97c \uc0ac\uc6a9\ud55c Access Token \uc778\uc99d \uad6c\ud604"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Purpose of the Post<\/h1>\n\n\n\n<p>\ud604\ub300 IT \ud658\uacbd\uc5d0\uc11c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ubcf4\uc548\uc740 \uadf8 \uc911\uc694\uc131\uc774 \uc810\uc810 \ucee4\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, \ud074\ub77c\uc6b0\ub4dc \ud658\uacbd\uc5d0\uc11c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uacfc \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac04\uc758 \uc548\uc804\ud55c \uc778\uc99d \uccb4\uacc4\ub97c \uad6c\ucd95\ud558\ub294 \uc77c\uc740 \ud544\uc218\uc801\uc785\ub2c8\ub2e4. Azure\uc5d0\uc11c\ub294 \uc774\ub97c \uc704\ud574 Managed Identity\uc640 Access Token \uc778\uc99d \ubc29\uc2dd\uc744 \uc81c\uacf5\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 \ube44\ubc00\ubc88\ud638 \uc5c6\uc774 \uc548\uc804\ud558\uac8c \ub9ac\uc18c\uc2a4\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc90d\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"575\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-18-1024x575.png\" alt=\"\" class=\"wp-image-6629\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-18-1024x575.png 1024w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-18-300x169.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-18-768x432.png 768w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-18-1536x863.png 1536w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-18.png 1940w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Entra ID AccessToken \uc778\uc99d \ud750\ub984<\/figcaption><\/figure>\n\n\n\n<p>\uc774\ubc88 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 Ubuntu \uae30\ubc18\uc758 VM\uc5d0\uc11c System Assigned Managed Identity\ub97c \ud65c\uc6a9\ud574 Azure MySQL Flexible Server\uc640 \uc548\uc804\ud558\uac8c \uc5f0\uacb0\ud558\ub294 \ubc29\ubc95\uc744 \ub2e4\ub8f9\ub2c8\ub2e4. \uc2e4\uc2b5\uc744 \ud1b5\ud574 \uc778\uc99d \uacfc\uc815\uc744 \ub2e8\uacc4\ubcc4\ub85c \uad6c\ud604\ud558\uba70, \uc774\ub97c \uc2e4\uc81c \ud658\uacbd\uc5d0\uc11c \ud65c\uc6a9\ud560 \uc218 \uc788\ub294 \ud301\uae4c\uc9c0 \ud568\uaed8 \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>Redmine \uc124\uce58\ub97c \uc704\ud574 \uc0ac\uc6a9\ub41c \ud14c\uc2a4\ud2b8 \ud658\uacbd\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\uc6b4\uc601 \uccb4\uc81c<\/strong>: Ubuntu 20.04 LTS (Virtual Machine)<\/li>\n\n\n\n<li><strong>Redmine \ubc84\uc804<\/strong>: 5.1-stable<\/li>\n\n\n\n<li><strong>Ruby \ubc84\uc804<\/strong>: 3.2.4<\/li>\n\n\n\n<li><strong>Apache \ubc84\uc804<\/strong>: 2.4<\/li>\n\n\n\n<li><strong>\ub370\uc774\ud130\ubca0\uc774\uc2a4<\/strong>: Azure MySQL Flexible Server<\/li>\n\n\n\n<li><strong>Azure CLI \ubc84\uc804<\/strong>: \ucd5c\uc2e0 \ubc84\uc804 (\uc124\uce58 \uacfc\uc815\uc5d0\uc11c \uc5c5\ub370\uc774\ud2b8)<\/li>\n<\/ul>\n\n\n\n<p>\uc774 \ud658\uacbd\uc740 VM\uc744 \ud65c\uc6a9\ud55c Azure MySQL Flexible Server\ub97c \uc870\ud569\ud574 \uad00\ub9ac ID\ub97c \uc774\uc6a9\ud55c \uc2dc\uc2a4\ud15c \uc778\uc99d \uc2dc\ub098\ub9ac\uc624\ub97c \uac80\uc99d\ud558\uae30 \uc704\ud574 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>Reference: <a href=\"https:\/\/blog.redmine.jp\/articles\/5_1\/install\/ubuntu24\/\">https:\/\/blog.redmine.jp\/articles\/5_1\/install\/ubuntu24\/<\/a><\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Ubuntu \ud658\uacbd \uad6c\ucd95<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Virtual Machine (Ubuntu) \uc900\ube44<\/h3>\n\n\n\n<p>Ubuntu \uc11c\ubc84 \uad6c\ucd95 \uac00\uc774\ub4dc\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \uc124\uc815\uc740 \uc194\uc9c1\ud788 \uc800\ub3c4 \uc798 \ubab0\ub77c\uc11c, \ubcf8 \ud3ec\uc2a4\ud2b8\uc5d0\uc11c\ub294 \uae30\ubcf8 \uc124\uce58 \uacfc\uc815\uc5d0\ub9cc \uc9d1\uc911\ud588\uc2b5\ub2c8\ub2e4. \ub124\ud2b8\uc6cc\ud06c \uc124\uc815\uc774 \uaf2c\uc774\uac70\ub098 GUI \ud658\uacbd\uc774 \ud544\uc694\ud558\uc2dc\ub2e4\uba74, Ubuntu \uacf5\uc2dd \ubb38\uc11c\ub098 \ub354 \ub611\ub611\ud55c \ubd84\ub4e4\uc758 \ube14\ub85c\uadf8\ub97c \ucc38\uace0\ud574\uc8fc\uc138\uc694. <\/p>\n\n\n\n<p class=\"has-text-align-center\">&#8220;\uc544\ub294 \ucc99\uc740 \uc8c4\uac00 \uc544\ub2d9\ub2c8\ub2e4\ub9cc, \ubaa8\ub974\uba74 \ub118\uaca8\uc57c\uc8e0!&#8221;<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Azure CLI \uc124\uce58<\/strong><\/h3>\n\n\n\n<p>Ubuntu \uc5d0\uc11c Azure CLI \ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud55c \uad00\ub828 \ud328\ud0a4\uc9c0 \uc124\uce58 \ubc0f \uc124\uc815\uc744 \uc9c4\ud589\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Update the list of available packages and their versions\nsudo apt update\n\n# Install required packages for adding a new repository securely\nsudo apt-get install -y ca-certificates curl apt-transport-https lsb-release gnupg\n\n# Download Microsoft's GPG key, convert it to the required format, and save it securely\ncurl -sL https:\/\/packages.microsoft.com\/keys\/microsoft.asc | gpg --dearmor | sudo tee \/usr\/share\/keyrings\/microsoft.gpg &gt; \/dev\/null\n\n# Add the Microsoft Azure CLI repository to the list of sources\necho &quot;deb [arch=amd64 signed-by=\/usr\/share\/keyrings\/microsoft.gpg] https:\/\/packages.microsoft.com\/repos\/azure-cli\/ $(lsb_release -cs) main&quot; | sudo tee \/etc\/apt\/sources.list.d\/azure-cli.list\n\n# Update the list of available packages again to include the newly added repository\nsudo apt update\n\n# Install the Azure CLI package\nsudo apt-get install -y azure-cli\n\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #88846F\"># Update the list of available packages and their versions<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apt<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">update<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Install required packages for adding a new repository securely<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apt-get<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">install<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-y<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">ca-certificates<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">curl<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apt-transport-https<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">lsb-release<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">gnupg<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Download Microsoft&#39;s GPG key, convert it to the required format, and save it securely<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">curl<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-sL<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">https:\/\/packages.microsoft.com\/keys\/microsoft.asc<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">gpg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--dearmor<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">tee<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/usr\/share\/keyrings\/microsoft.gpg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Add the Microsoft Azure CLI repository to the list of sources<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">echo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;deb [arch=amd64 signed-by=\/usr\/share\/keyrings\/microsoft.gpg] https:\/\/packages.microsoft.com\/repos\/azure-cli\/ $(<\/span><span style=\"color: #A6E22E\">lsb_release<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-cs<\/span><span style=\"color: #E6DB74\">) main&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">tee<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/etc\/apt\/sources.list.d\/azure-cli.list<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Update the list of available packages again to include the newly added repository<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apt<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">update<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Install the Azure CLI package<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apt-get<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">install<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-y<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">azure-cli<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\uc0ac\uc6a9 \uac00\ub2a5\ud55c \ud328\ud0a4\uc9c0 \ubaa9\ub85d\uacfc \ubc84\uc804\uc744 \uc5c5\ub370\uc774\ud2b8\n<ul class=\"wp-block-list\">\n<li>\uc2dc\uc2a4\ud15c\uc5d0 \uc124\uce58\ub41c \ud328\ud0a4\uc9c0 \ubaa9\ub85d\uacfc \uc800\uc7a5\uc18c\uc758 \ucd5c\uc2e0 \uc815\ubcf4\ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\uc0c8\ub85c\uc6b4 \uc800\uc7a5\uc18c\ub97c \uc548\uc804\ud558\uac8c \ucd94\uac00\ud558\uae30 \uc704\ud574 \ud544\uc694\ud55c \ud328\ud0a4\uc9c0 \uc124\uce58\n<ul class=\"wp-block-list\">\n<li><code>ca-certificates<\/code>, <code>curl<\/code>, <code>apt-transport-https<\/code>, <code>lsb-release<\/code>, <code>gnupg<\/code> \ud328\ud0a4\uc9c0\ub97c \uc124\uce58\ud558\uc5ec HTTPS\ub97c \ud1b5\ud55c \uc548\uc804\ud55c \uc800\uc7a5\uc18c \ucd94\uac00\ub97c \uc9c0\uc6d0\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Microsoft\uc758 GPG \ud0a4\ub97c \ub2e4\uc6b4\ub85c\ub4dc\ud558\uc5ec \ubcc0\ud658 \ud6c4 \uc548\uc804\ud558\uac8c \uc800\uc7a5\n<ul class=\"wp-block-list\">\n<li>Microsoft\uc758 GPG \ud0a4\ub97c \ub2e4\uc6b4\ub85c\ub4dc\ud558\uace0, <code>dearmor<\/code>\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubcc0\ud658\ud55c \ub4a4 <code>\/usr\/share\/keyrings\/microsoft.gpg<\/code> \uacbd\ub85c\uc5d0 \uc800\uc7a5\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Microsoft Azure CLI \uc800\uc7a5\uc18c\ub97c \uc18c\uc2a4 \ubaa9\ub85d\uc5d0 \ucd94\uac00\n<ul class=\"wp-block-list\">\n<li>Azure CLI \uc124\uce58\ub97c \uc704\ud574 Microsoft\uc758 Azure CLI \uc800\uc7a5\uc18c\ub97c <code>\/etc\/apt\/sources.list.d\/azure-cli.list<\/code> \ud30c\uc77c\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\uc0c8\ub85c \ucd94\uac00\ub41c \uc800\uc7a5\uc18c\ub97c \ud3ec\ud568\ud558\uc5ec \uc0ac\uc6a9 \uac00\ub2a5\ud55c \ud328\ud0a4\uc9c0 \ubaa9\ub85d \ub2e4\uc2dc \uc5c5\ub370\uc774\ud2b8\n<ul class=\"wp-block-list\">\n<li>Microsoft Azure CLI \uc800\uc7a5\uc18c\uc758 \ud328\ud0a4\uc9c0 \ubaa9\ub85d\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud558\uc5ec \uc2dc\uc2a4\ud15c\uc5d0 \ubc18\uc601\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Azure CLI \ud328\ud0a4\uc9c0 \uc124\uce58\n<ul class=\"wp-block-list\">\n<li>Azure CLI\ub97c \uc2dc\uc2a4\ud15c\uc5d0 \uc124\uce58\ud569\ub2c8\ub2e4. \uc774\ub294 Microsoft Azure\ub97c \uba85\ub839\uc904\uc5d0\uc11c \uad00\ub9ac\ud560 \uc218 \uc788\ub294 \ub3c4\uad6c\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Redmine \ud544\uc218 \ud328\ud0a4\uc9c0 \uc124\uce58<\/strong> <\/h3>\n\n\n\n<p><a href=\"https:\/\/blog.redmine.jp\/articles\/5_1\/install\/ubuntu24\/\">Redmine \uacf5\uc2dd \uac00\uc774\ub4dc<\/a>\ub97c \ucc38\uace0\ud574 \ud544\uc694\ud55c \ud328\ud0a4\uc9c0\ub97c \uc124\uce58\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Install essential build tools and libraries needed for compiling software\nsudo apt install -y build-essential zlib1g-dev libssl-dev libreadline-dev libyaml-dev libcurl4-openssl-dev libffi-dev\n\n# Install PostgreSQL, development libraries, Apache server, and related tools\nsudo apt install -y postgresql libpq-dev apache2 apache2-dev subversion git\n\n# Download the Ruby source archive\ncurl -O https:\/\/cache.ruby-lang.org\/pub\/ruby\/3.2\/ruby-3.2.4.tar.gz\n\n# Extract the downloaded Ruby archive\ntar xvf ruby-3.2.4.tar.gz\n\n# Navigate into the extracted Ruby source directory\ncd ruby-3.2.4\n\n# Configure the Ruby build without documentation to reduce installation size\n.\/configure --disable-install-doc\n\n# Compile the Ruby source code\nmake\n\n# Install the compiled Ruby binaries\nsudo make install\n\n# Verify the installed Ruby version\nruby -v\n\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #88846F\"># Install essential build tools and libraries needed for compiling software<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apt<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">install<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-y<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">build-essential<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">zlib1g-dev<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">libssl-dev<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">libreadline-dev<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">libyaml-dev<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">libcurl4-openssl-dev<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">libffi-dev<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Install PostgreSQL, development libraries, Apache server, and related tools<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apt<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">install<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-y<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">postgresql<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">libpq-dev<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apache2<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apache2-dev<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">subversion<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">git<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Download the Ruby source archive<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">curl<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-O<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">https:\/\/cache.ruby-lang.org\/pub\/ruby\/3.2\/ruby-3.2.4.tar.gz<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Extract the downloaded Ruby archive<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">tar<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">xvf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">ruby-3.2.4.tar.gz<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Navigate into the extracted Ruby source directory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">cd<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">ruby-3.2.4<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Configure the Ruby build without documentation to reduce installation size<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">.\/configure<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--disable-install-doc<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Compile the Ruby source code<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">make<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Install the compiled Ruby binaries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">make<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">install<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Verify the installed Ruby version<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">ruby<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-v<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\uc18c\ud504\ud2b8\uc6e8\uc5b4\ub97c \ucef4\ud30c\uc77c\ud558\ub294 \ub370 \ud544\uc694\ud55c \ud544\uc218 \ube4c\ub4dc \ub3c4\uad6c\uc640 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc124\uce58\n<ul class=\"wp-block-list\">\n<li><code>build-essential<\/code>, <code>zlib1g-dev<\/code>, <code>libssl-dev<\/code>, <code>libreadline-dev<\/code>, <code>libyaml-dev<\/code>, <code>libcurl4-openssl-dev<\/code>, <code>libffi-dev<\/code> \ud328\ud0a4\uc9c0\ub97c \uc124\uce58\ud569\ub2c8\ub2e4. \uc774\ub4e4\uc740 \uc18c\uc2a4 \ucf54\ub4dc\ub97c \ucef4\ud30c\uc77c\ud558\uace0 \ube4c\ub4dc\ud558\ub294 \ub370 \ud544\uc218\uc801\uc778 \ub3c4\uad6c\uc640 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>PostgreSQL, \uac1c\ubc1c \ub77c\uc774\ube0c\ub7ec\ub9ac, Apache \uc11c\ubc84 \ubc0f \uad00\ub828 \ub3c4\uad6c \uc124\uce58\n<ul class=\"wp-block-list\">\n<li><code>postgresql<\/code>, <code>libpq-dev<\/code> (PostgreSQL \uac1c\ubc1c \ub77c\uc774\ube0c\ub7ec\ub9ac), <code>apache2<\/code> (Apache \uc6f9 \uc11c\ubc84), <code>apache2-dev<\/code> (Apache \ubaa8\ub4c8 \uac1c\ubc1c \ub3c4\uad6c), <code>subversion<\/code> (SVN), <code>git<\/code> \ub4f1\uc744 \uc124\uce58\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Ruby \uc18c\uc2a4 \ucf54\ub4dc \uc544\uce74\uc774\ube0c \ub2e4\uc6b4\ub85c\ub4dc\n<ul class=\"wp-block-list\">\n<li>Ruby 3.2.4 \uc18c\uc2a4 \ucf54\ub4dc\ub97c \uacf5\uc2dd Ruby \uc800\uc7a5\uc18c\uc5d0\uc11c \ub2e4\uc6b4\ub85c\ub4dc\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\ub2e4\uc6b4\ub85c\ub4dc\ud55c Ruby \uc544\uce74\uc774\ube0c \uc555\ucd95 \ud574\uc81c\n<ul class=\"wp-block-list\">\n<li>\ub2e4\uc6b4\ub85c\ub4dc\ub41c <code>ruby-3.2.4.tar.gz<\/code> \ud30c\uc77c\uc758 \uc555\ucd95\uc744 \ud574\uc81c\ud558\uc5ec Ruby \uc18c\uc2a4 \ub514\ub809\ud130\ub9ac\ub97c \ub9cc\ub4ed\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\uc555\ucd95 \ud574\uc81c\ub41c Ruby \uc18c\uc2a4 \ub514\ub809\ud130\ub9ac\ub85c \uc774\ub3d9\n<ul class=\"wp-block-list\">\n<li>\uc555\ucd95 \ud574\uc81c\ub41c <code>ruby-3.2.4<\/code> \ub514\ub809\ud130\ub9ac\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Ruby \ube4c\ub4dc \uc124\uc815 (\uc124\uce58 \ud06c\uae30\ub97c \uc904\uc774\uae30 \uc704\ud574 \ubb38\uc11c \ube44\ud65c\uc131\ud654)\n<ul class=\"wp-block-list\">\n<li>Ruby \ube4c\ub4dc\ub97c \uc124\uc815\ud558\uba74\uc11c \uc124\uce58 \ud06c\uae30\ub97c \uc904\uc774\uae30 \uc704\ud574 \ubb38\uc11c\ub97c \ube44\ud65c\uc131\ud654\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Ruby \uc18c\uc2a4 \ucf54\ub4dc \ucef4\ud30c\uc77c\n<ul class=\"wp-block-list\">\n<li>\uc18c\uc2a4 \ucf54\ub4dc\ub97c \ucef4\ud30c\uc77c\ud558\uc5ec \uc2e4\ud589 \uac00\ub2a5\ud55c \ud30c\uc77c\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\ucef4\ud30c\uc77c\ub41c Ruby \ubc14\uc774\ub108\ub9ac \uc124\uce58\n<ul class=\"wp-block-list\">\n<li>\ucef4\ud30c\uc77c\ub41c Ruby\ub97c \uc2dc\uc2a4\ud15c\uc5d0 \uc124\uce58\ud558\uc5ec \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \uc124\uc815\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\uc124\uce58\ub41c Ruby \ubc84\uc804 \ud655\uc778\n<ul class=\"wp-block-list\">\n<li>\uc124\uce58\ub41c Ruby\uc758 \ubc84\uc804\uc744 \ud655\uc778\ud558\uc5ec \uc815\uc0c1\uc801\uc73c\ub85c \uc124\uce58\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Redmine \uc124\uce58<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Create a directory for Redmine data\nsudo mkdir \/var\/lib\/redmine\n\n# Change the ownership of the Redmine directory to the www-data user\nsudo chown www-data \/var\/lib\/redmine\n\n# Install Subversion (SVN) version control system\nsudo apt-get install -y subversion\n\n# Checkout the stable branch of Redmine source code as the www-data user\nsudo -u www-data svn co https:\/\/svn.redmine.org\/redmine\/branches\/5.1-stable \/var\/lib\/redmine\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #88846F\"># Create a directory for Redmine data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">mkdir<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/var\/lib\/redmine<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Change the ownership of the Redmine directory to the www-data user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">chown<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">www-data<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/var\/lib\/redmine<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Install Subversion (SVN) version control system<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apt-get<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">install<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-y<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">subversion<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Checkout the stable branch of Redmine source code as the www-data user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-u<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">www-data<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">svn<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">co<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">https:\/\/svn.redmine.org\/redmine\/branches\/5.1-stable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/var\/lib\/redmine<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Redmine \ub370\uc774\ud130\ub97c \uc704\ud55c \ub514\ub809\ud130\ub9ac\ub97c \uc0dd\uc131\n<ul class=\"wp-block-list\">\n<li>Redmine \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\uae30 \uc704\ud574 <code>\/var\/lib\/redmine<\/code> \uacbd\ub85c\uc5d0 \ub514\ub809\ud130\ub9ac\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Redmine \ub514\ub809\ud130\ub9ac\uc758 \uc18c\uc720\uad8c\uc744 www-data \uc0ac\uc6a9\uc790\ub85c \ubcc0\uacbd\n<ul class=\"wp-block-list\">\n<li>\uc6f9 \uc11c\ubc84 \uc0ac\uc6a9\uc790(www-data)\uac00 Redmine \ub514\ub809\ud130\ub9ac\uc5d0 \uc561\uc138\uc2a4\ud560 \uc218 \uc788\ub3c4\ub85d \uc18c\uc720\uad8c\uc744 \ubcc0\uacbd\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Subversion (SVN) \ubc84\uc804 \uad00\ub9ac \uc2dc\uc2a4\ud15c \uc124\uce58\n<ul class=\"wp-block-list\">\n<li>Redmine \uc18c\uc2a4 \ucf54\ub4dc\ub97c \ub2e4\uc6b4\ub85c\ub4dc\ud558\uae30 \uc704\ud574 Subversion\uc744 \uc124\uce58\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>www-data \uc0ac\uc6a9\uc790\ub85c Redmine \uc18c\uc2a4 \ucf54\ub4dc \uc548\uc815 \ubc84\uc804 \uccb4\ud06c\uc544\uc6c3\n<ul class=\"wp-block-list\">\n<li>www-data \uc0ac\uc6a9\uc790 \uad8c\ud55c\uc73c\ub85c Redmine 5.1 \uc548\uc815 \ube0c\ub79c\uce58 \uc18c\uc2a4 \ucf54\ub4dc\ub97c \uc9c0\uc815\ub41c \ub514\ub809\ud130\ub9ac\uc5d0 \ub2e4\uc6b4\ub85c\ub4dc\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Gem \ud328\ud0a4\uc9c0 \uc124\uce58 \ubc0f \ucd08\uae30 \uc124\uc815<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Navigate to the Redmine directory\ncd \/var\/lib\/redmine\n\n# Configure the bundle to exclude development and test environments\nsudo bundle config set --local without 'development test'\n\n# Install all required Ruby gems for the application\nsudo bundle install\n\n# Generate a secret token for Redmine\nsudo -u www-data bin\/rake generate_secret_token\n\n# Run database migrations in the production environment\nsudo -u www-data RAILS_ENV=production bin\/rake db:migrate\n\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #88846F\"># Navigate to the Redmine directory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">cd<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/var\/lib\/redmine<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Configure the bundle to exclude development and test environments<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">bundle<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">config<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--local<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">without<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;development test&#39;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Install all required Ruby gems for the application<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">bundle<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">install<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Generate a secret token for Redmine<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-u<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">www-data<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">bin\/rake<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">generate_secret_token<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Run database migrations in the production environment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-u<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">www-data<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">RAILS_ENV=production<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">bin\/rake<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">db:migrate<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Redmine \ub514\ub809\ud130\ub9ac\ub85c \uc774\ub3d9\n<ul class=\"wp-block-list\">\n<li><code>\/var\/lib\/redmine<\/code> \ub514\ub809\ud130\ub9ac\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\ubc88\ub4e4 \uc124\uc815\uc5d0\uc11c \uac1c\ubc1c \ubc0f \ud14c\uc2a4\ud2b8 \ud658\uacbd \uc81c\uc678\n<ul class=\"wp-block-list\">\n<li>\ubc88\ub4e4 \uc124\uc815\uc744 \ub85c\uceec\ub85c \ubcc0\uacbd\ud558\uc5ec <code>development<\/code> \ubc0f <code>test<\/code> \ud658\uacbd\uc5d0 \ud544\uc694\ud55c \ud328\ud0a4\uc9c0\ub97c \uc81c\uc678\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \ud544\uc694\ud55c Ruby \uc82c \uc124\uce58\n<ul class=\"wp-block-list\">\n<li>Redmine \uc2e4\ud589\uc5d0 \ud544\uc694\ud55c \ubaa8\ub4e0 Ruby \uc82c\uc744 \uc124\uce58\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Redmine\uc758 \ube44\ubc00 \ud1a0\ud070 \uc0dd\uc131\n<ul class=\"wp-block-list\">\n<li>Redmine \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uace0\uc720\ud55c \ube44\ubc00 \ud1a0\ud070\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\ud504\ub85c\ub355\uc158 \ud658\uacbd\uc5d0\uc11c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub9c8\uc774\uadf8\ub808\uc774\uc158 \uc2e4\ud589\n<ul class=\"wp-block-list\">\n<li><code>RAILS_ENV=production<\/code> \uc124\uc815\uc73c\ub85c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uad6c\uc870\ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Apache, Passenger \uc124\uce58 \ubc0f \uc124\uc815<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Install the Passenger gem without documentation\nsudo gem install passenger -N\n\n# Automatically install the Passenger Apache2 module with Ruby support\nsudo passenger-install-apache2-module --auto --languages ruby\n\n# Display the configuration snippet to integrate Passenger with Apache2\npassenger-install-apache2-module --snippet\n\n# Edit the Apache2 configuration file for Redmine\nsudo vi \/etc\/apache2\/conf-available\/redmine.conf\n\n# Enable the Redmine Apache2 configuration\nsudo a2enconf redmine\n\n# Reload the Apache2 service to apply changes\nsudo systemctl reload apache2\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #88846F\"># Install the Passenger gem without documentation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">gem<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">install<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">passenger<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-N<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Automatically install the Passenger Apache2 module with Ruby support<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">passenger-install-apache2-module<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--auto<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--languages<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">ruby<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Display the configuration snippet to integrate Passenger with Apache2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">passenger-install-apache2-module<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--snippet<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Edit the Apache2 configuration file for Redmine<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">vi<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/etc\/apache2\/conf-available\/redmine.conf<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Enable the Redmine Apache2 configuration<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">a2enconf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">redmine<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Reload the Apache2 service to apply changes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">systemctl<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">reload<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apache2<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Passenger Gem \uc124\uce58\n<ul class=\"wp-block-list\">\n<li><code>passenger<\/code>\ub294 Ruby \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc704\ud55c \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc11c\ubc84\ub85c, \uc774\ub97c \uc124\uce58\ud569\ub2c8\ub2e4. <code>-N<\/code> \uc635\uc158\uc740 \ubb38\uc11c \uc0dd\uc131\uc744 \uc0dd\ub7b5\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Apache2\uc6a9 Passenger \ubaa8\ub4c8 \uc124\uce58 \ubc0f Ruby \uc5b8\uc5b4 \uc9c0\uc6d0 \uc124\uc815\n<ul class=\"wp-block-list\">\n<li>Passenger\ub97c Apache2 \uc6f9 \uc11c\ubc84 \ubaa8\ub4c8\ub85c \uc124\uce58\ud558\uace0, Ruby \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc9c0\uc6d0\ud558\ub3c4\ub85d \uc790\ub3d9\uc73c\ub85c \uc124\uc815\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Apache \uc124\uc815\uc5d0 \ud544\uc694\ud55c Passenger \ubaa8\ub4c8 \ucf54\ub4dc \uc2a4\ub2c8\ud3ab \ucd9c\ub825\n<ul class=\"wp-block-list\">\n<li>Apache2 \uc124\uc815\uc5d0 \ucd94\uac00\ud574\uc57c \ud560 Passenger \uad00\ub828 \uc2a4\ub2c8\ud3ab \ucf54\ub4dc\ub97c \ucd9c\ub825\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Apache \uc124\uc815 \ud30c\uc77c \uc0dd\uc131 \ubc0f \uc218\uc815\n<ul class=\"wp-block-list\">\n<li><code>\/etc\/apache2\/conf-available\/redmine.conf<\/code> \ud30c\uc77c\uc744 \uc0dd\uc131\ud558\uace0 Redmine \uc11c\ubc84\ub97c \uc124\uc815\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Apache2\uc5d0\uc11c Redmine \uc124\uc815 \ud65c\uc131\ud654\n<ul class=\"wp-block-list\">\n<li><code>a2enconf<\/code> \uba85\ub839\uc744 \uc0ac\uc6a9\ud558\uc5ec Redmine \uc124\uc815\uc744 Apache2\uc5d0 \ud65c\uc131\ud654\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Apache2 \uc11c\ubc84 \uc7ac\uc2dc\uc791\n<ul class=\"wp-block-list\">\n<li>Apache \uc124\uc815 \ubcc0\uacbd \uc0ac\ud56d\uc744 \ubc18\uc601\ud558\uae30 \uc704\ud574 Apache2 \uc11c\ubc84\ub97c \ub2e4\uc2dc \ub85c\ub4dc\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">\ucc38\uace0# redmine.conf \uad6c\ubb38 \uc5d0\ub7ec<\/h4>\n\n\n\n<p>(\uc6d0\uc778: \ucd5c\uc2e0 \ubc84\uc804\uc778 passenger-6.0.23 \uc774 \uc124\uce58\ub418\uc5b4 \uc788\uc5c8\uae30 \ub54c\ubb38\uc5d0 redmine.conf \uacbd\ub85c\uac00 \uc798\ubabb\ub418\uc5c8\ub2e4.)<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"apache2ctl configtest\nsudo vi redmine.conf\nsudo systemctl reload apache2\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #A6E22E\">apache2ctl<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">configtest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">vi<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">redmine.conf<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">systemctl<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">reload<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apache2<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Apache2 \uc124\uc815 \ud14c\uc2a4\ud2b8\n<ul class=\"wp-block-list\">\n<li><code>configtest<\/code> \uba85\ub839\uc740 Apache \uc124\uc815 \ud30c\uc77c\uc5d0 \ubb38\ubc95 \uc624\ub958\uac00 \uc5c6\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\ucd9c\ub825 \uacb0\uacfc\uac00 <code>Syntax OK<\/code>\ub77c\uba74 \uc124\uc815\uc5d0 \ubb38\uc81c\uac00 \uc5c6\uc74c\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"90\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-12-1024x90.png\" alt=\"\" class=\"wp-image-6597\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-12-1024x90.png 1024w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-12-300x26.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-12-768x67.png 768w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-12.png 1086w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">passenger-6.0.22 \uacbd\ub85c \uad00\ub828 \uad6c\ubb38 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd<\/figcaption><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"933\" height=\"516\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-14.png\" alt=\"\" class=\"wp-image-6599\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-14.png 933w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-14-300x166.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-14-768x425.png 768w\" sizes=\"auto, (max-width: 933px) 100vw, 933px\" \/><figcaption class=\"wp-element-caption\">passenger-6.0.23 \ub85c \uacbd\ub85c\ub97c \uc218\uc815<\/figcaption><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Apache \ub97c Redmine \uc804\uc6a9\uc73c\ub85c \uc124\uc815<\/h3>\n\n\n\n<p>\uae30\ubcf8\uc801\uc73c\ub85c Apache\uc758 \uae30\ubcf8 \uacbd\ub85c\ub294 <code>\/var\/www\/html<\/code>\ub85c \uc124\uc815\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c Redmine\uc758 <code>public<\/code> \ub514\ub809\ud1a0\ub9ac\ub85c \ubcc0\uacbd\ud558\uc5ec Apache\ub97c Redmine \uc804\uc6a9 \uc6f9 \uc11c\ubc84\ub85c \uad6c\uc131\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Move to the Apache2 sites-enabled directory\ncd \/etc\/apache2\/sites-enabled\n\n# Create a backup of the current default configuration file\nsudo cp -p 000-default.conf 000-default.conf.bak\n\n# Edit the default configuration file\nsudo vi 000-default.conf\n\n# Test the Apache2 configuration for syntax errors\napache2ctl configtest\n\n# Reload the Apache2 service to apply the changes\nsudo systemctl reload apache2\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #88846F\"># Move to the Apache2 sites-enabled directory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">cd<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/etc\/apache2\/sites-enabled<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Create a backup of the current default configuration file<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">cp<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-p<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">000<\/span><span style=\"color: #E6DB74\">-default.conf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">000<\/span><span style=\"color: #E6DB74\">-default.conf.bak<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Edit the default configuration file<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">vi<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">000<\/span><span style=\"color: #E6DB74\">-default.conf<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Test the Apache2 configuration for syntax errors<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">apache2ctl<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">configtest<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Reload the Apache2 service to apply the changes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">systemctl<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">reload<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apache2<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Apache2 sites-enabled \ub514\ub809\ud1a0\ub9ac\ub85c \uc774\ub3d9\n<ul class=\"wp-block-list\">\n<li><code>sites-enabled<\/code> \ub514\ub809\ud1a0\ub9ac\uc5d0\ub294 Apache2\uc5d0\uc11c \ud65c\uc131\ud654\ub41c \uac00\uc0c1 \ud638\uc2a4\ud2b8 \uc124\uc815 \ud30c\uc77c\uc774 \uc704\uce58\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\uae30\ubcf8 \uc124\uc815 \ud30c\uc77c\uc758 \ubc31\uc5c5 \uc0dd\uc131\n<ul class=\"wp-block-list\">\n<li><code>cp -p<\/code> \uc635\uc158\uc740 \uc6d0\ubcf8 \ud30c\uc77c\uc758 \uc18c\uc720\uad8c, \uad8c\ud55c, \ud0c0\uc784\uc2a4\ud0ec\ud504\ub97c \uc720\uc9c0\ud558\uba74\uc11c \ubc31\uc5c5 \ud30c\uc77c\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><code>000-default.conf.bak<\/code> \ud30c\uc77c\uc774 \uae30\uc874 \uc124\uc815\uc758 \uc548\uc804\ud55c \ubcf5\uc0ac\ubcf8\uc73c\ub85c \uc800\uc7a5\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\uae30\ubcf8 \uc124\uc815 \ud30c\uc77c \uc218\uc815\n<ul class=\"wp-block-list\">\n<li><code>vi<\/code> \ud3b8\uc9d1\uae30\ub97c \uc0ac\uc6a9\ud558\uc5ec <code>000-default.conf<\/code> \ud30c\uc77c\uc744 \uc5fd\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Apache2 \uc124\uc815 \ud30c\uc77c\uc758 \ubb38\ubc95 \uc624\ub958\ub97c \ud655\uc778<\/li>\n\n\n\n<li>\ubcc0\uacbd\ub41c \uc124\uc815\uc744 \uc801\uc6a9\ud558\uae30 \uc704\ud574 Apache2 \uc11c\ube44\uc2a4\ub97c \ub9ac\ub85c\ub4dc<\/li>\n<\/ol>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">\ucc38\uace0# 000-default.conf \uc124\uc815 \uc608\uc2dc<\/h4>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"&lt;VirtualHost *:80&gt;\n    ServerAdmin webmaster@localhost\n    DocumentRoot \/var\/www\/html\n    ErrorLog ${APACHE_LOG_DIR}\/error.log\n    CustomLog ${APACHE_LOG_DIR}\/access.log combined\n\n    # Redmine Path\n    Alias \/redmine \/path\/to\/redmine\/public\n    &lt;Directory \/path\/to\/redmine\/public&gt;\n        Require all granted\n        Options -MultiViews\n    &lt;\/Directory&gt;\n&lt;\/VirtualHost&gt;\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">&lt;VirtualHost *:80&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    ServerAdmin webmaster@localhost<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    DocumentRoot \/var\/www\/html<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    ErrorLog ${APACHE_LOG_DIR}\/error.<\/span><span style=\"color: #66D9EF\">log<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    CustomLog ${APACHE_LOG_DIR}\/access.<\/span><span style=\"color: #66D9EF\">log<\/span><span style=\"color: #F8F8F2\"> combined<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># Redmine Path<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    Alias \/redmine \/path\/to\/redmine\/public<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    &lt;Directory \/path\/to\/redmine\/public&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        Require all granted<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        Options -MultiViews<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    &lt;\/Directory&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">&lt;\/VirtualHost&gt;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">MySQL \ud074\ub77c\uc774\uc5b8\ud2b8 \uc124\uce58<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Install the MySQL client core version 8.0\n# Includes essential MySQL client utilities for interacting with a MySQL server\nsudo apt install mysql-client-core-8.0\n\n# Install the MySQL client development library\n# Provides headers and libraries needed for compiling and linking MySQL-based applications\nsudo apt-get install -y libmysqlclient-dev\n\n# Change to the Redmine directory\ncd \/var\/lib\/redmine\n\n# Configure the Bundler to exclude development and test groups\n# This ensures only production dependencies are installed\nsudo bundle config set --local without 'development test'\n\n# Install the required gems for Redmine\nsudo bundle install\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #88846F\"># Install the MySQL client core version 8.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Includes essential MySQL client utilities for interacting with a MySQL server<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apt<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">install<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">mysql-client-core-8.0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Install the MySQL client development library<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Provides headers and libraries needed for compiling and linking MySQL-based applications<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apt-get<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">install<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-y<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">libmysqlclient-dev<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Change to the Redmine directory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">cd<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/var\/lib\/redmine<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Configure the Bundler to exclude development and test groups<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># This ensures only production dependencies are installed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">bundle<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">config<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--local<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">without<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;development test&#39;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Install the required gems for Redmine<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">bundle<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">install<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li>MySQL \ud074\ub77c\uc774\uc5b8\ud2b8 \ucf54\uc5b4 \ud328\ud0a4\uc9c0\ub97c \uc124\uce58\ud569\ub2c8\ub2e4.\n<ul class=\"wp-block-list\">\n<li>\uc774 \ud328\ud0a4\uc9c0\ub294 MySQL \uc11c\ubc84\uc640 \ud1b5\uc2e0\ud560 \uc218 \uc788\ub294 \uae30\ubcf8 \ud074\ub77c\uc774\uc5b8\ud2b8 \ud504\ub85c\uadf8\ub7a8 (<code>mysql<\/code>\uba85\ub839 \ub4f1)\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>MySQL \ud074\ub77c\uc774\uc5b8\ud2b8 \uac1c\ubc1c \ub77c\uc774\ube0c\ub7ec\ub9ac \ubc0f \ud5e4\ub354 \ud30c\uc77c\uc744 \uc124\uce58\ud569\ub2c8\ub2e4.\n<ul class=\"wp-block-list\">\n<li>MySQL API\ub97c \uc0ac\uc6a9\ud558\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uac1c\ubc1c\ud558\uac70\ub098 \ucef4\ud30c\uc77c\ud560 \ub54c \ud544\uc694\ud55c \ud328\ud0a4\uc9c0\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Bundler\ub97c \uc124\uc815\ud558\uc5ec \uac1c\ubc1c \ubc0f \ud14c\uc2a4\ud2b8 \uc885\uc18d\uc131 \uc124\uce58 \uc81c\uc678\n<ul class=\"wp-block-list\">\n<li>\ud504\ub85c\ub355\uc158 \ud658\uacbd\uc5d0\uc11c \ud544\uc694\ud55c \ud328\ud0a4\uc9c0\ub9cc \uc124\uce58\ud558\ub3c4\ub85d \uad6c\uc131\ud558\uc5ec \ubd88\ud544\uc694\ud55c \ud328\ud0a4\uc9c0 \uc124\uce58\ub97c \uc904\uc774\uace0 \ubc30\ud3ec \uc911 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub294 \ucda9\ub3cc\uc744 \ubc29\uc9c0\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\ud544\uc694\ud55c Ruby gem \uc124\uce58\n<ul class=\"wp-block-list\">\n<li>Gemfile\uc5d0 \uc9c0\uc815\ub41c \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ub2e4\uc6b4\ub85c\ub4dc \ubc0f \uc124\uce58\ud558\uc5ec \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uc6d0\ud65c\ud788 \uc2e4\ud589\ub418\ub294 \ub370 \ud544\uc694\ud55c \ubaa8\ub4e0 \uc885\uc18d\uc131\uc744 \ucda9\uc871\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Azure \ud658\uacbd \uad6c\ucd95<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">MySQL User Assigned Managed ID \uc0dd\uc131<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"208\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-15-1024x208.png\" alt=\"\" class=\"wp-image-6623\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-15-1024x208.png 1024w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-15-300x61.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-15-768x156.png 768w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-15.png 1372w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Entra ID \uc11c\ube44\uc2a4 \uc8fc\uccb4 \uc77d\uae30 \uc804\uc6a9<\/figcaption><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Ubuntu VM System Managed ID \uc720\ud6a8\ud654<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"367\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-20-1024x367.png\" alt=\"\" class=\"wp-image-6634\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-20-1024x367.png 1024w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-20-300x108.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-20-768x276.png 768w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-20.png 1168w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Status \ub97c On \uc73c\ub85c \ubcc0\uacbd<\/figcaption><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">\ubcf4\uc548 \uadf8\ub8f9 \uc0dd\uc131 \ubc0f \uba64\ubc84 \ucd94\uac00<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"299\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-22-1024x299.png\" alt=\"\" class=\"wp-image-6636\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-22-1024x299.png 1024w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-22-300x88.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-22-768x225.png 768w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-22.png 1460w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Ubuntu \uc758 System Assigned Managed ID \ub97c \uba64\ubc84\uc5d0 \ucd94\uac00<\/figcaption><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">MySQL \uc778\uc99d \ubc29\uc2dd \ubc0f \uad00\ub9ac\uc790 \uc124\uc815<\/h3>\n\n\n\n<p>Microsoft Entra Admins \uc124\uc815\uc744 \uc800\uc7a5\ud558\uba74 \uc790\ub3d9\uc801\uc73c\ub85c MySQL DB\uc5d0 \uc720\uc800 <code>(Entra ID Authentication= aad_auth)<\/code> \uac00 \ucd94\uac00\ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"467\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-19-1024x467.png\" alt=\"\" class=\"wp-image-6633\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-19-1024x467.png 1024w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-19-300x137.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-19-768x350.png 768w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-19.png 1418w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">MySQL Authentication \uc124\uc815<\/figcaption><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">\ucc38\uace0# \uad00\ub9ac\uc790\ub85c \uc811\uc18d\ud558\ub294 \uacbd\uc6b0<\/h4>\n\n\n\n<p>Microsoft Entra Admins \uc5d0 \uc124\uc815\ud55c \uadf8\ub8f9\uc5d0 \uc720\uc800 \uacc4\uc815\uc744 \ucd94\uac00\ud55c \ud6c4 \uc544\ub798\uc758 \uba85\ub839\uc5b4\ub85c MySQL Server \uc5d0 \uc811\uc18d\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Login to Azure CLI\naz login\n\n# Retrieve the access token for the Azure MySQL server\nACCESS_TOKEN=$(az account get-access-token \\\n  --resource-type oss-rdbms \\\n  --query accessToken -o tsv)\n\n# Connect to the Azure MySQL server using the access token\nmysql -u &quot;mysql-admin&quot; \\\n  -h chanpu-mysql.mysql.database.azure.com \\\n  --enable-cleartext-plugin \\\n  --password=&quot;$ACCESS_TOKEN&quot;\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #88846F\"># Login to Azure CLI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">az<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">login<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Retrieve the access token for the Azure MySQL server<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">ACCESS_TOKEN<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">$(<\/span><span style=\"color: #A6E22E\">az<\/span><span style=\"color: #E6DB74\"> account get-access-token <\/span><span style=\"color: #AE81FF\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">  <\/span><span style=\"color: #AE81FF\">--resource-type<\/span><span style=\"color: #E6DB74\"> oss-rdbms <\/span><span style=\"color: #AE81FF\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">  <\/span><span style=\"color: #AE81FF\">--query<\/span><span style=\"color: #E6DB74\"> accessToken <\/span><span style=\"color: #AE81FF\">-o<\/span><span style=\"color: #E6DB74\"> tsv)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Connect to the Azure MySQL server using the access token<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">mysql<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-u<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;mysql-admin&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #AE81FF\">-h<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">chanpu-mysql.mysql.database.azure.com<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #AE81FF\">--enable-cleartext-plugin<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #AE81FF\">--password=<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$ACCESS_TOKEN<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>MySQL \uc5d0\uc11c Microsoft Entra Admins \uac00 \uc815\uc0c1\uc801\uc73c\ub85c \ucd94\uac00\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud558\ub824\uba74 \uc544\ub798\uc758 \uba85\ub839\uc5b4\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"SELECT user, host, plugin FROM mysql.user;\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #A6E22E\">SELECT<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">user,<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">host,<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">plugin<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">FROM<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">mysql.user<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Ubuntu \ud658\uacbd \uad6c\ucd95 #2<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">SSL \uc778\uc99d\uc11c \uc124\uce58 \ubc0f \uc124\uc815<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Download the SSL certificate and save it to the \/etc\/ssl\/certs\/ directory\nsudo wget https:\/\/www.digicert.com\/CACerts\/BaltimoreCyberTrustRoot.crt.pem -O \/etc\/ssl\/certs\/BaltimoreCyberTrustRoot.crt.pem\n\n# Verify the file permissions of the downloaded SSL certificate\nls -l \/etc\/ssl\/certs\/BaltimoreCyberTrustRoot.crt.pem # Expected: -rw-r--r-- 1 root root\n\n# Verify the directory permissions of the \/etc\/ssl\/certs\/ directory\nls -ld \/etc\/ssl\/certs\/ # Expected: drwxr-xr-x 2 root root\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #88846F\"># Download the SSL certificate and save it to the \/etc\/ssl\/certs\/ directory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">wget<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">https:\/\/www.digicert.com\/CACerts\/BaltimoreCyberTrustRoot.crt.pem<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-O<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/etc\/ssl\/certs\/BaltimoreCyberTrustRoot.crt.pem<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Verify the file permissions of the downloaded SSL certificate<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">ls<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-l<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/etc\/ssl\/certs\/BaltimoreCyberTrustRoot.crt.pem<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #88846F\"># Expected: -rw-r--r-- 1 root root<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Verify the directory permissions of the \/etc\/ssl\/certs\/ directory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">ls<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-ld<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/etc\/ssl\/certs\/<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #88846F\"># Expected: drwxr-xr-x 2 root root<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li>SSL \uc778\uc99d\uc11c \ub2e4\uc6b4\ub85c\ub4dc \ubc0f \uc800\uc7a5\n<ul class=\"wp-block-list\">\n<li>SSL \uc778\uc99d\uc11c\ub97c <code>wget<\/code> \uba85\ub839\uc5b4\ub85c \ub2e4\uc6b4\ub85c\ub4dc\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><code>-O<\/code> \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec <code>\/etc\/ssl\/certs\/<\/code> \ub514\ub809\ud1a0\ub9ac\uc5d0 \uc800\uc7a5\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\uc778\uc99d\uc11c \uc811\uadfc \uad8c\ud55c \ud655\uc778\n<ul class=\"wp-block-list\">\n<li>\uc815\uc0c1\uc801\uc778 \uad8c\ud55c \uc124\uc815: <code>-rw-r--r-- 1 root root<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\ub514\ub809\ud1a0\ub9ac \uc811\uadfc \uad8c\ud55c \ud655\uc778\n<ul class=\"wp-block-list\">\n<li>\uc815\uc0c1\uc801\uc778 \uad8c\ud55c \uc124\uc815: <code>drwxr-xr-x 2 root root<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Redmine \uc758 database.yml \uc218\uc815<\/h3>\n\n\n\n<p>Redmine \uc124\uce58 \ud6c4 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc124\uc815\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \uae30\ubcf8\uc801\uc73c\ub85c MySQL\uc774\ub098 PostgreSQL\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc73c\uba70, \uc774\ub97c \uc124\uc815\ud558\ub824\uba74 <code>database.yml<\/code> \ud30c\uc77c\uc744 \ud3b8\uc9d1\ud574\uc57c \ud569\ub2c8\ub2e4. \uc124\uc815\uc774 \uc644\ub8cc\ub41c \ud6c4, <code>rake db:migrate RAILS_ENV=production<\/code> \uba85\ub839\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \ucd08\uae30\ud654\ud558\uc138\uc694.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Navigate to the Redmine configuration directory\ncd \/var\/lib\/redmine\/config\n\n# List files related to database configuration\nls -l | grep -i database.yml\n\n# Edit the database configuration file\nsudo vi database.yml\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #88846F\"># Navigate to the Redmine configuration directory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">cd<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/var\/lib\/redmine\/config<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># List files related to database configuration<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">ls<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-l<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">grep<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-i<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">database.yml<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Edit the database configuration file<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">vi<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">database.yml<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">\ucc38\uace0# database.yml \uc608\uc2dc<\/h4>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"production:\n  adapter: mysql2\n  database: redmine\n  host: chanpu-mysql.mysql.database.azure.com\n  username: mysql-admin\n  password: &lt;%= ENV['ACCESS_TOKEN'] %&gt; # Access token retrieved from environment variable\n  encoding: utf8\n  port: 3306\n  ssl_mode: required\n  sslca: \/etc\/ssl\/certs\/BaltimoreCyberTrustRoot.crt.pem # SSL certificate for secure connection\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">production:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  adapter: mysql2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  database: redmine<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  host: chanpu-mysql.mysql.database.azure.com<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  username: mysql-admin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  password: &lt;%= <\/span><span style=\"color: #66D9EF\">ENV<\/span><span style=\"color: #F8F8F2\">[<\/span><span style=\"color: #E6DB74\">&#39;ACCESS_TOKEN&#39;<\/span><span style=\"color: #F8F8F2\">] %&gt; <\/span><span style=\"color: #88846F\"># Access token retrieved from environment variable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  encoding: utf8<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  port: 3306<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  ssl_mode: required<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  sslca: \/etc\/ssl\/certs\/BaltimoreCyberTrustRoot.crt.pem <\/span><span style=\"color: #88846F\"># SSL certificate for secure connection<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"949\" height=\"216\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-8.png\" alt=\"\" class=\"wp-image-6557\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-8.png 949w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-8-300x68.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-8-768x175.png 768w\" sizes=\"auto, (max-width: 949px) 100vw, 949px\" \/><figcaption class=\"wp-element-caption\">database.yml \uae30\uc785 \ucc38\uace0<\/figcaption><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Azure Access Token \ucde8\ub4dd \uc2a4\ud06c\ub9bd\ud2b8 \uc791\uc131<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"#!\/bin\/bash\n\n# 0. Login to Azure using managed identity\necho &quot;Logging in to Azure using managed identity...&quot;\naz login --identity --allow-no-subscriptions &gt; \/dev\/null 2&gt;&amp;1\n\n# Check login status\nif [ $? -ne 0 ]; then\n    echo -e &quot;\\n[Error] Failed to login to Azure. Ensure managed identity is enabled.\\n&quot;\n    exit 1\nfi\n\n# 1. Retrieve ACCESS_TOKEN using Azure CLI\necho &quot;Retrieving ACCESS_TOKEN...&quot;\nACCESS_TOKEN=$(az account get-access-token --resource-type oss-rdbms --query accessToken -o tsv | tr -d '\\n\\r')\n\n# 2. Validate the token\nif [ -z &quot;$ACCESS_TOKEN&quot; ]; then\n    echo -e &quot;\\n[Error] Failed to retrieve ACCESS_TOKEN. Check Azure CLI login.\\n&quot;\n    exit 1\nfi\necho &quot;ACCESS_TOKEN retrieved successfully.&quot;\n\n# 3. Set ACCESS_TOKEN as a system-wide environment variable\necho &quot;Setting ACCESS_TOKEN as a system-wide environment variable...&quot;\necho &quot;ACCESS_TOKEN=$ACCESS_TOKEN&quot; | sudo tee -a \/etc\/environment &gt; \/dev\/null\n\n# 4. Apply the environment variable\nsource \/etc\/environment\n\n# 5. Verify token access for www-data user\necho -e &quot;\\nVerifying ACCESS_TOKEN for www-data user...&quot;\nsudo -u www-data printenv ACCESS_TOKEN\n\nif [ $? -eq 0 ]; then\n    echo -e &quot;\\n[Success] ACCESS_TOKEN is accessible for www-data user.\\n&quot;\nelse\n    echo -e &quot;\\n[Error] Failed to access ACCESS_TOKEN for www-data user. Check the setup.\\n&quot;\nfi\n\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #88846F\">#!\/bin\/bash<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># 0. Login to Azure using managed identity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">echo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;Logging in to Azure using managed identity...&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">az<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">login<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--identity<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--allow-no-subscriptions<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">2&gt;&amp;1<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Check login status<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> [ <\/span><span style=\"color: #FD971F\">$?<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">-ne<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\"> ]; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">echo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-e<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;\\n[Error] Failed to login to Azure. Ensure managed identity is enabled.\\n&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">exit<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># 1. Retrieve ACCESS_TOKEN using Azure CLI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">echo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;Retrieving ACCESS_TOKEN...&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">ACCESS_TOKEN<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">$(<\/span><span style=\"color: #A6E22E\">az<\/span><span style=\"color: #E6DB74\"> account get-access-token <\/span><span style=\"color: #AE81FF\">--resource-type<\/span><span style=\"color: #E6DB74\"> oss-rdbms <\/span><span style=\"color: #AE81FF\">--query<\/span><span style=\"color: #E6DB74\"> accessToken <\/span><span style=\"color: #AE81FF\">-o<\/span><span style=\"color: #E6DB74\"> tsv <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #A6E22E\">tr<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-d<\/span><span style=\"color: #E6DB74\"> &#39;\\n\\r&#39;)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># 2. Validate the token<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> [ <\/span><span style=\"color: #F92672\">-z<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$ACCESS_TOKEN<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> ]; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">echo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-e<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;\\n[Error] Failed to retrieve ACCESS_TOKEN. Check Azure CLI login.\\n&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">exit<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">echo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;ACCESS_TOKEN retrieved successfully.&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># 3. Set ACCESS_TOKEN as a system-wide environment variable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">echo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;Setting ACCESS_TOKEN as a system-wide environment variable...&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">echo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;ACCESS_TOKEN=<\/span><span style=\"color: #F8F8F2\">$ACCESS_TOKEN<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">tee<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-a<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/etc\/environment<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># 4. Apply the environment variable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">source<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">\/etc\/environment<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># 5. Verify token access for www-data user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">echo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-e<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;\\nVerifying ACCESS_TOKEN for www-data user...&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-u<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">www-data<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">printenv<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">ACCESS_TOKEN<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> [ <\/span><span style=\"color: #FD971F\">$?<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">-eq<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\"> ]; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">echo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-e<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;\\n[Success] ACCESS_TOKEN is accessible for www-data user.\\n&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">echo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-e<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;\\n[Error] Failed to access ACCESS_TOKEN for www-data user. Check the setup.\\n&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc791\uc131\ud55c \ud6c4 <code>\/var\/lib\/redmine\/set_access_token.sh<\/code>\ub85c \uc800\uc7a5\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><code>chmod +x \/var\/lib\/redmine\/set_access_token.sh<\/code> \uba85\ub839\uc744 \ud1b5\ud574 \uc2e4\ud589 \uad8c\ud55c\uc744 \ubd80\uc5ec\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc2e4\ud589\ud558\uc5ec Azure Access Token\uc744 \ud658\uacbd \ubcc0\uc218\ub85c \uc124\uc815\ud558\uace0 \uc811\uadfc\uc744 \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><code>echo $ACCESS_TOKEN<\/code> \uba85\ub839\uc744 \ud1b5\ud574 \ud1a0\ud070 \ucde8\ub4dd \uacb0\uacfc\ub97c \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<\/ol>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"929\" height=\"910\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-7.png\" alt=\"\" class=\"wp-image-6556\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-7.png 929w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-7-300x294.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-7-768x752.png 768w\" sizes=\"auto, (max-width: 929px) 100vw, 929px\" \/><figcaption class=\"wp-element-caption\">\uc2a4\ud06c\ub9bd\ud2b8 \uae30\uc785 \ucc38\uace0<\/figcaption><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"924\" height=\"391\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-6.png\" alt=\"\" class=\"wp-image-6555\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-6.png 924w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-6-300x127.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-6-768x325.png 768w\" sizes=\"auto, (max-width: 924px) 100vw, 924px\" \/><figcaption class=\"wp-element-caption\">ACCESS_TOKEN \uac12 \ucc38\uace0<\/figcaption><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Cron\uc744 \uc774\uc6a9\ud55c \ud1a0\ud070 \uc8fc\uae30\uc801 \ucde8\ub4dd \uc124\uc815<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"*\/30 * * * * \/bin\/bash \/var\/lib\/redmine\/set_access_token.sh\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">\/30 <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\"> \/bin\/bash \/var\/lib\/redmine\/set_access_token.sh<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Crontab \ud3b8\uc9d1<\/strong>\n<ul class=\"wp-block-list\">\n<li><code>sudo crontab -e<\/code> \uba85\ub839\uc744 \uc2e4\ud589\ud558\uc5ec \ub8e8\ud2b8 \uc0ac\uc6a9\uc790\uc6a9 Crontab \ud30c\uc77c\uc744 \uc5fd\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>30\ubd84 \uac04\uaca9\uc73c\ub85c \uc2a4\ud06c\ub9bd\ud2b8 \uc2e4\ud589<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc544\ub798\uc758 \ub0b4\uc6a9\uc744 Crontab \ud30c\uc77c\uc5d0 \ucd94\uac00\ud558\uc5ec 30\ubd84\ub9c8\ub2e4 Access Token\uc744 \uac31\uc2e0\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"949\" height=\"480\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-9.png\" alt=\"\" class=\"wp-image-6558\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-9.png 949w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-9-300x152.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-9-768x388.png 768w\" sizes=\"auto, (max-width: 949px) 100vw, 949px\" \/><figcaption class=\"wp-element-caption\">Crontab \uc124\uc815 \ucc38\uace0<\/figcaption><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Redmine DB \ub9c8\uc774\uadf8\ub808\uc774\uc158<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Run database migrations for Redmine in production mode\n# Execute the command as the www-data user\n# Enable clear text password plugin for MySQL authentication (use in secure environments only)\nsudo -u www-data RAILS_ENV=production bin\/rake db:migrate LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=1\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #88846F\"># Run database migrations for Redmine in production mode<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Execute the command as the www-data user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Enable clear text password plugin for MySQL authentication (use in secure environments only)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-u<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">www-data<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">RAILS_ENV=production<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">bin\/rake<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">db:migrate<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=<\/span><span style=\"color: #AE81FF\">1<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>sudo -u www-data<\/code>\n<ul class=\"wp-block-list\">\n<li>www-data \uc0ac\uc6a9\uc790 \uad8c\ud55c\uc73c\ub85c \uba85\ub839\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\uc77c\ubc18\uc801\uc73c\ub85c \uc6f9 \uc11c\ubc84 \ubc0f \uad00\ub828 \uc791\uc5c5(\uc608: Redmine)\uc774 www-data \uc0ac\uc6a9\uc790\uc758 \uad8c\ud55c\uc73c\ub85c \uc2e4\ud589\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>RAILS_ENV=production<\/code>\n<ul class=\"wp-block-list\">\n<li>Rails \ud658\uacbd \ubcc0\uc218\ub97c production\uc73c\ub85c \uc124\uc815\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\uc774\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ud504\ub85c\ub355\uc158 \ud658\uacbd\uc5d0\uc11c \ub3d9\uc791\ud558\ub3c4\ub85d \uc124\uc815\ud558\uba70, \uac1c\ubc1c \ubc0f \ud14c\uc2a4\ud2b8 \ud658\uacbd\uacfc \uad6c\ubd84\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>bin\/rake db:migrate<\/code>\n<ul class=\"wp-block-list\">\n<li>Rake \uba85\ub839\uc744 \uc2e4\ud589\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub9c8\uc774\uadf8\ub808\uc774\uc158\uc744 \uc218\ud589\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><em>Redmine\uc5d0\uc11c \uc815\uc758\ub41c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc2a4\ud0a4\ub9c8 \ubcc0\uacbd \uc0ac\ud56d\uc744 \ubc18\uc601\ud569\ub2c8\ub2e4.<\/em><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=1<\/code>\n<ul class=\"wp-block-list\">\n<li>MySQL\uc5d0\uc11c \ud074\ub9ac\uc5b4 \ud14d\uc2a4\ud2b8 \ud328\uc2a4\uc6cc\ub4dc \uc778\uc99d \ud50c\ub7ec\uadf8\uc778\uc744 \ud65c\uc131\ud654\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><em>MySQL \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84 \uac04\uc5d0 \uc554\ud638\ud654\ub418\uc9c0 \uc54a\uc740 \ube44\ubc00\ubc88\ud638\ub97c \ud5c8\uc6a9\ud558\ub3c4\ub85d \uc124\uc815\ud569\ub2c8\ub2e4.<\/em><\/li>\n\n\n\n<li><strong>\uc8fc\uc758<\/strong>: \uc774 \uc124\uc815\uc740 \ubcf4\uc548\uc0c1\uc758 \uc704\ud5d8\uc774 \uc788\uc73c\ubbc0\ub85c \ubc18\ub4dc\uc2dc \uc548\uc804\ud55c \ub124\ud2b8\uc6cc\ud06c \ud658\uacbd\uc5d0\uc11c\ub9cc \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"944\" height=\"139\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-10.png\" alt=\"\" class=\"wp-image-6559\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-10.png 944w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-10-300x44.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-10-768x113.png 768w\" sizes=\"auto, (max-width: 944px) 100vw, 944px\" \/><figcaption class=\"wp-element-caption\">DB \ub9c8\uc774\uadf8\ub808\uc774\uc158 \ucc38\uace0<\/figcaption><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">MySQL DB \uc5f0\ub3d9 \uac80\uc99d<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\uc9c1\uc811 \uc811\uc18d \ud14c\uc2a4\ud2b8<\/strong>: <code>mysql -u<\/code> \uba85\ub839\uc5b4\ub85c MySQL\uc5d0 \uc9c1\uc811 \uc811\uc18d.<\/li>\n\n\n\n<li><strong>\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc124\uc815 \ud655\uc778<\/strong>: <code>database.yml<\/code> \ubc0f Rails \ucf58\uc194\uc5d0\uc11c \uc5f0\uacb0 \uc0c1\ud0dc \ud655\uc778.<\/li>\n\n\n\n<li><strong>DB \ub9c8\uc774\uadf8\ub808\uc774\uc158 \uc0c1\ud0dc<\/strong>: <code>rake db:migrate:status<\/code>\ub85c \ud655\uc778.<\/li>\n\n\n\n<li><strong>\ub85c\uadf8 \ud655\uc778<\/strong>: MySQL \ub85c\uadf8 \ubc0f \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub85c\uadf8\uc5d0\uc11c \ubb38\uc81c \ubc1c\uc0dd \uc5ec\ubd80 \ud655\uc778.<\/li>\n\n\n\n<li><strong>\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud14c\uc2a4\ud2b8<\/strong>: Redmine\uc5d0\uc11c \ub370\uc774\ud130 \uc870\ud68c \ubc0f \uc4f0\uae30 \uc791\uc5c5 \ud655\uc778.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"556\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-24-1024x556.png\" alt=\"\" class=\"wp-image-6673\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-24-1024x556.png 1024w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-24-300x163.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-24-768x417.png 768w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/12\/image-24.png 1147w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Redmine \ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131 \ud14c\uc2a4\ud2b8 \ucc38\uace0<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Purpose of the Post \ud604\ub300 IT \ud658\uacbd\uc5d0\uc11c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ubcf4\uc548\uc740 \uadf8 \uc911\uc694\uc131\uc774 \uc810\uc810 \ucee4\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, \ud074\ub77c\uc6b0\ub4dc \ud658\uacbd\uc5d0\uc11c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uacfc \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac04\uc758 \uc548\uc804\ud55c \uc778\uc99d \uccb4\uacc4\ub97c \uad6c\ucd95\ud558\ub294 \uc77c\uc740 \ud544\uc218\uc801\uc785\ub2c8\ub2e4. Azure\uc5d0\uc11c\ub294 \uc774\ub97c \uc704\ud574 Managed &#8230;<\/p>\n","protected":false},"author":1,"featured_media":6694,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[205,107,33],"tags":[197,123,179],"class_list":["post-6548","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-access-security","category-azure","category-tech-notes","tag-auth","tag-azure","tag-sql-database"],"_links":{"self":[{"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=\/wp\/v2\/posts\/6548","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6548"}],"version-history":[{"count":72,"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=\/wp\/v2\/posts\/6548\/revisions"}],"predecessor-version":[{"id":7454,"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=\/wp\/v2\/posts\/6548\/revisions\/7454"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=\/wp\/v2\/media\/6694"}],"wp:attachment":[{"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6548"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6548"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}