{"id":79993,"date":"2024-10-13T10:21:43","date_gmt":"2024-10-13T06:51:43","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/how-to-build-an-elm-land-project-for-production-36jo\/"},"modified":"2024-10-13T10:21:43","modified_gmt":"2024-10-13T06:51:43","slug":"how-to-build-an-elm-land-project-for-production-36jo","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/how-to-build-an-elm-land-project-for-production-36jo\/","title":{"rendered":"\u0686\u06af\u0648\u0646\u0647 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 Elm Land \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u0628\u0633\u0627\u0632\u06cc\u0645"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n            \u067e\u0633 \u0627\u0632 \u062a\u06a9\u0645\u06cc\u0644 \u067e\u0631\u0648\u0698\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u062e\u0648\u062f \u062f\u0631 Keycloak OAuth2 Token Exchange\u060c \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u0627\u06cc\u0646 \u0627\u06cc\u062f\u0647 \u0631\u0627 \u06af\u0633\u062a\u0631\u0634 \u062f\u0647\u0645 \u0648 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u062c\u062f\u06cc\u062f \u0628\u0647 \u0646\u0627\u0645 my-ai-doctor \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0645. \u0628\u0631\u062e\u0644\u0627\u0641 \u0646\u0633\u062e\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u0642\u0628\u0644\u06cc\u060c \u06a9\u0647 \u0628\u0631 \u0631\u0648\u06cc \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0633\u0627\u0632\u06cc \u0628\u0627\u0637\u0646 \u0645\u062a\u0645\u0631\u06a9\u0632 \u0628\u0648\u062f\u060c \u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u0627\u0632 Elm \u0628\u0631\u0627\u06cc \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 Docker Compose \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0647\u0631 \u0634\u0634 \u0633\u0631\u0648\u0631 \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f: \u0633\u0631\u0648\u0631 Keycloak\u060c \u0633\u0631\u0648\u0631 API\u060c \u0648 \u0633\u0631\u0648\u0631\u0647\u0627\u06cc \u0648\u0628 SPA \u0628\u0631\u0627\u06cc MyDoctor \u0648 MyHealth.<\/p>\n<p>  \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644\u0631 Elm \u0628\u0631\u0627\u06cc \u0644\u06cc\u0646\u0648\u06a9\u0633 ARM 64<\/p>\n<p>\u0627\u0648\u0644\u06cc\u0646 \u0686\u0627\u0644\u0634 \u0633\u0627\u062e\u062a \u067e\u0631\u0648\u0698\u0647 Elm Land \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0622\u0646 \u062f\u0631 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631\u0647\u0627\u06cc Docker \u0628\u0648\u062f. \u062f\u0631 \u0627\u0628\u062a\u062f\u0627\u060c \u0645\u0646 \u0627\u0632 \u06cc\u06a9 Dockerfile \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u067e\u0631\u0648\u0698\u0647 Elm UI \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645\u060c \u0627\u0645\u0627 \u0628\u0647 \u0632\u0648\u062f\u06cc \u0628\u0627 \u06cc\u06a9 \u0645\u0627\u0646\u0639 \u0645\u0648\u0627\u062c\u0647 \u0634\u062f\u0645:<\/p>\n<p> &gt; [build 8\/9] RUN npm install:<br \/>\n8.709 npm error code 1<br \/>\n8.709 npm error path \/app\/node_modules\/elm<br \/>\n8.709 npm error command failed<br \/>\n8.709 npm error command sh -c node install.js<br \/>\n8.709 npm error &#8212; ERROR &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n8.709 npm error<br \/>\n8.709 npm error I am detecting that your computer (linux_arm64) may not be compatible with any<br \/>\n8.709 npm error of the official pre-built binaries.<br \/>\n8.709 npm error<br \/>\n8.709 npm error I recommend against using the npm installer for your situation. Check out the<br \/>\n8.709 npm error alternative installers at https:\/\/github.com\/elm\/compiler\/releases\/tag\/0.19.1<br \/>\n8.709 npm error to see if there is something that will work better for you.<br \/>\n8.709 npm error<br \/>\n8.709 npm error From there I recommend asking for guidance on Slack or Discourse to find someone<br \/>\n8.709 npm error who can help with your specific situation.<br \/>\n8.709 npm error<br \/>\n8.709 npm error &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u067e\u0633 \u0627\u0632 \u0628\u0631\u0631\u0633\u06cc\u060c \u0645\u062a\u0648\u062c\u0647 \u0634\u062f\u0645 \u06a9\u0647 \u0622\u062e\u0631\u06cc\u0646 \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644\u0631 Elm (\u0646\u0633\u062e\u0647 0.19.1) \u0627\u0632 linux_arm64 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0646\u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0628\u062f\u0627\u0646 \u0645\u0639\u0646\u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0645 \u067e\u0631\u0648\u0698\u0647\u200c\u0647\u0627\u06cc Elm \u0631\u0627 \u0628\u0631 \u0631\u0648\u06cc Apple Mac Mini Pro \u062e\u0648\u062f \u0628\u0647 \u0635\u0648\u0631\u062a \u0628\u0648\u0645\u06cc \u0628\u0633\u0627\u0632\u0645 \u0648 \u0627\u062c\u0631\u0627 \u06a9\u0646\u0645\u060c \u0627\u0645\u0627 \u0646\u0647 \u062f\u0631 Docker. \u062e\u0648\u0634\u0628\u062e\u062a\u0627\u0646\u0647\u060c Simon Lydell \u0648 Mario Rogic \u0646\u0633\u062e\u0647 \u062c\u062f\u06cc\u062f\u06cc \u0627\u0632 \u0628\u0633\u062a\u0647 elm npm \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0646\u062f \u06a9\u0647 \u0627\u0632 Linux ARM 64 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0631 \u0627\u0633\u0627\u0633 \u0627\u06cc\u0646 \u0628\u062d\u062b\u060c \u0631\u0627\u0647 \u062d\u0644 \u0627\u06cc\u0646 \u0628\u0648\u062f \u06a9\u0647 \u0628\u0633\u062a\u0647 elm \u062f\u0631 \u0645\u0646 \u0644\u063a\u0648 \u0634\u0648\u062f. package.json \u0628\u0627 \u0627\u0641\u0632\u0648\u062f\u0646 \u0627\u06cc\u0646 \u062e\u0637\u0648\u0637 \u0641\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>&#8220;overrides&#8221;: {<br \/>\n  &#8220;elm&#8221;: &#8220;npm:@lydell\/elm&#8221;<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u0646 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u0645\u0627\u0698\u0648\u0644 Elm npm \u062f\u0631 \u062f\u0627\u0646\u0644\u0648\u062f \u0645\u062d\u0644\u06cc \u0645\u06cc \u0634\u0648\u062f node_modules \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0628\u0627 @lydell\/elm \u0645\u0627\u0698\u0648\u0644\u060c \u0628\u0647 \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644\u0631 \u063a\u06cc\u0631 \u0631\u0633\u0645\u06cc Elm \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u0628\u0647 \u062f\u0631\u0633\u062a\u06cc \u0631\u0648\u06cc \u067e\u0644\u062a \u0641\u0631\u0645 \u0644\u06cc\u0646\u0648\u06a9\u0633 ARM64 \u06a9\u0627\u0631 \u06a9\u0646\u062f.<\/p>\n<p>  \u0627\u0646\u062a\u0642\u0627\u0644 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0628\u0647 \u06a9\u062f UI<\/p>\n<p>\u0647\u0646\u06af\u0627\u0645 \u062a\u0648\u0633\u0639\u0647 \u0633\u06cc\u0633\u062a\u0645 AI Doctor \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc\u060c UI SPA \u0628\u0647 API \u0628\u0627\u0637\u0646 \u0645\u062a\u0635\u0644 \u0645\u06cc \u0634\u0648\u062f http:\/\/api.mydoctor:8081\/api\/v1\/records. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627\u06cc \u06a9\u0644 \u0646\u0633\u062e\u0647 \u06cc \u0646\u0645\u0627\u06cc\u0634\u06cc \u062f\u0631 \u062f\u0627\u06a9\u0631\u060c API \u0627\u0632 \u0637\u0631\u06cc\u0642 \u067e\u0648\u0631\u062a 80 \u0628\u0627 \u06a9\u0645\u06a9 \u06cc\u06a9 \u067e\u0631\u0648\u06a9\u0633\u06cc \u0645\u0639\u06a9\u0648\u0633 Nginx \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0633\u062a: http:\/\/api.mydoctor\/api\/v1\/records. \u0686\u0627\u0644\u0634 \u0627\u06cc\u0646 \u0628\u0648\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0628\u0647 \u0635\u0648\u0631\u062a \u067e\u0648\u06cc\u0627 URL API Backend \u0631\u0627 \u062f\u0631 \u06a9\u062f Elm \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u0645.<\/p>\n<p>\u0645\u0633\u062a\u0646\u062f\u0627\u062a Elm Land \u0628\u0647 \u0637\u0648\u0631 \u062e\u0644\u0627\u0635\u0647 \u0628\u0647 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0627\u0634\u0627\u0631\u0647 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0627\u0645\u0627 \u0628\u062f\u0648\u0646 \u0645\u062b\u0627\u0644 \u0647\u0627\u06cc \u062f\u0642\u06cc\u0642. \u0645\u0646 \u06cc\u06a9 \u0648\u0628\u0644\u0627\u06af \u0645\u0641\u06cc\u062f \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0645\u060c \u0628\u0647 \u0646\u0627\u0645 Deploying an Elm Frontend to Cloudflare Pages\u060c \u06a9\u0647 \u0646\u06a9\u0627\u062a\u06cc \u0631\u0627 \u062f\u0631 \u0645\u0648\u0631\u062f \u0646\u062d\u0648\u0647 \u0627\u0646\u062a\u0642\u0627\u0644 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 Elm Land \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u06a9\u0631\u062f. \u067e\u0633 \u0627\u0632 \u0645\u0637\u0627\u0644\u0639\u0647 \u0645\u062c\u062f\u062f \u0627\u0633\u0646\u0627\u062f Elm Land (\u0627\u06cc\u0646\u062c\u0627 \u0648 \u0627\u06cc\u0646\u062c\u0627)\u060c \u0645\u062a\u0648\u062c\u0647 \u0634\u062f\u0645 \u06a9\u0647 \u0627\u0646\u062a\u0642\u0627\u0644 \u0645\u0642\u0627\u062f\u06cc\u0631 \u0645\u062e\u062a\u0644\u0641 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0628\u0647 \u06a9\u062f Elm \u06a9\u0627\u0645\u0644\u0627\u064b \u0633\u0627\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u062f\u0631 interop.js \u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0647 \u0648 \u0628\u0647 \u06a9\u062f Elm \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u06cc\u0645 Flags. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644:<\/p>\n<p>export const flags = ({ env }) =&gt; {<br \/>\n  return {<br \/>\n    apiBaseUrl: env.API_BASE_URL<br \/>\n  };<br \/>\n};<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627\u060c URL \u067e\u0627\u06cc\u0647 API backend \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0641\u06cc\u0644\u062f \u062f\u0631 \u0622\u0646 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u0645 flags\u060c \u06a9\u0647 \u0633\u067e\u0633 \u062f\u0631 \u0622\u0646 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u0634\u0648\u062f Shared.Model.<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0628\u0627\u06cc\u062f \u0645\u0627\u0698\u0648\u0644 Shared \u0631\u0627 \u0633\u0641\u0627\u0631\u0634\u06cc \u06a9\u0646\u0645:<\/p>\n<p>elm-land customize shared<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 \u0633\u0647 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0627\u0632 \u0622\u0646 \u062c\u0627\u0628\u062c\u0627 \u0645\u06cc \u06a9\u0646\u062f .elm-land \u0628\u0647 src \u067e\u0648\u0634\u0647: Shared.elm\u060c Shared\/Model.elm \u0648 Shared\/Msg.elm.<\/p>\n<p>\u0628\u0639\u062f\u060c \u0641\u06cc\u0644\u062f \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0645 apiBaseUrl \u0628\u0647 Shared.Model.Model. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u06a9\u062f \u0628\u0631\u0627\u06cc Shared\/Model.elm:<\/p>\n<p>module Shared.Model exposing (Model)<\/p>\n<p>type alias Model =<br \/>\n  { apiBaseUrl : String<br \/>\n  }<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u062f\u0631 Shared.elm\u060c \u067e\u0631\u0686\u0645 \u0647\u0627 \u0631\u0627 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u06a9\u0631\u062f\u0645 \u0648 \u06af\u0630\u0634\u062a\u0645 apiBaseUrl \u0628\u0647 Shared.Model.Model:<\/p>\n<p>&#8212; FLAGS<\/p>\n<p>type alias Flags =<br \/>\n  { apiBaseUrl : String<br \/>\n  }<\/p>\n<p>decoder : Json.Decode.Decoder Flags<br \/>\ndecoder =<br \/>\n  Json.Decode.map Flags<br \/>\n    (Json.Decode.field &#8220;apiBaseUrl&#8221; Json.Decode.string)<\/p>\n<p>&#8212; INIT<br \/>\ntype alias Model =<br \/>\n  Shared.Model.Model<\/p>\n<p>init : Result Json.Decode.Error Flags -&gt; Route () -&gt; ( Model, Effect Msg )<br \/>\ninit flagsResult route =<br \/>\n  ( { apiBaseUrl =<br \/>\n        case flagsResult of<br \/>\n          Ok flags -&gt; flags.apiBaseUrl<br \/>\n          Err _ -&gt; &#8220;&#8221;<br \/>\n    }<br \/>\n  , Effect.none<br \/>\n  )<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0631\u0627 Shared.Model.Model (\u06cc\u0627 Shared.Model) \u0633\u067e\u0633 \u0628\u0647 \u0647\u0631 \u0635\u0641\u062d\u0647 \u0645\u0646\u062a\u0642\u0644 \u0645\u06cc \u0634\u0648\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 apiBaseUrl \u0647\u0631 \u0632\u0645\u0627\u0646 \u06a9\u0647 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0628\u0627\u0637\u0646 API \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645 \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0633\u062a. \u06a9\u062f \u0646\u0645\u0648\u0646\u0647 \u0631\u0627 \u062f\u0631 Pages\/Home_.elm<\/p>\n<p>  \u062a\u0646\u0638\u06cc\u0645 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc<\/p>\n<p>\u0628\u0631\u0627\u06cc \u062a\u0646\u0638\u06cc\u0645 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0645\u0627\u0646\u0646\u062f API_BASE_URL\u060c \u0627\u0628\u062a\u062f\u0627 \u0628\u0627\u06cc\u062f \u0622\u0646\u0647\u0627 \u0631\u0627 \u062f\u0631 \u0642\u0633\u0645\u062a \u0627\u0639\u0644\u0627\u0645 \u06a9\u0646\u06cc\u062f elm-land.json \u0641\u0627\u06cc\u0644 \u062a\u062d\u062a app.env\u060c \u0628\u0647 \u0639\u0646\u0648\u0627\u0646:<\/p>\n<p>{<br \/>\n  &#8220;app&#8221;: {<br \/>\n    &#8220;env&#8221;: [ &#8220;API_BASE_URL&#8221; ]\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0628\u0647 \u062f\u0644\u0627\u06cc\u0644 \u0627\u0645\u0646\u06cc\u062a\u06cc\u060c \u0647\u0645\u0647 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0628\u0647 \u0637\u0648\u0631 \u067e\u06cc\u0634 \u0641\u0631\u0636 \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 Elm Land \u0634\u0645\u0627 \u067e\u0646\u0647\u0627\u0646 \u0647\u0633\u062a\u0646\u062f.\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u06cc\u06a9 \u0645\u062a\u063a\u06cc\u0631 \u0645\u062d\u06cc\u0637\u06cc \u0631\u0627 \u0628\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0628\u06af\u0630\u0627\u0631\u06cc\u062f\u060c \u0641\u06cc\u0644\u062f app.env \u0686\u06a9 \u06cc\u06a9 \u0646\u0642\u0637\u0647 \u0627\u0633\u062a<\/p>\n<p>\u0645\u0646 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f elm-land.json \u0641\u0627\u06cc\u0644\u060c \u0648 \u0645\u0646 \u0647\u0645 \u0627\u0639\u0644\u0627\u0645 \u06a9\u0631\u062f\u0645 AUTH_SERVER_URL \u0628\u0631\u0627\u06cc \u0622\u062f\u0631\u0633 \u0633\u0631\u0648\u0631 Keycloak \u0648 WS_BASE_URL \u0628\u0631\u0627\u06cc \u0622\u062f\u0631\u0633 WebSocket \u0631\u0628\u0627\u062a \u0686\u062a \u0628\u0627\u0637\u0646.<\/p>\n<p>\u0633\u067e\u0633\u060c \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0639\u0628\u0648\u0631 \u06a9\u0646\u06cc\u062f API_BASE_URL \u062f\u0631 \u062e\u0637 \u0641\u0631\u0645\u0627\u0646 \u0647\u0646\u06af\u0627\u0645 \u062a\u0648\u0633\u0639\u0647 \u0645\u062d\u0644\u06cc:<\/p>\n<p>API_BASE_URL=http:\/\/api.mydoctor:8081\/api\/v1 elm-land server<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0647\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f\u06cc\u060c \u0627\u0632 ENV \u0628\u062e\u0634\u0646\u0627\u0645\u0647 \u062f\u0631 Dockerfile \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646:<\/p>\n<p>ENV API_BASE_URL=&#8221;http:\/\/api.mydoctor\/api\/v1&#8243;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0645\u0646 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f Dockerfile \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 mydoctor-ui.<\/p>\n<p>\u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0645\u0627\u0645 \u06a9\u062f \u0645\u0646\u0628\u0639 \u0631\u0627 \u062f\u0631 https:\/\/github.com\/jiwhiz\/my-ai-doctor \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0647\u0646\u0648\u0632 \u06cc\u06a9 \u06a9\u0627\u0631 \u062f\u0631 \u062d\u0627\u0644 \u067e\u06cc\u0634\u0631\u0641\u062a \u0627\u0633\u062a. \u0644\u0637\u0641\u0627 \u0627\u06af\u0631 \u0641\u06a9\u0631 \u0645\u06cc \u06a9\u0646\u06cc\u062f \u0627\u06cc\u0646 \u0648\u0628\u0644\u0627\u06af \u0645\u0641\u06cc\u062f \u0627\u0633\u062a \u0628\u0647 \u0645\u0646 \u0627\u0637\u0644\u0627\u0639 \u062f\u0647\u06cc\u062f.<\/p>\n<div data-article-id=\"2036201\" id=\"article-body\">\n<p>\u067e\u0633 \u0627\u0632 \u062a\u06a9\u0645\u06cc\u0644 \u067e\u0631\u0648\u0698\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u062e\u0648\u062f \u062f\u0631 Keycloak OAuth2 Token Exchange\u060c \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u0627\u06cc\u0646 \u0627\u06cc\u062f\u0647 \u0631\u0627 \u06af\u0633\u062a\u0631\u0634 \u062f\u0647\u0645 \u0648 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u062c\u062f\u06cc\u062f \u0628\u0647 \u0646\u0627\u0645 my-ai-doctor \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0645. \u0628\u0631\u062e\u0644\u0627\u0641 \u0646\u0633\u062e\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u0642\u0628\u0644\u06cc\u060c \u06a9\u0647 \u0628\u0631 \u0631\u0648\u06cc \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0633\u0627\u0632\u06cc \u0628\u0627\u0637\u0646 \u0645\u062a\u0645\u0631\u06a9\u0632 \u0628\u0648\u062f\u060c \u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u0627\u0632 Elm \u0628\u0631\u0627\u06cc \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 Docker Compose \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0647\u0631 \u0634\u0634 \u0633\u0631\u0648\u0631 \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f: \u0633\u0631\u0648\u0631 Keycloak\u060c \u0633\u0631\u0648\u0631 API\u060c \u0648 \u0633\u0631\u0648\u0631\u0647\u0627\u06cc \u0648\u0628 SPA \u0628\u0631\u0627\u06cc MyDoctor \u0648 MyHealth.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/how-to-build-an-elm-land-project-for-production-36jo\/#%D8%AA%D8%B9%D9%85%DB%8C%D8%B1_%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84%D8%B1_Elm_%D8%A8%D8%B1%D8%A7%DB%8C_%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3_ARM_64\" >\u062a\u0639\u0645\u06cc\u0631 \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644\u0631 Elm \u0628\u0631\u0627\u06cc \u0644\u06cc\u0646\u0648\u06a9\u0633 ARM 64<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/how-to-build-an-elm-land-project-for-production-36jo\/#%D8%A7%D9%86%D8%AA%D9%82%D8%A7%D9%84_%D9%85%D8%AA%D8%BA%DB%8C%D8%B1%D9%87%D8%A7%DB%8C_%D9%85%D8%AD%DB%8C%D8%B7%DB%8C_%D8%A8%D9%87_%DA%A9%D8%AF_UI\" >\u0627\u0646\u062a\u0642\u0627\u0644 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0628\u0647 \u06a9\u062f UI<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/how-to-build-an-elm-land-project-for-production-36jo\/#%D8%AA%D9%86%D8%B8%DB%8C%D9%85_%D9%85%D8%AA%D8%BA%DB%8C%D8%B1%D9%87%D8%A7%DB%8C_%D9%85%D8%AD%DB%8C%D8%B7%DB%8C\" >\u062a\u0646\u0638\u06cc\u0645 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AA%D8%B9%D9%85%DB%8C%D8%B1_%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84%D8%B1_Elm_%D8%A8%D8%B1%D8%A7%DB%8C_%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3_ARM_64\"><\/span>\n<p>  \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644\u0631 Elm \u0628\u0631\u0627\u06cc \u0644\u06cc\u0646\u0648\u06a9\u0633 ARM 64<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u0648\u0644\u06cc\u0646 \u0686\u0627\u0644\u0634 \u0633\u0627\u062e\u062a \u067e\u0631\u0648\u0698\u0647 Elm Land \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0622\u0646 \u062f\u0631 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631\u0647\u0627\u06cc Docker \u0628\u0648\u062f. \u062f\u0631 \u0627\u0628\u062a\u062f\u0627\u060c \u0645\u0646 \u0627\u0632 \u06cc\u06a9 Dockerfile \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u067e\u0631\u0648\u0698\u0647 Elm UI \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645\u060c \u0627\u0645\u0627 \u0628\u0647 \u0632\u0648\u062f\u06cc \u0628\u0627 \u06cc\u06a9 \u0645\u0627\u0646\u0639 \u0645\u0648\u0627\u062c\u0647 \u0634\u062f\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code> &gt; [build 8\/9] RUN npm install:                                                                                                                             \n8.709 npm error code 1                                                                                                                                     \n8.709 npm error path \/app\/node_modules\/elm                                                                                                                 \n8.709 npm error command failed                                                                                                                             \n8.709 npm error command sh -c node install.js                                                                                                              \n8.709 npm error -- ERROR -----------------------------------------------------------------------\n8.709 npm error\n8.709 npm error I am detecting that your computer (linux_arm64) may not be compatible with any\n8.709 npm error of the official pre-built binaries.\n8.709 npm error\n8.709 npm error I recommend against using the npm installer for your situation. Check out the\n8.709 npm error alternative installers at https:\/\/github.com\/elm\/compiler\/releases\/tag\/0.19.1\n8.709 npm error to see if there is something that will work better for you.\n8.709 npm error\n8.709 npm error From there I recommend asking for guidance on Slack or Discourse to find someone\n8.709 npm error who can help with your specific situation.\n8.709 npm error\n8.709 npm error --------------------------------------------------------------------------------\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u067e\u0633 \u0627\u0632 \u0628\u0631\u0631\u0633\u06cc\u060c \u0645\u062a\u0648\u062c\u0647 \u0634\u062f\u0645 \u06a9\u0647 \u0622\u062e\u0631\u06cc\u0646 \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644\u0631 Elm (\u0646\u0633\u062e\u0647 0.19.1) \u0627\u0632 linux_arm64 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0646\u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0628\u062f\u0627\u0646 \u0645\u0639\u0646\u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0645 \u067e\u0631\u0648\u0698\u0647\u200c\u0647\u0627\u06cc Elm \u0631\u0627 \u0628\u0631 \u0631\u0648\u06cc Apple Mac Mini Pro \u062e\u0648\u062f \u0628\u0647 \u0635\u0648\u0631\u062a \u0628\u0648\u0645\u06cc \u0628\u0633\u0627\u0632\u0645 \u0648 \u0627\u062c\u0631\u0627 \u06a9\u0646\u0645\u060c \u0627\u0645\u0627 \u0646\u0647 \u062f\u0631 Docker. \u062e\u0648\u0634\u0628\u062e\u062a\u0627\u0646\u0647\u060c Simon Lydell \u0648 Mario Rogic \u0646\u0633\u062e\u0647 \u062c\u062f\u06cc\u062f\u06cc \u0627\u0632 \u0628\u0633\u062a\u0647 elm npm \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0646\u062f \u06a9\u0647 \u0627\u0632 Linux ARM 64 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0631 \u0627\u0633\u0627\u0633 \u0627\u06cc\u0646 \u0628\u062d\u062b\u060c \u0631\u0627\u0647 \u062d\u0644 \u0627\u06cc\u0646 \u0628\u0648\u062f \u06a9\u0647 \u0628\u0633\u062a\u0647 elm \u062f\u0631 \u0645\u0646 \u0644\u063a\u0648 \u0634\u0648\u062f. <code>package.json<\/code> \u0628\u0627 \u0627\u0641\u0632\u0648\u062f\u0646 \u0627\u06cc\u0646 \u062e\u0637\u0648\u0637 \u0641\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>\"overrides\": {\n  \"elm\": \"npm:@lydell\/elm\"\n}\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u0645\u0627\u0698\u0648\u0644 Elm npm \u062f\u0631 \u062f\u0627\u0646\u0644\u0648\u062f \u0645\u062d\u0644\u06cc \u0645\u06cc \u0634\u0648\u062f <code>node_modules<\/code> \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0628\u0627 <code>@lydell\/elm<\/code> \u0645\u0627\u0698\u0648\u0644\u060c \u0628\u0647 \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644\u0631 \u063a\u06cc\u0631 \u0631\u0633\u0645\u06cc Elm \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u0628\u0647 \u062f\u0631\u0633\u062a\u06cc \u0631\u0648\u06cc \u067e\u0644\u062a \u0641\u0631\u0645 \u0644\u06cc\u0646\u0648\u06a9\u0633 ARM64 \u06a9\u0627\u0631 \u06a9\u0646\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%D9%86%D8%AA%D9%82%D8%A7%D9%84_%D9%85%D8%AA%D8%BA%DB%8C%D8%B1%D9%87%D8%A7%DB%8C_%D9%85%D8%AD%DB%8C%D8%B7%DB%8C_%D8%A8%D9%87_%DA%A9%D8%AF_UI\"><\/span>\n<p>  \u0627\u0646\u062a\u0642\u0627\u0644 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0628\u0647 \u06a9\u062f UI<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0647\u0646\u06af\u0627\u0645 \u062a\u0648\u0633\u0639\u0647 \u0633\u06cc\u0633\u062a\u0645 AI Doctor \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc\u060c UI SPA \u0628\u0647 API \u0628\u0627\u0637\u0646 \u0645\u062a\u0635\u0644 \u0645\u06cc \u0634\u0648\u062f <code>http:\/\/api.mydoctor:8081\/api\/v1\/records<\/code>. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627\u06cc \u06a9\u0644 \u0646\u0633\u062e\u0647 \u06cc \u0646\u0645\u0627\u06cc\u0634\u06cc \u062f\u0631 \u062f\u0627\u06a9\u0631\u060c API \u0627\u0632 \u0637\u0631\u06cc\u0642 \u067e\u0648\u0631\u062a 80 \u0628\u0627 \u06a9\u0645\u06a9 \u06cc\u06a9 \u067e\u0631\u0648\u06a9\u0633\u06cc \u0645\u0639\u06a9\u0648\u0633 Nginx \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0633\u062a: <code>http:\/\/api.mydoctor\/api\/v1\/records<\/code>. \u0686\u0627\u0644\u0634 \u0627\u06cc\u0646 \u0628\u0648\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0628\u0647 \u0635\u0648\u0631\u062a \u067e\u0648\u06cc\u0627 URL API Backend \u0631\u0627 \u062f\u0631 \u06a9\u062f Elm \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u0645.<\/p>\n<p>\u0645\u0633\u062a\u0646\u062f\u0627\u062a Elm Land \u0628\u0647 \u0637\u0648\u0631 \u062e\u0644\u0627\u0635\u0647 \u0628\u0647 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0627\u0634\u0627\u0631\u0647 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0627\u0645\u0627 \u0628\u062f\u0648\u0646 \u0645\u062b\u0627\u0644 \u0647\u0627\u06cc \u062f\u0642\u06cc\u0642. \u0645\u0646 \u06cc\u06a9 \u0648\u0628\u0644\u0627\u06af \u0645\u0641\u06cc\u062f \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0645\u060c \u0628\u0647 \u0646\u0627\u0645 Deploying an Elm Frontend to Cloudflare Pages\u060c \u06a9\u0647 \u0646\u06a9\u0627\u062a\u06cc \u0631\u0627 \u062f\u0631 \u0645\u0648\u0631\u062f \u0646\u062d\u0648\u0647 \u0627\u0646\u062a\u0642\u0627\u0644 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 Elm Land \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u06a9\u0631\u062f. \u067e\u0633 \u0627\u0632 \u0645\u0637\u0627\u0644\u0639\u0647 \u0645\u062c\u062f\u062f \u0627\u0633\u0646\u0627\u062f Elm Land (\u0627\u06cc\u0646\u062c\u0627 \u0648 \u0627\u06cc\u0646\u062c\u0627)\u060c \u0645\u062a\u0648\u062c\u0647 \u0634\u062f\u0645 \u06a9\u0647 \u0627\u0646\u062a\u0642\u0627\u0644 \u0645\u0642\u0627\u062f\u06cc\u0631 \u0645\u062e\u062a\u0644\u0641 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0628\u0647 \u06a9\u062f Elm \u06a9\u0627\u0645\u0644\u0627\u064b \u0633\u0627\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u062f\u0631 <code>interop.js<\/code> \u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0647 \u0648 \u0628\u0647 \u06a9\u062f Elm \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u06cc\u0645 <code>Flags<\/code>. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">flags<\/span> <span class=\"o\">=<\/span> <span class=\"p\">({<\/span> <span class=\"nx\">env<\/span> <span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">return<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">apiBaseUrl<\/span><span class=\"p\">:<\/span> <span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">API_BASE_URL<\/span>\n  <span class=\"p\">};<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627\u060c URL \u067e\u0627\u06cc\u0647 API backend \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0641\u06cc\u0644\u062f \u062f\u0631 \u0622\u0646 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>flags<\/code>\u060c \u06a9\u0647 \u0633\u067e\u0633 \u062f\u0631 \u0622\u0646 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u0634\u0648\u062f <code>Shared.Model<\/code>.<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0628\u0627\u06cc\u062f \u0645\u0627\u0698\u0648\u0644 Shared \u0631\u0627 \u0633\u0641\u0627\u0631\u0634\u06cc \u06a9\u0646\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>elm-land customize shared\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 \u0633\u0647 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0627\u0632 \u0622\u0646 \u062c\u0627\u0628\u062c\u0627 \u0645\u06cc \u06a9\u0646\u062f <code>.elm-land<\/code> \u0628\u0647 <code>src<\/code> \u067e\u0648\u0634\u0647: <code>Shared.elm<\/code>\u060c <code>Shared\/Model.elm<\/code> \u0648 <code>Shared\/Msg.elm<\/code>.<\/p>\n<p>\u0628\u0639\u062f\u060c \u0641\u06cc\u0644\u062f \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0645 <code>apiBaseUrl<\/code> \u0628\u0647 <code>Shared.Model.Model<\/code>. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u06a9\u062f \u0628\u0631\u0627\u06cc <code>Shared\/Model.elm<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight elm\"><code><span class=\"k\">module<\/span> <span class=\"kt\">Shared<\/span><span class=\"o\">.<\/span><span class=\"kt\">Model<\/span> <span class=\"k\">exposing<\/span> <span class=\"p\">(<\/span><span class=\"kt\">Model<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"k\">alias<\/span> <span class=\"kt\">Model<\/span> <span class=\"o\">=<\/span>\n  <span class=\"p\">{<\/span> <span class=\"n\">apiBaseUrl<\/span> <span class=\"p\">:<\/span> <span class=\"kt\">String<\/span>\n  <span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 <code>Shared.elm<\/code>\u060c \u067e\u0631\u0686\u0645 \u0647\u0627 \u0631\u0627 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u06a9\u0631\u062f\u0645 \u0648 \u06af\u0630\u0634\u062a\u0645 <code>apiBaseUrl<\/code> \u0628\u0647 <code>Shared.Model.Model<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight elm\"><code><span class=\"c1\">-- FLAGS<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"k\">alias<\/span> <span class=\"kt\">Flags<\/span> <span class=\"o\">=<\/span>\n  <span class=\"p\">{<\/span> <span class=\"n\">apiBaseUrl<\/span> <span class=\"p\">:<\/span> <span class=\"kt\">String<\/span>\n  <span class=\"p\">}<\/span>\n\n<span class=\"n\">decoder<\/span> <span class=\"p\">:<\/span> <span class=\"kt\">Json<\/span><span class=\"o\">.<\/span><span class=\"kt\">Decode<\/span><span class=\"o\">.<\/span><span class=\"kt\">Decoder<\/span> <span class=\"kt\">Flags<\/span>\n<span class=\"n\">decoder<\/span> <span class=\"o\">=<\/span>\n  <span class=\"kt\">Json<\/span><span class=\"o\">.<\/span><span class=\"kt\">Decode<\/span><span class=\"o\">.<\/span><span class=\"n\">map<\/span> <span class=\"kt\">Flags<\/span>\n    <span class=\"p\">(<\/span><span class=\"kt\">Json<\/span><span class=\"o\">.<\/span><span class=\"kt\">Decode<\/span><span class=\"o\">.<\/span><span class=\"n\">field<\/span> <span class=\"s\">\"<\/span><span class=\"s2\">apiBaseUrl\"<\/span> <span class=\"kt\">Json<\/span><span class=\"o\">.<\/span><span class=\"kt\">Decode<\/span><span class=\"o\">.<\/span><span class=\"n\">string<\/span><span class=\"p\">)<\/span>\n\n<span class=\"c1\">-- INIT<\/span>\n<span class=\"k\">type<\/span> <span class=\"k\">alias<\/span> <span class=\"kt\">Model<\/span> <span class=\"o\">=<\/span>\n  <span class=\"kt\">Shared<\/span><span class=\"o\">.<\/span><span class=\"kt\">Model<\/span><span class=\"o\">.<\/span><span class=\"kt\">Model<\/span>\n\n<span class=\"n\">init<\/span> <span class=\"p\">:<\/span> <span class=\"kt\">Result<\/span> <span class=\"kt\">Json<\/span><span class=\"o\">.<\/span><span class=\"kt\">Decode<\/span><span class=\"o\">.<\/span><span class=\"kt\">Error<\/span> <span class=\"kt\">Flags<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"kt\">Route<\/span> <span class=\"p\">()<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"p\">(<\/span> <span class=\"kt\">Model<\/span><span class=\"o\">,<\/span> <span class=\"kt\">Effect<\/span> <span class=\"kt\">Msg<\/span> <span class=\"p\">)<\/span>\n<span class=\"n\">init<\/span> <span class=\"n\">flagsResult<\/span> <span class=\"n\">route<\/span> <span class=\"o\">=<\/span>\n  <span class=\"p\">(<\/span> <span class=\"p\">{<\/span> <span class=\"n\">apiBaseUrl<\/span> <span class=\"o\">=<\/span>\n        <span class=\"k\">case<\/span> <span class=\"n\">flagsResult<\/span> <span class=\"k\">of<\/span>\n          <span class=\"kt\">Ok<\/span> <span class=\"n\">flags<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">flags<\/span><span class=\"o\">.<\/span><span class=\"n\">apiBaseUrl<\/span>\n          <span class=\"kt\">Err<\/span> <span class=\"n\">_<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"s\">\"<\/span><span class=\"s2\">\"<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"o\">,<\/span> <span class=\"kt\">Effect<\/span><span class=\"o\">.<\/span><span class=\"n\">none<\/span>\n  <span class=\"p\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0631\u0627 <code>Shared.Model.Model<\/code> (\u06cc\u0627 <code>Shared.Model<\/code>) \u0633\u067e\u0633 \u0628\u0647 \u0647\u0631 \u0635\u0641\u062d\u0647 \u0645\u0646\u062a\u0642\u0644 \u0645\u06cc \u0634\u0648\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 <code>apiBaseUrl<\/code> \u0647\u0631 \u0632\u0645\u0627\u0646 \u06a9\u0647 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0628\u0627\u0637\u0646 API \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645 \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0633\u062a. \u06a9\u062f \u0646\u0645\u0648\u0646\u0647 \u0631\u0627 \u062f\u0631 <code>Pages\/Home_.elm<\/code><\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AA%D9%86%D8%B8%DB%8C%D9%85_%D9%85%D8%AA%D8%BA%DB%8C%D8%B1%D9%87%D8%A7%DB%8C_%D9%85%D8%AD%DB%8C%D8%B7%DB%8C\"><\/span>\n<p>  \u062a\u0646\u0638\u06cc\u0645 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0631\u0627\u06cc \u062a\u0646\u0638\u06cc\u0645 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0645\u0627\u0646\u0646\u062f <code>API_BASE_URL<\/code>\u060c \u0627\u0628\u062a\u062f\u0627 \u0628\u0627\u06cc\u062f \u0622\u0646\u0647\u0627 \u0631\u0627 \u062f\u0631 \u0642\u0633\u0645\u062a \u0627\u0639\u0644\u0627\u0645 \u06a9\u0646\u06cc\u062f <code>elm-land.json<\/code> \u0641\u0627\u06cc\u0644 \u062a\u062d\u062a app.env\u060c \u0628\u0647 \u0639\u0646\u0648\u0627\u0646:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"app\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"env\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"API_BASE_URL\"<\/span><span class=\"w\"> <\/span><span class=\"p\">]<\/span><span class=\"w\">\n  <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<blockquote>\n<p>\u0628\u0647 \u062f\u0644\u0627\u06cc\u0644 \u0627\u0645\u0646\u06cc\u062a\u06cc\u060c \u0647\u0645\u0647 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0628\u0647 \u0637\u0648\u0631 \u067e\u06cc\u0634 \u0641\u0631\u0636 \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 Elm Land \u0634\u0645\u0627 \u067e\u0646\u0647\u0627\u0646 \u0647\u0633\u062a\u0646\u062f.<br \/>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u06cc\u06a9 \u0645\u062a\u063a\u06cc\u0631 \u0645\u062d\u06cc\u0637\u06cc \u0631\u0627 \u0628\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0628\u06af\u0630\u0627\u0631\u06cc\u062f\u060c \u0641\u06cc\u0644\u062f app.env \u0686\u06a9 \u06cc\u06a9 \u0646\u0642\u0637\u0647 \u0627\u0633\u062a<\/p>\n<\/blockquote>\n<p>\u0645\u0646 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f <code>elm-land.json<\/code> \u0641\u0627\u06cc\u0644\u060c \u0648 \u0645\u0646 \u0647\u0645 \u0627\u0639\u0644\u0627\u0645 \u06a9\u0631\u062f\u0645 <code>AUTH_SERVER_URL<\/code> \u0628\u0631\u0627\u06cc \u0622\u062f\u0631\u0633 \u0633\u0631\u0648\u0631 Keycloak \u0648 <code>WS_BASE_URL<\/code> \u0628\u0631\u0627\u06cc \u0622\u062f\u0631\u0633 WebSocket \u0631\u0628\u0627\u062a \u0686\u062a \u0628\u0627\u0637\u0646.<\/p>\n<p>\u0633\u067e\u0633\u060c \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0639\u0628\u0648\u0631 \u06a9\u0646\u06cc\u062f <code>API_BASE_URL<\/code> \u062f\u0631 \u062e\u0637 \u0641\u0631\u0645\u0627\u0646 \u0647\u0646\u06af\u0627\u0645 \u062a\u0648\u0633\u0639\u0647 \u0645\u062d\u0644\u06cc:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>API_BASE_URL=http:\/\/api.mydoctor:8081\/api\/v1 elm-land server\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0647\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f\u06cc\u060c \u0627\u0632 <code>ENV<\/code> \u0628\u062e\u0634\u0646\u0627\u0645\u0647 \u062f\u0631 <code>Dockerfile<\/code> \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight docker\"><code><span class=\"k\">ENV<\/span><span class=\"s\"> API_BASE_URL=\"http:\/\/api.mydoctor\/api\/v1\"<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0646 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f <code>Dockerfile<\/code> \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 mydoctor-ui.<\/p>\n<p>\u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0645\u0627\u0645 \u06a9\u062f \u0645\u0646\u0628\u0639 \u0631\u0627 \u062f\u0631 https:\/\/github.com\/jiwhiz\/my-ai-doctor \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0647\u0646\u0648\u0632 \u06cc\u06a9 \u06a9\u0627\u0631 \u062f\u0631 \u062d\u0627\u0644 \u067e\u06cc\u0634\u0631\u0641\u062a \u0627\u0633\u062a. \u0644\u0637\u0641\u0627 \u0627\u06af\u0631 \u0641\u06a9\u0631 \u0645\u06cc \u06a9\u0646\u06cc\u062f \u0627\u06cc\u0646 \u0648\u0628\u0644\u0627\u06af \u0645\u0641\u06cc\u062f \u0627\u0633\u062a \u0628\u0647 \u0645\u0646 \u0627\u0637\u0644\u0627\u0639 \u062f\u0647\u06cc\u062f.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u067e\u0633 \u0627\u0632 \u062a\u06a9\u0645\u06cc\u0644 \u067e\u0631\u0648\u0698\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u062e\u0648\u062f \u062f\u0631 Keycloak OAuth2 Token Exchange\u060c \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u0627\u06cc\u0646 \u0627\u06cc\u062f\u0647 \u0631\u0627 \u06af\u0633\u062a\u0631\u0634 \u062f\u0647\u0645 \u0648 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u062c\u062f\u06cc\u062f \u0628\u0647 \u0646\u0627\u0645 my-ai-doctor \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0645. \u0628\u0631\u062e\u0644\u0627\u0641 \u0646\u0633\u062e\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u0642\u0628\u0644\u06cc\u060c \u06a9\u0647 \u0628\u0631 \u0631\u0648\u06cc \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0633\u0627\u0632\u06cc \u0628\u0627\u0637\u0646 \u0645\u062a\u0645\u0631\u06a9\u0632 \u0628\u0648\u062f\u060c \u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u0627\u0632 Elm \u0628\u0631\u0627\u06cc \u0631\u0627\u0628\u0637 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":79994,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-79993","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/79993","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=79993"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/79993\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/79994"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=79993"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=79993"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=79993"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}