{"id":68,"date":"2026-10-14T01:01:18","date_gmt":"2026-10-14T01:01:18","guid":{"rendered":"https:\/\/dingdonghome.duckdns.org\/?p=68"},"modified":"2026-10-29T06:00:59","modified_gmt":"2026-10-29T06:00:59","slug":"caddy-postgresql","status":"publish","type":"post","link":"https:\/\/dingdong.goodday.ing\/?p=68","title":{"rendered":"[\uac1c\ubc1c\uc77c\uc9c0 #03 | \uc778\ud504\ub77c] \uc720\uadf8\ub9b0 NAS\uc5d0 Caddy &amp; PostgreSQL \uad6c\ucd95\ud558\uae30"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>\uce74\uce74\uc624\ud1a1 \uac19\uc740 \ud06c\ub85c\uc2a4\ud50c\ub7ab\ud3fc \uba54\uc2e0\uc800 &#8216;\ub529\ub3d9(DingDong)&#8217; \ub9cc\ub4e4\uae30 \ud504\ub85c\uc81d\ud2b8 3\ud0c4!<\/strong><br>\uc774\ubc88 \uae00\uc5d0\uc11c\ub294 \uc6b0\ub9ac \uc9d1 \uba54\uc778 \uc11c\ubc84\uc778 \uc720\uadf8\ub9b0(Ugreen) NAS(UGOS Pro)\uc758 Docker \ud658\uacbd \uc704\uc5d0, \uc2a4\ub9c8\ud2b8\ud3f0 \ubcf4\uc548 \ud1b5\uc2e0(HTTPS)\uacfc \ub3c4\uba54\uc778 \ub77c\uc6b0\ud305\uc758 \ub300\ubb38 \uc5ed\ud560\uc744 \ub9e1\uc744 <strong>Caddy \uc6f9\uc11c\ubc84<\/strong>\uc640 \uba54\uc2e0\uc800\uc758 \ud575\uc2ec \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc778 <strong>PostgreSQL 16<\/strong>\uc744 \uac01\uac01 \ub3c5\ub9bd\ub41c \ucee8\ud14c\uc774\ub108\ub85c \ubd84\ub9ac\ud574\uc11c \uc138\ud305\ud569\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. \uc65c Caddy\uc640 PostgreSQL\uc744 \ubd84\ub9ac\ud574\uc11c \uc124\uce58\ud560\uae4c\uc694?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc98\uc74c Docker\ub97c \uc138\ud305\ud560 \ub54c\ub294 \ud558\ub098\uc758 <code>docker-compose.yml<\/code>\uc5d0 \uc6f9\uc11c\ubc84\uc640 DB\ub97c \ud568\uaed8 \ubb36\uae30\ub3c4 \ud558\uc9c0\ub9cc, \ud648\uc11c\ubc84\ub97c \uc624\ub798 \uc6b4\uc601\ud558\ub824\uba74 \uc5ed\ud560\uc5d0 \ub530\ub77c \ubd84\ub9ac\ud574 \ub450\ub294 \ud3b8\uc774 \ud6e8\uc52c \ud3b8\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2460 Caddy\ub97c \ub3c5\ub9bd\uc2dc\ud0a4\ub294 \uc774\uc720 (\ud648\uc11c\ubc84 \uc804\uccb4\uc758 \ud1b5\ud569 \ub300\ubb38)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\uc790\ub3d9 HTTPS(SSL) \uc804\ub2f4:<\/strong> iOS\uc640 Android 9 \uc774\uc0c1\uc740 \uae30\ubcf8 \uc124\uc815\uc5d0\uc11c \uc554\ud638\ud654\ub418\uc9c0 \uc54a\uc740 <code>http:\/\/<\/code> \ud1b5\uc2e0\uc744 \ub9c9\uc2b5\ub2c8\ub2e4. Caddy\ub294 \ub3c4\uba54\uc778\ub9cc \uc801\uc5b4 \ub450\uba74 Let&#8217;s Encrypt SSL \uc778\uc99d\uc11c\ub97c \uc790\ub3d9\uc73c\ub85c \ubc1c\uae09\ubc1b\uace0, \ub9cc\ub8cc \uc804\uc5d0 \uc790\ub3d9\uc73c\ub85c \uac31\uc2e0\ud574 \uc90d\ub2c8\ub2e4. (80\/443 \ud3ec\ud2b8 \uc5f0\uacb0\uacfc \ub3c4\uba54\uc778 \uc124\uc815\uc774 \uc720\uc9c0\ub418\ub294 \ub3d9\uc548\uc5d0 \ud55c\ud574\uc11c\uc785\ub2c8\ub2e4.)<\/li>\n\n\n\n<li><strong>\ubaa8\ub4e0 \uc11c\ube44\uc2a4\uc758 \uad50\ud1b5\uc815\ub9ac(Reverse Proxy):<\/strong> NAS \uc548\uc5d0\ub294 \uba54\uc2e0\uc800 API \uc11c\ubc84(3000), \ud1b5\ud654 \uc11c\ubc84(7880)\ubfd0 \uc544\ub2c8\ub77c \uc55e\uc73c\ub85c \ucd94\uac00\ud560 \uc11c\ube44\uc2a4\ub3c4 \ub3cc\uc544\uac11\ub2c8\ub2e4. Caddy\ub97c \ub530\ub85c \ub744\uc6cc \ub450\uba74 \uba54\uc2e0\uc800 DB\ub098 \ubc31\uc5d4\ub4dc\ub97c \uc7ac\uc2dc\uc791\ud574\ub3c4 \ub2e4\ub978 \uc11c\ube44\uc2a4\uc758 \uc6f9 \uc811\uc18d\uc740 \ub04a\uae30\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u2461 \uc544\ud0a4\ud14d\ucc98 \uad6c\uc870\ub3c4<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uacf5\uc720\uae30\uc758 80, 443 \ud3ec\ud2b8\ub97c NAS\ub85c \ud3ec\ud2b8\ud3ec\uc6cc\ub529\ud558\uace0, Caddy\uac00 \uacf5\uc6a9 Docker \ub124\ud2b8\uc6cc\ud06c(<code>caddy-net<\/code>)\ub97c \ud1b5\ud574 \uac01 \ucee8\ud14c\uc774\ub108\ub85c \ud2b8\ub798\ud53d\uc744 \ub098\ub220 \uc90d\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-canaryblue-mermaid-diagram is-theme-default\" data-mermaid-label=\"Mermaid diagram\" data-mermaid-theme=\"default\"><pre class=\"wp-block-canaryblue-mermaid-diagram__source\" data-mermaid-source=\"true\">flowchart LR\n    classDef nodeStyle fill:#1e293b,stroke:#475569,stroke-width:2px,color:#ffffff;\n    classDef dbStyle fill:#0f172a,stroke:#0284c7,stroke-width:2px,color:#ffffff;\n\n    A[\"\uc2a4\ub9c8\ud2b8\ud3f0 \uc571 (HTTPS 443)\"]:::nodeStyle --> B[\"\uacf5\uc720\uae30 (80, 443 \ud3ec\ud2b8\ud3ec\uc6cc\ub529)\"]:::nodeStyle\n    B --> C[\"\uc720\uadf8\ub9b0 NAS Caddy (\uc790\ub3d9 SSL)\"]:::nodeStyle\n    C -->|\"api.\ub0b4\ub3c4\uba54\uc778\"| D[\"\ubc31\uc5d4\ub4dc API (\ub0b4\ubd80 3000)\"]:::nodeStyle\n    C -->|\"rtc.\ub0b4\ub3c4\uba54\uc778\"| E[\"LiveKit \ud1b5\ud654 (\ub0b4\ubd80 7880)\"]:::nodeStyle\n    D --> F[(\"PostgreSQL 16 (DB)\")]:::dbStyle<\/pre><div class=\"wp-block-canaryblue-mermaid-diagram__output\"><\/div><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. \ud3f4\ub354 \uad6c\uc870 \ubc0f \uc0ac\uc804 \uc900\ube44<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udca1 <strong>\uc800\uc7a5\uc18c \ubc30\uce58 \ud301<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Caddy \uc124\uc815\uacfc PostgreSQL DB:<\/strong> \uc751\ub2f5 \uc18d\ub3c4\uac00 \ube60\ub974\uace0 HDD \uc808\uc804(Sleep)\uc758 \uc601\ud5a5\uc744 \ubc1b\uc9c0 \uc54a\ub3c4\ub85d NVMe SSD \ubcfc\ub968(<code>\/volume1<\/code>)\uc5d0 \ub461\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\uc0ac\uc9c4\/\ub3d9\uc601\uc0c1\/\ud30c\uc77c \uc800\uc7a5\uc18c:<\/strong> \ub098\uc911\uc5d0 \ubc31\uc5d4\ub4dc\uc640 \uc5f0\ub3d9\ud560 \ub54c \ub300\uc6a9\ub7c9 \ubbf8\ub514\uc5b4\ub294 HDD \ubcfc\ub968(<code>\/volume2<\/code>)\uc5d0 \ub9c8\uc6b4\ud2b8\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/volume1\/docker\/                   # SSD \ubcfc\ub968 \ub8e8\ud2b8\n \u251c\u2500 caddy\/                         # [\ub3c5\ub9bd] NAS \uc804\uccb4 \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc \uc804\ub2f4\n \u2502   \u251c\u2500 docker-compose.yml\n \u2502   \u251c\u2500 .env                       # \ub3c4\uba54\uc778 \ud658\uacbd\ubcc0\uc218 \uad00\ub9ac\n \u2502   \u251c\u2500 Caddyfile                  # \ub77c\uc6b0\ud305 \ubc0f \uc790\ub3d9 SSL \uc124\uc815\n \u2502   \u251c\u2500 data\/                      # \ubc1c\uae09\ub41c SSL \uc778\uc99d\uc11c\uc640 \uac1c\uc778\ud0a4 \ubcf4\uad00 \ud3f4\ub354\n \u2502   \u2514\u2500 config\/                    # Caddy \uc124\uc815 \uce90\uc2dc \ud3f4\ub354\n \u2502\n \u2514\u2500 dingdong\/                      # [\ub3c5\ub9bd] \ub529\ub3d9 \ud504\ub85c\uc81d\ud2b8 \uc804\uc6a9 \ud3f4\ub354\n     \u2514\u2500 postgres\/                  # PostgreSQL 16 \ub370\uc774\ud130\ubca0\uc774\uc2a4\n         \u251c\u2500 docker-compose.yml\n         \u251c\u2500 .env                   # DB \uacc4\uc815 \ubc0f \ube44\ubc00\ubc88\ud638 (\ubcf4\uc548 \uc8fc\uc758!)\n         \u2514\u2500 data\/                  # \uc2e4\uc81c DB \ub370\uc774\ud130 \uc601\uad6c \uc800\uc7a5\uc18c<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud544\uc218 \uc0ac\uc804 \uc791\uc5c5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Caddy\uac00 \uc778\ud130\ub137\uc5d0\uc11c SSL \uc778\uc99d\uc11c\ub97c \ubc1c\uae09\ubc1b\uc73c\ub824\uba74 \uc544\ub798 \ub124 \uac00\uc9c0\uac00 \uba3c\uc800 \uc900\ube44\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u2460 \ub3c4\uba54\uc778 \uc5f0\uacb0:<\/strong> \uc0ac\uc6a9\ud560 \ub3c4\uba54\uc778(\uc608: <code>api.\ub0b4\ub3c4\uba54\uc778<\/code>, <code>rtc.\ub0b4\ub3c4\uba54\uc778<\/code>)\uc774 <strong>\uc6b0\ub9ac \uc9d1 \uacf5\uc778 IP<\/strong>\ub97c \uac00\ub9ac\ud0a4\uace0 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. DuckDNS \uac19\uc740 \ubb34\ub8cc DDNS\ub97c \uc4f4\ub2e4\uba74 <code>api.\ub0b4\uc774\ub984.duckdns.org<\/code> \uac19\uc740 \ud558\uc704 \ub3c4\uba54\uc778\ub3c4 \uac19\uc740 IP\ub85c \uc5f0\uacb0\ub418\ub294\uc9c0 \uba3c\uc800 \ud655\uc778\ud574 \ubcf4\uc138\uc694.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u2461 \uacf5\uc720\uae30 \ud3ec\ud2b8\ud3ec\uc6cc\ub529:<\/strong> \uacf5\uc720\uae30 \uc124\uc815 \ud654\uba74\uc5d0\uc11c \uc544\ub798 \ud3ec\ud2b8\ub97c NAS\uc758 \ub0b4\ubd80 IP\ub85c \ud3ec\uc6cc\ub529\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\uc678\ubd80 \ud3ec\ud2b8<\/th><th>\ud504\ub85c\ud1a0\ucf5c<\/th><th>\uc6a9\ub3c4<\/th><\/tr><\/thead><tbody><tr><td>80<\/td><td>TCP<\/td><td>\uc778\uc99d\uc11c \ubc1c\uae09 \ud655\uc778, HTTP \u2192 HTTPS \ub9ac\ub2e4\uc774\ub809\ud2b8<\/td><\/tr><tr><td>443<\/td><td>TCP<\/td><td>HTTPS \ud1b5\uc2e0<\/td><\/tr><tr><td>443<\/td><td>UDP<\/td><td>HTTP\/3(QUIC) \ud1b5\uc2e0 (\uc120\ud0dd)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>PostgreSQL \ud3ec\ud2b8(5432)\ub294 \ud3ec\ud2b8\ud3ec\uc6cc\ub529\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/strong> DB\ub294 \uc778\ud130\ub137\uc5d0\uc11c \uc9c1\uc811 \uc811\uadfc\ud560 \uc774\uc720\uac00 \uc804\ud600 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u2462 80\/443 \ud3ec\ud2b8 \ucda9\ub3cc \ud655\uc778:<\/strong> NAS\uc5d0\uc11c \uc774\ubbf8 80\uc774\ub098 443 \ud3ec\ud2b8\ub97c \uc4f0\ub294 \uc11c\ube44\uc2a4\uac00 \uc788\uc73c\uba74 Caddy\uac00 \ub728\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. NAS \ud130\ubbf8\ub110(SSH)\uc5d0\uc11c \ud655\uc778\ud574 \ubcf4\uc138\uc694.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo ss -tlnp | grep -E ':(80|443)\\s'<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc544\ubb34\uac83\ub3c4 \ub098\uc624\uc9c0 \uc54a\uc73c\uba74 \ube44\uc5b4 \uc788\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u2463 Docker \uacf5\uc6a9 \ub124\ud2b8\uc6cc\ud06c \uc0dd\uc131:<\/strong> \ubd84\ub9ac\ub41c \ucee8\ud14c\uc774\ub108\ub4e4\uc774 \uc774\ub984\uc73c\ub85c \ud1b5\uc2e0\ud560 \uc218 \uc788\ub3c4\ub85d, NAS \ud130\ubbf8\ub110(SSH)\uc5d0\uc11c \uc544\ub798 \uba85\ub839\uc73c\ub85c <code>caddy-net<\/code> \ub124\ud2b8\uc6cc\ud06c\ub97c \ubbf8\ub9ac \ub9cc\ub4e4\uc5b4 \ub461\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker network create caddy-net<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. [\ud30c\ud2b8 1] Caddy \ub2e8\ub3c5 \uc124\uce58\ud558\uae30 (\ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc &amp; \uc790\ub3d9 SSL)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uba3c\uc800 NAS\uc758 \ub300\ubb38 \uc5ed\ud560\uc744 \ud560 Caddy\ubd80\ud130 \uad6c\ucd95\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 Caddy \ud658\uacbd\ubcc0\uc218 \ud30c\uc77c (<code>\/volume1\/docker\/caddy\/.env<\/code>)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ub3c4\uba54\uc778 \uc8fc\uc18c\ub97c \ud55c\uacf3\uc5d0\uc11c \uad00\ub9ac\ud558\uae30 \uc704\ud574 <code>.env<\/code> \ud30c\uc77c\uc744 \ub9cc\ub4ed\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \ub3c4\uba54\uc778 \uc124\uc815 (\uc608\uc2dc\uc785\ub2c8\ub2e4. \ubcf8\uc778 \ub3c4\uba54\uc778\uc73c\ub85c \ubcc0\uacbd\ud558\uc138\uc694)\nDOMAIN_API=api.myfamily.com\nDOMAIN_RTC=rtc.myfamily.com<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 Caddy \uc124\uc815 \ud30c\uc77c (<code>\/volume1\/docker\/caddy\/Caddyfile<\/code>)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ub3c4\uba54\uc778 \uc55e\uc5d0 <code>http:\/\/<\/code>\ub97c \ubd99\uc774\uc9c0 \uc54a\uace0 \ub3c4\uba54\uc778 \uc774\ub984\ub9cc \uc801\uc73c\uba74, Caddy\uac00 \uc790\ub3d9\uc73c\ub85c HTTPS \uc778\uc99d\uc11c\ub97c \ubc1c\uae09\ubc1b\uc544 \uc801\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"nginx\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># 1. \ub529\ub3d9 API \uc11c\ubc84 \ubc0f WebSocket \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc (\uc790\ub3d9 HTTPS \uc801\uc6a9)\n{$DOMAIN_API} {\n    # \ub300\uc6a9\ub7c9 \uc0ac\uc9c4\/\ud30c\uc77c \uc804\uc1a1\uc744 \uc704\ud574 \uc694\uccad \ubcf8\ubb38 \ud06c\uae30 \uc0c1\ud55c\uc744 310MB\ub85c \uc124\uc815\n    request_body {\n        max_size 310MB\n    }\n\n    # \uc555\ucd95 \uc804\uc1a1 \ud65c\uc131\ud654 (\ubaa8\ubc14\uc77c \ub370\uc774\ud130 \uc808\uc57d)\n    encode zstd gzip\n\n    # \ubc31\uc5d4\ub4dc API \ucee8\ud14c\uc774\ub108\ub85c \uc804\ub2ec (WebSocket \uc5c5\uadf8\ub808\uc774\ub4dc\ub3c4 Caddy\uac00 \ucc98\ub9ac\ud568)\n    reverse_proxy dingdong-api:3000\n\n    # \ubcf4\uc548 \ud5e4\ub354 \uc124\uc815\n    header {\n        Strict-Transport-Security \"max-age=31536000; includeSubDomains\"\n        X-Content-Type-Options \"nosniff\"\n        X-Frame-Options \"DENY\"\n        -Server\n    }\n}\n\n# 2. LiveKit \ud1b5\ud654 \uc11c\ubc84 \uc2dc\uadf8\ub110\ub9c1 \ud504\ub85d\uc2dc (\uc790\ub3d9 HTTPS \uc801\uc6a9)\n{$DOMAIN_RTC} {\n    reverse_proxy host.docker.internal:7880\n}<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udccc <strong>LiveKit(\ud1b5\ud654)\uc740 \ud3ec\ud2b8\uac00 \ud558\ub098 \ub354 \ud544\uc694\ud569\ub2c8\ub2e4.<\/strong> \uc704 \uc124\uc815\uc740 \ud1b5\ud654 \uc5f0\uacb0\uc744 \ub9fa\ub294 <strong>\uc2dc\uadf8\ub110\ub9c1(7880)<\/strong> \ub9cc Caddy\ub97c \uac70\uce69\ub2c8\ub2e4. \uc2e4\uc81c \uc74c\uc131 \ub370\uc774\ud130\ub97c \uc8fc\uace0\ubc1b\ub294 <strong>WebRTC \ubbf8\ub514\uc5b4\ub294 Caddy\ub97c \uac70\uce58\uc9c0 \uc54a\uace0<\/strong> \ubcc4\ub3c4\uc758 TCP\/UDP \ud3ec\ud2b8(LiveKit \uae30\ubcf8\uac12 \uae30\uc900 TCP 7881\uacfc UDP 50000~60000\ubc88\ub300)\ub97c \uc0ac\uc6a9\ud558\ubbc0\ub85c, \ud1b5\ud654 \ud3b8\uc5d0\uc11c \ud574\ub2f9 \ud3ec\ud2b8\ub97c \uacf5\uc720\uae30\uc5d0 \ucd94\uac00\ub85c \ud3ec\uc6cc\ub529\ud574\uc57c \ud569\ub2c8\ub2e4. \uc815\ud655\ud55c \ud3ec\ud2b8\ub294 LiveKit \ubb38\uc11c\uc640 \uc124\uc815 \ud30c\uc77c\uc5d0\uc11c \ud655\uc778\ud558\uace0, \uc9c0\uae08 \ub2e8\uacc4\uc5d0\uc11c\ub294 80\/443\ub9cc \uc5f4\uc5b4 \ub450\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">3.3 Caddy \uc2e4\ud589 \ud30c\uc77c (<code>\/volume1\/docker\/caddy\/docker-compose.yml<\/code>)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ud638\uc2a4\ud2b8\uc758 80, 443 \ud3ec\ud2b8\ub97c \uc9c1\uc811 \ub9e4\ud551\ud558\uace0, \uc55e\uc11c \ub9cc\ub4e0 <code>caddy-net<\/code> \ub124\ud2b8\uc6cc\ud06c\uc5d0 \uc5f0\uacb0\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  caddy:\n    image: caddy:2-alpine\n    container_name: caddy\n    restart: unless-stopped\n    env_file: .env                      # Caddyfile\uc758 {$DOMAIN_API} \ubcc0\uc218\ub97c \uc77d\uae30 \uc704\ud574 \ud544\uc218!\n    ports:\n      - \"80:80\"                         # \uc778\uc99d\uc11c \ubc1c\uae09 \ud655\uc778 \ubc0f HTTP -> HTTPS \ub9ac\ub2e4\uc774\ub809\ud2b8\uc6a9\n      - \"443:443\"                       # \uc2e4\uc81c \ubcf4\uc548 \ud1b5\uc2e0(HTTPS) \ud3ec\ud2b8\n      - \"443:443\/udp\"                   # HTTP\/3 (QUIC) \uc9c0\uc6d0\uc6a9\n    volumes:\n      - .\/Caddyfile:\/etc\/caddy\/Caddyfile:ro\n      - .\/data:\/data                    # \uc778\uc99d\uc11c\uc640 \uac1c\uc778\ud0a4\uac00 \uc800\uc7a5\ub418\ub294 \uacf3 (\uc0ad\uc81c \uc8fc\uc758!)\n      - .\/config:\/config\n    extra_hosts:\n      # \ub9ac\ub205\uc2a4 Docker\uc5d0\uc11c host.docker.internal(\ud638\uc2a4\ud2b8 IP)\uc744 \uc778\uc2dd\ud558\uae30 \uc704\ud574 \ud544\uc694\n      - \"host.docker.internal:host-gateway\"\n    networks:\n      - caddy-net\n\nnetworks:\n  caddy-net:\n    external: true                      # \ubbf8\ub9ac \ub9cc\ub4e4\uc5b4 \ub454 \uc678\ubd80 \uacf5\uc6a9 \ub124\ud2b8\uc6cc\ud06c \uc0ac\uc6a9<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <code>.\/data<\/code> \ud3f4\ub354\uc5d0\ub294 \uc778\uc99d\uc11c\uc640 <strong>\uac1c\uc778\ud0a4<\/strong>\uac00 \ub4e4\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc9c0\uc6b0\uba74 \uc778\uc99d\uc11c\ub97c \ub2e4\uc2dc \ubc1c\uae09\ubc1b\uc544\uc57c \ud558\uace0, \uc9e7\uc740 \uae30\uac04\uc5d0 \uc7ac\ubc1c\uae09\uc744 \ubc18\ubcf5\ud558\uba74 Let&#8217;s Encrypt\uc758 \ubc1c\uae09 \ud69f\uc218 \uc81c\ud55c\uc5d0 \uac78\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc678\ubd80\uc5d0 \uacf5\uc720\ud558\uac70\ub098 \uc62c\ub9ac\uc9c0 \ub9d0\uace0 \ubc31\uc5c5\ud560 \ub54c\ub3c4 \uc8fc\uc758\ud558\uc138\uc694.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">3.4 Caddy \ucee8\ud14c\uc774\ub108 \uc2e4\ud589 \ubc0f \uc778\uc99d\uc11c \ubc1c\uae09 \ud655\uc778<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ud130\ubbf8\ub110\uc5d0\uc11c Caddy \ud3f4\ub354\ub85c \uc774\ub3d9\ud574 \ucee8\ud14c\uc774\ub108\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cd \/volume1\/docker\/caddy\ndocker compose up -d\n\n# \uc778\uc99d\uc11c\uac00 \uc815\uc0c1\uc801\uc73c\ub85c \ubc1c\uae09\ub418\uc5c8\ub294\uc9c0 \ub85c\uadf8 \ud655\uc778 (\ube60\uc838\ub098\uc62c \ub550 Ctrl + C)\ndocker compose logs -f<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub85c\uadf8\uc5d0 <code>certificate obtained successfully<\/code> \uac19\uc740 \ubb38\uad6c\uac00 \ubcf4\uc774\uba74 \ubb34\ub8cc SSL \uc778\uc99d\uc11c \ubc1c\uae09\uc774 \ub05d\ub09c \uac83\uc785\ub2c8\ub2e4. \uc544\uc9c1 \ubc31\uc5d4\ub4dc(<code>dingdong-api<\/code>)\ub97c \ub744\uc6b0\uc9c0 \uc54a\uc558\uc73c\ubbc0\ub85c \ube0c\ub77c\uc6b0\uc800\ub85c \uc811\uc18d\ud558\uba74 <strong>502 Bad Gateway<\/strong>\uac00 \ub098\uc624\uc9c0\ub9cc, \uc8fc\uc18c\ucc3d\uc5d0 \ubcf4\uc548 \uc790\ubb3c\uc1e0(HTTPS)\uac00 \ud45c\uc2dc\ub418\uba74 \uc815\uc0c1\uc785\ub2c8\ub2e4. \ud130\ubbf8\ub110\uc5d0\uc11c\ub294 \uc544\ub798\ucc98\ub7fc \ud655\uc778\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">curl -I https:\/\/api.myfamily.com<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udd27 <strong>\uc778\uc99d\uc11c \ubc1c\uae09\uc774 \uc548 \ub420 \ub54c \uccb4\ud06c\ub9ac\uc2a4\ud2b8<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\ub3c4\uba54\uc778\uc774 \uc815\ub9d0 \uc6b0\ub9ac \uc9d1 <strong>\uacf5\uc778 IP<\/strong>\ub97c \uac00\ub9ac\ud0a4\ub294\uac00? (\uacf5\uc720\uae30 WAN IP\uc640 \ube44\uad50)<\/li>\n\n\n\n<li>\uacf5\uc720\uae30\uc5d0\uc11c 80, 443\uc774 <strong>NAS \ub0b4\ubd80 IP<\/strong>\ub85c \ud3ec\uc6cc\ub529\ub418\uc5b4 \uc788\ub294\uac00?<\/li>\n\n\n\n<li>\ud1b5\uc2e0\uc0ac\uac00 80\/443\uc744 \ub9c9\uace0 \uc788\uac70\ub098 \uacf5\uc778 IP\uac00 \uc544\ub2cc(CGNAT) \ud658\uacbd\uc740 \uc544\ub2cc\uac00?<\/li>\n\n\n\n<li>NAS\uc5d0\uc11c 80\/443\uc744 \uc774\ubbf8 \ub2e4\ub978 \uc11c\ube44\uc2a4\uac00 \uc4f0\uace0 \uc788\uc9c0\ub294 \uc54a\uc740\uac00? (2\uc7a5 \u2462\ubc88 \uba85\ub839)<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\uc6d0\uc778\uc740 <code>docker compose logs<\/code>\uc758 \uc5d0\ub7ec \uba54\uc2dc\uc9c0\uc5d0 \ub300\ubd80\ubd84 \ub098\uc635\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. [\ud30c\ud2b8 2] PostgreSQL 16 \ub2e8\ub3c5 \uc124\uce58\ud558\uae30 (\ub370\uc774\ud130\ubca0\uc774\uc2a4)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c Caddy\uc640 \ubd84\ub9ac\ub41c \ub529\ub3d9 \ud504\ub85c\uc81d\ud2b8 \ud3f4\ub354\uc5d0\uc11c \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uad6c\ucd95\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 PostgreSQL \ud658\uacbd\ubcc0\uc218 \ud30c\uc77c (<code>\/volume1\/docker\/dingdong\/postgres\/.env<\/code>)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uba3c\uc800 NAS \ud130\ubbf8\ub110\uc5d0\uc11c \ubb34\uc791\uc704 \ube44\ubc00\ubc88\ud638\ub97c \ub9cc\ub4ed\ub2c8\ub2e4. \uc601\ubb38\uacfc \uc22b\uc790\ub85c\ub9cc \ub41c \uac12\uc774\ub77c \ub098\uc911\uc5d0 \uc811\uc18d \uc8fc\uc18c(DSN)\uc5d0 \ub123\uc744 \ub54c\ub3c4 \ud2b9\uc218\ubb38\uc790 \ub54c\ubb38\uc5d0 \uae68\uc9c0\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">openssl rand -hex 24<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucd9c\ub825\ub41c \uac12\uc744 \ubcf5\uc0ac\ud574 <code>.env<\/code> \ud30c\uc77c\uc5d0 \ub123\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">POSTGRES_DB=dingdong\nPOSTGRES_USER=dingdong\nPOSTGRES_PASSWORD=CHANGE_ME_\uc704\uc5d0\uc11c_\ub9cc\ub4e0_\ube44\ubc00\ubc88\ud638\ub85c_\uad50\uccb4<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f \ube44\ubc00\ubc88\ud638\ub294 <strong>\ub2e4\ub978 \uc0ac\ub78c\uc774 \ubcfc \uc218 \uc788\ub294 \uacf3(\ube14\ub85c\uadf8, GitHub, \ucea1\ucc98 \ud654\uba74)\uc5d0 \uc62c\ub9ac\uc9c0 \ub9c8\uc138\uc694.<\/strong> \ud30c\uc77c \uad8c\ud55c\ub3c4 \uc81c\ud55c\ud574 \ub450\uc138\uc694.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">chmod 600 .env<\/pre>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong><code>POSTGRES_PASSWORD<\/code>\ub294 DB\ub97c \ucc98\uc74c \ub9cc\ub4e4 \ub54c \ud55c \ubc88\ub9cc \uc801\uc6a9\ub429\ub2c8\ub2e4.<\/strong> \uc774\ubbf8 <code>data\/<\/code> \ud3f4\ub354\uc5d0 DB\uac00 \ub9cc\ub4e4\uc5b4\uc9c4 \ub4a4\uc5d0\ub294 <code>.env<\/code>\uc758 \uac12\ub9cc \ubc14\uafd4\ub3c4 \ube44\ubc00\ubc88\ud638\uac00 \ubc14\ub00c\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc608\uc804 \uae00\uc758 \uc608\uc2dc \ube44\ubc00\ubc88\ud638\ub85c DB\ub97c \ub9cc\ub4e4\uc5b4 \ub450\uc5c8\ub2e4\uba74 \uc544\ub798\ucc98\ub7fc \uc9c1\uc811 \ubc14\uafd4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose exec postgres psql -U dingdong -d dingdong \\\n  -c \"ALTER USER dingdong WITH PASSWORD '\uc0c8_\ube44\ubc00\ubc88\ud638';\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc14\uafbc \ub4a4\uc5d0\ub294 <code>.env<\/code>\uc640 \ubc31\uc5d4\ub4dc \ucabd \uc811\uc18d \uc124\uc815\ub3c4 \uac19\uc740 \uac12\uc73c\ub85c \ub9de\ucdb0\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">4.2 PostgreSQL \uc2e4\ud589 \ud30c\uc77c (<code>\/volume1\/docker\/dingdong\/postgres\/docker-compose.yml<\/code>)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">DB\ub294 \uc778\ud130\ub137\uc5d0\uc11c \uc9c1\uc811 \uc811\uadfc\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. \ub098\uc911\uc5d0 \ub744\uc6b8 \ubc31\uc5d4\ub4dc \uc11c\ubc84\uc640 \ub0b4\ubd80\uc5d0\uc11c\ub9cc \ud1b5\uc2e0\ud558\ub3c4\ub85d \uc804\uc6a9 \ub124\ud2b8\uc6cc\ud06c(<code>dingdong-net<\/code>)\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  postgres:\n    image: postgres:16-alpine\n    container_name: dingdong-postgres\n    restart: unless-stopped\n    env_file: .env                      # POSTGRES_DB \/ USER \/ PASSWORD\ub97c \uc77d\uc5b4 \uc634\n    environment:\n      TZ: Asia\/Seoul\n    ports:\n      # NAS \uc790\uae30 \uc790\uc2e0(127.0.0.1)\uc5d0\uc11c\ub9cc \uc811\uc18d \uac00\ub2a5\ud558\uac8c \ubb36\uc2b5\ub2c8\ub2e4.\n      # \ub0b4 Mac\uc5d0\uc11c\ub294 4.4\uc758 SSH \ud130\ub110\ub85c \uc811\uc18d\ud569\ub2c8\ub2e4.\n      - \"127.0.0.1:5432:5432\"\n    volumes:\n      - .\/data:\/var\/lib\/postgresql\/data\n    healthcheck:                        # DB\uac00 \uc900\ube44\ub418\uc5c8\ub294\uc9c0 \ud655\uc778 (\ub2e4\uc74c \ud3b8\uc5d0\uc11c \ubc31\uc5d4\ub4dc\uac00 \uc774\ub97c \uae30\ub2e4\ub9bd\ub2c8\ub2e4)\n      test: [\"CMD-SHELL\", \"pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}\"]\n      interval: 5s\n      timeout: 5s\n      retries: 10\n    networks:\n      - dingdong-net\n\nnetworks:\n  dingdong-net:\n    name: dingdong-net                  # \ubc31\uc5d4\ub4dc API \uc11c\ubc84\uc640 DB\uac00 \ub300\ud654\ud560 \uc804\uc6a9 \ub0b4\ubd80 \ub124\ud2b8\uc6cc\ud06c<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udca1 <strong>\uc65c <code>127.0.0.1:5432:5432<\/code>\uc778\uac00\uc694?<\/strong><br><code>\"5432:5432\"<\/code>\ucc98\ub7fc \uc801\uc73c\uba74 NAS\uc758 <strong>\ubaa8\ub4e0 \ub124\ud2b8\uc6cc\ud06c \uc778\ud130\ud398\uc774\uc2a4<\/strong>\uc5d0 DB \ud3ec\ud2b8\uac00 \uc5f4\ub9bd\ub2c8\ub2e4. &#8220;\uacf5\uc720\uae30\uc5d0\uc11c \ud3ec\ud2b8\ud3ec\uc6cc\ub529\ub9cc \uc548 \ud558\uba74 \uc548\uc804\ud558\ub2e4&#8221;\uace0 \uc0dd\uac01\ud558\uae30 \uc27d\uc9c0\ub9cc, \uacf5\uc720\uae30\uc758 UPnP \uc790\ub3d9 \ud3ec\ud2b8\ud3ec\uc6cc\ub529\uc774\ub098 \uc124\uc815 \uc2e4\uc218, \uac19\uc740 \uc9d1 \ub124\ud2b8\uc6cc\ud06c\uc758 \ub2e4\ub978 \uae30\uae30\ub97c \uc0dd\uac01\ud558\uba74 DB\ub97c \uad73\uc774 \uc5f4\uc5b4 \ub458 \uc774\uc720\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. \ub610 Docker\ub294 \uc790\uccb4\uc801\uc73c\ub85c \ubc29\ud654\ubcbd \uaddc\uce59\uc744 \ub9cc\ub4e4\uae30 \ub54c\ubb38\uc5d0 NAS\uc758 \ubc29\ud654\ubcbd \uc124\uc815\ub9cc \ubbff\uc744 \uc218\ub3c4 \uc5c6\uc2b5\ub2c8\ub2e4. \uadf8\ub798\uc11c NAS \uc790\uc2e0\uc5d0\uac8c\ub9cc \uc5f4\uc5b4 \ub450\uace0, \uac1c\ubc1c PC\uc5d0\uc11c\ub294 \uc544\ub798 SSH \ud130\ub110\ub85c \uc811\uc18d\ud569\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">4.3 PostgreSQL \ucee8\ud14c\uc774\ub108 \uc2e4\ud589 \ubc0f \uc5f0\uacb0 \ud14c\uc2a4\ud2b8<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ud130\ubbf8\ub110\uc5d0\uc11c PostgreSQL \ud3f4\ub354\ub85c \uc774\ub3d9\ud574 \ucee8\ud14c\uc774\ub108\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cd \/volume1\/docker\/dingdong\/postgres\n\n# 1. \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc2e4\ud589\ndocker compose up -d\n\n# 2. \ucee8\ud14c\uc774\ub108 \uc815\uc0c1 \uad6c\ub3d9 \uc5ec\ubd80 \ud655\uc778 (STATUS\uac00 healthy\uba74 \uc900\ube44 \uc644\ub8cc)\ndocker compose ps<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucee8\ud14c\uc774\ub108 \ub0b4\ubd80\uc758 <code>psql<\/code> \uba85\ub839\uc5b4\ub85c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc798 \ub9cc\ub4e4\uc5b4\uc84c\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose exec postgres psql -U dingdong -d dingdong -c \"\\l\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud45c \ubaa9\ub85d\uc5d0 <code>dingdong<\/code> \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \ubcf4\uc774\uba74 DB \uc900\ube44\uac00 \ub05d\ub09c \uac83\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.4 \ub0b4 Mac\uc5d0\uc11c DB\uc5d0 \uc811\uc18d\ud558\uae30 (SSH \ud130\ub110)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">DBeaver \uac19\uc740 \ub3c4\uad6c\ub85c \uc811\uc18d\ud558\uac70\ub098 \ub2e4\uc74c \ud3b8\ub4e4\uc5d0\uc11c \uc2a4\ud0a4\ub9c8\ub97c \uc801\uc6a9\ud558\ub824\uba74 Mac\uc5d0\uc11c DB\uc5d0 \ub2ff\uc544\uc57c \ud569\ub2c8\ub2e4. Mac \ud130\ubbf8\ub110\uc5d0\uc11c \uc544\ub798 \uba85\ub839\uc744 \uc2e4\ud589\ud558\uace0 <strong>\ucc3d\uc744 \uc5f4\uc5b4 \ub454 \ucc44\ub85c<\/strong> \uc0ac\uc6a9\ud558\uc138\uc694. (NAS\uc758 SSH\uac00 \ud3ec\ud2b8 \ud3ec\uc6cc\ub529\uc744 \ub9c9\uc544 \ub450\uc9c0 \uc54a\uc558\ub2e4\uba74 \ub3d9\uc791\ud569\ub2c8\ub2e4.)<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ssh -N -L 5432:127.0.0.1:5432 &lt;NAS\uacc4\uc815>@&lt;NAS\ub0b4\ubd80IP><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c Mac\uc5d0\uc11c <code>localhost:5432<\/code>\ub85c \uc811\uc18d\ud558\uba74 NAS\uc758 DB\uc5d0 \uc5f0\uacb0\ub429\ub2c8\ub2e4. \uc774\ubbf8 Mac\uc5d0 PostgreSQL\uc774 \uc124\uce58\ub418\uc5b4 5432 \ud3ec\ud2b8\ub97c \uc4f0\uace0 \uc788\ub2e4\uba74 <code>-L 15432:127.0.0.1:5432<\/code>\ucc98\ub7fc \ubc14\uafb8\uace0 <code>localhost:15432<\/code>\ub85c \uc811\uc18d\ud558\uc138\uc694.\uba85\ub839\uc5b4 \uc2e4\ud589 \ud6c4 \ud45c \ubaa9\ub85d\uc5d0 <code>dingdong<\/code> \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \ubcf4\uc774\uba74 DB \uc900\ube44\ub3c4 \uc644\ubcbd\ud788 \ub05d\ub0ac\uc2b5\ub2c8\ub2e4!<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. \ubd84\ub9ac\ud615 \uad6c\uc870\uc758 \ud575\uc2ec \uc694\uc57d (\ub2e4\uc74c \ud3b8\uacfc\uc758 \uc5f0\uacb0 \uace0\ub9ac)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub807\uac8c Caddy\uc640 PostgreSQL\uc744 \ubd84\ub9ac\ud574 \ub450\uba74 \uad00\ub9ac\uac00 \ud6e8\uc52c \uae54\ub054\ud574\uc9d1\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\ub3c5\ub9bd\uc801\uc778 \uc720\uc9c0\ubcf4\uc218:<\/strong> \uc55e\uc73c\ub85c NAS\uc5d0 \ub2e4\ub978 \uc6f9 \uc11c\ube44\uc2a4\ub97c \ucd94\uac00\ud560 \ub54c\ub294 <code>\/volume1\/docker\/caddy\/Caddyfile<\/code>\uc5d0 \ub3c4\uba54\uc778 \ub450\uc138 \uc904\uc744 \ucd94\uac00\ud558\uace0 \uc544\ub798 \uba85\ub839\uc73c\ub85c \uc124\uc815\uc744 \ub2e4\uc2dc \uc77d\uac8c \ud558\uba74, DB\ub098 \ub2e4\ub978 \ucee8\ud14c\uc774\ub108\ub97c \uc7ac\uc2dc\uc791\ud558\uc9c0 \uc54a\uace0 \ubc18\uc601\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<code>docker exec -w \/etc\/caddy caddy caddy reload<\/code>(\uc124\uc815\uc774 \ubc18\uc601\ub418\uc9c0 \uc54a\uc73c\uba74 <code>docker compose restart caddy<\/code>\ub85c \uc7ac\uc2dc\uc791\ud574 \ubcf4\uc138\uc694.)<\/li>\n\n\n\n<li><strong>\ub124\ud2b8\uc6cc\ud06c \ubd84\ub9ac:<\/strong> \ub2e4\uc74c \ud3b8\uc5d0\uc11c \ub9cc\ub4e4 \ubc31\uc5d4\ub4dc API \ucee8\ud14c\uc774\ub108(<code>dingdong-api<\/code>)\ub9cc <code>caddy-net<\/code>(Caddy\uc640 \ud1b5\uc2e0\uc6a9)\uacfc <code>dingdong-net<\/code>(DB\uc640 \ud1b5\uc2e0\uc6a9) <strong>\uc591\ucabd\uc5d0 \uc5f0\uacb0<\/strong>\ud569\ub2c8\ub2e4. DB\ub294 <code>caddy-net<\/code>\uc5d0 \uc5c6\uace0 \ud3ec\ud2b8\ub3c4 NAS \uc790\uae30 \uc790\uc2e0\uc5d0\uac8c\ub9cc \uc5f4\ub824 \uc788\uc73c\ubbc0\ub85c, \uc778\ud130\ub137\uc5d0\uc11c DB\ub85c \ubc14\ub85c \ub4e4\uc5b4\uc624\ub294 \uae38\uc774 \uc5c6\ub294 \uad6c\uc870\uac00 \ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udccc \uc774 \uad6c\uc870\ub294 DB\ub97c \uc778\ud130\ub137\uc5d0\uc11c \uc9c1\uc811 \ub2ff\uc9c0 \uc54a\uac8c \ud558\ub294 <strong>\uae30\ubcf8 \ub2e8\uacc4<\/strong>\uc785\ub2c8\ub2e4. \uc548\uc804\ud558\uac8c \uc6b4\uc601\ud558\ub824\uba74 NAS\uc640 Docker \uc774\ubbf8\uc9c0\ub97c \uc8fc\uae30\uc801\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8\ud558\uace0, DB \ube44\ubc00\ubc88\ud638\ub97c \uc9c0\ud0a4\uace0, \ubc31\uc5c5\ub3c4 \ub530\ub85c \uc900\ube44\ud574\uc57c \ud569\ub2c8\ub2e4. \ubc31\uc5c5\uc740 \uc2dc\ub9ac\uc988 \ub4a4\ucabd\uc5d0\uc11c \ub2e4\ub8f9\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. \ub2e4\uc74c \ud3b8 \uc608\uace0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c NAS\uc758 HTTPS \ud1b5\uc2e0\uc744 \ub9e1\uc744 Caddy \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc\uc640 \uba54\uc2e0\uc800\uc758 \uc2ec\uc7a5\uc778 PostgreSQL 16 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc900\ube44\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\uc74c **[\uac1c\ubc1c\uc77c\uc9c0 #04 | \ubc31\uc5d4\ub4dc]**\uc5d0\uc11c\ub294 Go\ub85c \uac00\ubcbc\uc6b4 API \uc11c\ubc84\ub97c \ub9cc\ub4e4\uc5b4 Docker\ub85c \ubc30\ud3ec\ud558\uace0, Caddy\ub97c \ud1b5\ud574 \uc2e4\uc81c \ub3c4\uba54\uc778\uc73c\ub85c \uc811\uc18d\ud574 \ubd05\ub2c8\ub2e4. DB \uc2a4\ud0a4\ub9c8(\ud68c\uc6d0, \ucc44\ud305\ubc29, \uba54\uc2dc\uc9c0 \ud14c\uc774\ube14)\ub97c \ub9cc\ub4e4\uace0 \ub9c8\uc774\uadf8\ub808\uc774\uc158\ud558\ub294 \uacfc\uc815\uc740 \uadf8\ub2e4\uc74c \ud3b8(#05)\uc5d0\uc11c \ub2e4\ub8f9\ub2c8\ub2e4!<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h3 class=\"wp-block-heading\">\ud83d\udcc2 Part 1. \uae30\ud68d &amp; \uc544\ud0a4\ud14d\ucc98 \uc124\uacc4<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 <strong>[\uac1c\ubc1c\uc77c\uc9c0 #01 | \uae30\ud68d] <a href=\"https:\/\/dinggo.duckdns.org\/?p=20\" data-type=\"post\" data-id=\"20\">\uc720\uadf8\ub9b0 NAS\uc640 Flutter\ub85c \ub9cc\ub4dc\ub294 \ub098\ub9cc\uc758 \ud504\ub77c\uc774\ube57 \uba54\uc2e0\uc800 &#8216;\ub529\ub3d9&#8217; (\uae30\ud68d &amp; \uc544\ud0a4\ud14d\ucc98 \ud3b8)<\/a><\/strong><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcc2 Part 2. \ud648\uc11c\ubc84 &amp; \uc778\ud504\ub77c \uad6c\ucd95<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 <strong>[\uac1c\ubc1c\uc77c\uc9c0 #02 | \uc778\ud504\ub77c] <a href=\"https:\/\/dinggo.duckdns.org\/?p=52\" data-type=\"post\" data-id=\"52\">Mac\uc5d0\uc11c Flutter &amp; VS Code \uac1c\ubc1c \ud658\uacbd \uad6c\ucd95\ud558\uae30 (\ucd08\ubcf4\uc790 \uc644\ubcbd \uac00\uc774\ub4dc)<\/a><\/strong><\/li>\n\n\n\n<li>\u2705 <strong>[\uac1c\ubc1c\uc77c\uc9c0 #03 | \uc778\ud504\ub77c] <a href=\"https:\/\/dinggo.duckdns.org\/?p=68\" data-type=\"post\" data-id=\"68\">\uc720\uadf8\ub9b0 NAS\uc5d0 Caddy &amp; PostgreSQL \uad6c\ucd95\ud558\uae30<\/a><\/strong><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcc2 Part 3. \ubc31\uc5d4\ub4dc(API) &amp; \uc2e4\uc2dc\uac04 \ud1b5\ud654 \uc11c\ubc84<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 <strong>[\uac1c\ubc1c\uc77c\uc9c0 #04 | \ubc31\uc5d4\ub4dc] <a href=\"https:\/\/dinggo.duckdns.org\/?p=117\" data-type=\"post\" data-id=\"117\">\uc720\uadf8\ub9b0 NAS\uc5d0 Go(Golang) \ucd08\uacbd\ub7c9 \uba54\uc2e0\uc800 \ubc31\uc5d4\ub4dc \uc11c\ubc84 \uad6c\ucd95\ud558\uae30<\/a><\/strong><\/li>\n\n\n\n<li>\u2705 <strong>[\uac1c\ubc1c\uc77c\uc9c0 #05 | \ubc31\uc5d4\ub4dc] <a href=\"https:\/\/dinggo.duckdns.org\/?p=136\" data-type=\"post\" data-id=\"136\">\uba54\uc2e0\uc800 DB \uc2a4\ud0a4\ub9c8 \uc124\uacc4 &amp; Go sqlc \uc5f0\ub3d9\ud558\uae30<\/a><\/strong><\/li>\n\n\n\n<li>\u2705 <strong>[\uac1c\ubc1c\uc77c\uc9c0 #06 | \ubc31\uc5d4\ub4dc] <a href=\"https:\/\/dinggo.duckdns.org\/?p=191\" data-type=\"post\" data-id=\"191\">\ucd08\ub300\ucf54\ub4dc \ud68c\uc6d0\uac00\uc785, Argon2id \uc554\ud638\ud654 &amp; \ub2e4\uc911 \uae30\uae30 JWT \uc778\uc99d \uad6c\ud604\ud558\uae30<\/a><\/strong><\/li>\n\n\n\n<li>\u23f3 <strong>[#08 | \ubc31\uc5d4\ub4dc]<\/strong> \uc5f0\ub77d\ucc98 HMAC \ud574\uc2dc \uce5c\uad6c \ub9e4\uce6d &amp; 1:1 \/ \uadf8\ub8f9 \ucc44\ud305\ubc29 \uc0dd\uc131 API <em>(\uc608\uc815)<\/em><\/li>\n\n\n\n<li>\u23f3 <strong>[#10 | \ubc31\uc5d4\ub4dc]<\/strong> Gorilla WebSocket \uc2e4\uc2dc\uac04 \ucc44\ud305 \ud5c8\ube0c &amp; \ub2e8\uc870 \uc99d\uac00 \uc21c\ubc88(<code>seq<\/code>) \ub3d9\uae30\ud654 <em>(\uc608\uc815)<\/em><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcc2 Part 4. \ubaa8\ubc14\uc77c \uc571 \uac1c\ubc1c (iOS \/ Android)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 <strong>[\uac1c\ubc1c\uc77c\uc9c0 #07 | \ud074\ub77c\uc774\uc5b8\ud2b8] <a href=\"https:\/\/dinggo.duckdns.org\/?p=200\" data-type=\"post\" data-id=\"200\">Flutter \uc571 \uccab \uc5f0\ub3d9: Secure Storage \ud1a0\ud070 \uad00\ub9ac, Dio \uc790\ub3d9 \uac31\uc2e0 &amp; \ub85c\uadf8\uc778 \ud654\uba74 \uad6c\ud604<\/a><\/strong><\/li>\n\n\n\n<li>\u23f3 <strong>[#09 | \ud074\ub77c\uc774\uc5b8\ud2b8]<\/strong> \uce5c\uad6c \ubaa9\ub85d \ub3d9\uae30\ud654 &amp; \ucc44\ud305\ubc29 \ubaa9\ub85d UI \uc5f0\ub3d9\ud558\uae30 <em>(\uc608\uc815)<\/em><\/li>\n\n\n\n<li>\u23f3 <strong>[#11 | \ud074\ub77c\uc774\uc5b8\ud2b8]<\/strong> \uc2e4\uc2dc\uac04 WebSocket \ucc44\ud305\ubc29 \ud654\uba74 &amp; \ub04a\uae40 \uc5c6\ub294 \ub300\ud654 \ub3d9\uae30\ud654 \uad6c\ud604 <em>(\uc608\uc815)<\/em><\/li>\n\n\n\n<li>\u23f3 <strong>[#12 | \uc571-\uacf5\ud1b5]<\/strong> 300MB \ub300\uc6a9\ub7c9 \uc6d0\ubcf8 \uc0ac\uc9c4\/\uc601\uc0c1 \uc804\uc1a1 \ubc0f \ubbf8\ub514\uc5b4 \ucc98\ub9ac <em>(\uc608\uc815)<\/em><\/li>\n\n\n\n<li>\u23f3 <strong>[#13 | \uc571-\ud478\uc2dc]<\/strong> \uc571\uc774 \uaebc\uc838 \uc788\uc5b4\ub3c4 \uc6b8\ub9ac\ub294 \ud478\uc2dc \uc54c\ub9bc(FCM\/APNs) \ubc0f \ubcf4\uc774\uc2a4\ud1a1 \uc5f0\ub3d9 <em>(\uc608\uc815)<\/em><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcc2 Part 5. \uc815\uc2dd \ubc30\ud3ec &amp; \uc6b4\uc601<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u23f3 <strong>[#14 | \ubc30\ud3ec]<\/strong> \ubc31\uc5d4\ub4dc \uc11c\ubc84 \ub3c4\ucee4 \uc774\ubbf8\uc9c0 \ube4c\ub4dc \ubc0f \uc720\uadf8\ub9b0 NAS \uc815\uc2dd \ubc30\ud3ec <em>(\uc608\uc815)<\/em><\/li>\n\n\n\n<li>\u23f3 <strong>[#15 | \uc6b4\uc601]<\/strong> DB \uc790\ub3d9 \ubc31\uc5c5 \uc2a4\ud06c\ub9bd\ud2b8 \uad6c\uc131 \ubc0f \uac00\uc871 \uc2e4\uc0ac\uc6a9 \ud6c4\uae30 <em>(\uc608\uc815)<\/em><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\uce74\uce74\uc624\ud1a1 \uac19\uc740 \ud06c\ub85c\uc2a4\ud50c\ub7ab\ud3fc \uba54\uc2e0\uc800 &#8216;\ub529\ub3d9(DingDong)&#8217; \ub9cc\ub4e4\uae30 \ud504\ub85c\uc81d\ud2b8 3\ud0c4!\uc774\ubc88 \uae00\uc5d0\uc11c\ub294 \uc6b0\ub9ac \uc9d1 \uba54\uc778 \uc11c\ubc84\uc778 \uc720\uadf8\ub9b0(Ugreen) NAS(UGOS Pro)\uc758 Docker \ud658\uacbd \uc704\uc5d0, \uc2a4\ub9c8\ud2b8\ud3f0 \ubcf4\uc548 \ud1b5\uc2e0(HTTPS)\uacfc \ub3c4\uba54\uc778 \ub77c\uc6b0\ud305\uc758 \ub300\ubb38 \uc5ed\ud560\uc744 \ub9e1\uc744 Caddy \uc6f9\uc11c\ubc84\uc640 \uba54\uc2e0\uc800\uc758 \ud575\uc2ec \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc778 PostgreSQL 16\uc744 \uac01\uac01 \ub3c5\ub9bd\ub41c \ucee8\ud14c\uc774\ub108\ub85c \ubd84\ub9ac\ud574\uc11c \uc138\ud305\ud569\ub2c8\ub2e4. 1. \uc65c Caddy\uc640 PostgreSQL\uc744 \ubd84\ub9ac\ud574\uc11c \uc124\uce58\ud560\uae4c\uc694? \ucc98\uc74c Docker\ub97c \uc138\ud305\ud560 \ub54c\ub294 \ud558\ub098\uc758 docker-compose.yml\uc5d0 \uc6f9\uc11c\ubc84\uc640 DB\ub97c \ud568\uaed8 \ubb36\uae30\ub3c4 &#8230; <a title=\"[\uac1c\ubc1c\uc77c\uc9c0 #03 | \uc778\ud504\ub77c] \uc720\uadf8\ub9b0 NAS\uc5d0 Caddy &amp; PostgreSQL \uad6c\ucd95\ud558\uae30\" class=\"read-more\" href=\"https:\/\/dingdong.goodday.ing\/?p=68\" aria-label=\"[\uac1c\ubc1c\uc77c\uc9c0 #03 | \uc778\ud504\ub77c] \uc720\uadf8\ub9b0 NAS\uc5d0 Caddy &amp; PostgreSQL \uad6c\ucd95\ud558\uae30\uc5d0 \ub300\ud574 \ub354 \uc790\uc138\ud788 \uc54c\uc544\ubcf4\uc138\uc694\">\ub354 \uc77d\uae30<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[4],"class_list":["post-68","post","type-post","status-publish","format-standard","hentry","category-dingdong-","tag-4"],"_links":{"self":[{"href":"https:\/\/dingdong.goodday.ing\/index.php?rest_route=\/wp\/v2\/posts\/68","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dingdong.goodday.ing\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dingdong.goodday.ing\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dingdong.goodday.ing\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dingdong.goodday.ing\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=68"}],"version-history":[{"count":24,"href":"https:\/\/dingdong.goodday.ing\/index.php?rest_route=\/wp\/v2\/posts\/68\/revisions"}],"predecessor-version":[{"id":197,"href":"https:\/\/dingdong.goodday.ing\/index.php?rest_route=\/wp\/v2\/posts\/68\/revisions\/197"}],"wp:attachment":[{"href":"https:\/\/dingdong.goodday.ing\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=68"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dingdong.goodday.ing\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=68"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dingdong.goodday.ing\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=68"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}