ืฆืขื•ื•ื™ืงืœืขืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืžื™ื˜ Docker Swarm

ื“ื™ ืึธื ืœื™ื™ืŸ ื•ื•ื™ื“ืขื ืื™ื ื”ืึทืœื˜ ืจืขืงืึธืžืขื ื“ืึทืฆื™ืข ืกื™ืกื˜ืขื ื•ื•ืึธืก ืžื™ืจ ืึทืจื‘ืขื˜ืŸ ืื•ื™ืฃ ืื™ื– ืึท ืคึฟืึทืจืžืึทื›ื˜ ื’ืขืฉืขืคื˜ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืื•ืŸ ืื™ื– ื˜ืขืงื ื™ืงืœื™ ืึท ืžื•ืœื˜ื™-ืงืึธืžืคึผืึธื ืขื ื˜ ืงื ื•ื™ืœ ืคื•ืŸ ืคึผืจืึทืคึผืจื™ื™ืึทื˜ืขืจื™ ืื•ืŸ ืึธืคึฟืŸ ืžืงื•ืจ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ. ื“ืขืจ ืฆื™ืœ ืคื•ืŸ ืฉืจื™ื™ื‘ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืื™ื– ืฆื• ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ื“ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ื“ืึธืงืงืขืจ ืกื•ื•ืึธืจื ืงืœืึทืกื˜ืขืจื™ื ื’ ืกื™ืกื˜ืขื ืคึฟืึทืจ ืึท ืกื˜ืึทื’ื™ื ื’ ืคึผืœืึทื˜ืคืึธืจืžืข, ืึธืŸ ื“ื™ืกืจืึทืคึผื˜ื™ื ื’ ื“ื™ ื’ืขื’ืจื™ื ื“ืขื˜ ื•ื•ืึธืจืงืคืœืึธื•ื• ืคื•ืŸ ืื•ื ื“ื–ืขืจ ืคึผืจืึทืกืขืกืึทื– ืื•ื ื˜ืขืจ ืœื™ืžื™ื˜ืขื“ ืฆื™ื™ื˜ ื˜ื ืึธื™ื. ื“ื™ ื“ืขืจืฆื™ื™ืœื•ื ื’ ื“ืขืจืœืื ื’ื˜ ืฆื• ื“ื™ื™ืŸ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ึทื˜ ืื™ื– ืฆืขื˜ื™ื™ืœื˜ ืื™ืŸ ืฆื•ื•ื™ื™ ื˜ื™ื™ืœืŸ. ื“ืขืจ ืขืจืฉื˜ืขืจ ื˜ื™ื™ืœ ื‘ืืฉืจื™ื™ื‘ื˜ ืกื™ / ืกื™ ืื™ื™ื“ืขืจ ื ื™ืฆืŸ ื“ืึธืงืขืจ ืกื•ื•ืึธืจื, ืื•ืŸ ื“ืขืจ ืฆื•ื•ื™ื™ื˜ืขืจ ื˜ื™ื™ืœ ื‘ืืฉืจื™ื™ื‘ื˜ ื“ืขื ืคึผืจืึธืฆืขืก ืคื•ืŸ ื™ืžืคึผืœืึทืžืขื ื™ื ื’ ืขืก. ื“ื™ ื•ื•ืืก ื–ืขื ืขืŸ ื ื™ืฉื˜ ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืื™ืŸ ืœื™ื™ืขื ืขืŸ ื“ืขื ืขืจืฉื˜ืขืจ ื˜ื™ื™ืœ ืงืขื ืขืŸ ื‘ืขืฉืึธืœืขื ื’ื™ื™ืŸ ืฆื• ื“ื™ ืจื’ืข.

ะงะฐัั‚ัŒ ืื™ืš

ืึทืžืึธืœ, ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ืึท ื ื•ื™ื˜ ืฆื• ืฉื˜ืขืœืŸ ืึทืจื•ื™ืฃ ืึท ืกื™ / ืกื™ ืคึผืจืึธืฆืขืก ื•ื•ื™ ื’ืขืฉื•ื•ื™ื ื“ ื•ื•ื™ ืžืขื’ืœืขืš. ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ื‘ืื“ื™ื ื’ื•ื ื’ืขืŸ ืื™ื– ื ื™ืฉื˜ ืฆื• ื ื•ืฆืŸ ื“ืึธืงืขืจ ืคึฟืึทืจ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ื–ืขื ืขืŸ ื“ืขื•ื•ืขืœืึธืคึผืขื“ ืคึฟืึทืจ ืขื˜ืœืขื›ืข ืกื™ื‘ื•ืช:

  • ืคึฟืึทืจ ืžืขืจ ืคืึทืจืœืึธื–ืœืขืš ืื•ืŸ ืกื˜ืึทื‘ื™ืœ ืึธืคึผืขืจืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ืื™ืŸ ืคึผืจืึธื“ื•ืงืฆื™ืข (ื“"ื”, ืื™ืŸ ืขืกืึทื ืก, ื“ื™ ืคืึธื“ืขืจื•ื ื’ ื ื™ืฉื˜ ืฆื• ื ื•ืฆืŸ ื•ื•ื™ืจื˜ื•ืึทืœื™ื–ืึทื˜ื™ืึธืŸ)
  • ืœื™ื“ื™ื ื’ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ื”ืึธื‘ืŸ ื ื™ืฉื˜ ื•ื•ืขืœืŸ ืฆื• ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ ื“ืึธืงืขืจ (ืžืึธื“ื ืข, ืึธื‘ืขืจ ื“ืึธืก ืื™ื– ื•ื•ื™ ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ)
  • ืคึฟืึทืจ ืื™ื“ืขื™ืฉืข ืกื™ื‘ื•ืช ืคื•ืŸ ืจ & ื“ื™ ืคืึทืจื•ื•ืึทืœื˜ื•ื ื’

ื“ื™ ื™ื ืคืจืึทืกื˜ืจืึทืงื˜ืฉืขืจ, ืึธื ืœื™ื™ื’ืŸ ืื•ืŸ ื“ืขืจื ืขื ื˜ืขืจื  ืขืจืฉื˜ ืจืขืงื•ื•ื™ืจืขืžืขื ืฅ ืคึฟืึทืจ ื“ื™ MVP ื–ืขื ืขืŸ ื•ื•ื™ ื’ื™ื™ื˜:

  • 4 Intelยฎ X5650 ืกืขืจื•ื•ืขืจืก ืžื™ื˜ ื“ืขื‘ื™ืึทืŸ (ืื™ื™ืŸ ืžืขืจ ืฉื˜ืึทืจืง ืžืึทืฉื™ืŸ ื’ืึธืจ ืคึฟืึทืจ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’)
  • ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืคื•ืŸ ื“ื™ื™ืŸ ืื™ื™ื’ืขื ืข ืžื ื”ื’ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ืื™ื– ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ืื™ืŸ C ++, Python3
  • ื”ื•ื™ืคึผื˜ 3rdparty ืžื›ืฉื™ืจื™ื ื’ืขื ื™ืฆื˜: Kafka, Clickhouse, Airflow, Redis, Grafana, Postgresql, Mysql, ...
  • ืคึผื™ื™ืคึผืœื™ื™ื ื– ืคึฟืึทืจ ื‘ื ื™ืŸ ืื•ืŸ ื˜ืขืกื˜ื™ื ื’ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ืกืขืคึผืขืจืึทื˜ืœื™ ืคึฟืึทืจ ื“ื™ื‘ืึทื’ ืื•ืŸ ืžืขืœื“ื•ื ื’

ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืขืจืฉื˜ืข ืคึฟืจืื’ืŸ ื•ื•ืึธืก ื“ืึทืจืฃ ื–ื™ื™ืŸ ืจื™ื–ืึทืœื•ื•ื“ ืื™ืŸ ื“ืขืจ ืขืจืฉื˜ ื‘ื™ื ืข ืื™ื– ื•ื•ื™ ืžื ื”ื’ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื“ื™ืคึผืœื•ื™ื“ ืื™ืŸ ืงื™ื™ืŸ ืกื•ื•ื™ื•ื•ืข (ืกื™ / ืกื™).

ืžื™ืจ ื‘ืึทืฉืœืึธืกืŸ ืฆื• ื™ื ืกื˜ืึทืœื™ืจืŸ ื“ืจื™ื˜-ืคึผืึทืจื˜ื™ื™ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ืกื™ืกื˜ืขืžื™ืง ืื•ืŸ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงืŸ ื–ื™ื™ ืกื™ืกื˜ืขืžื™ืง. ืžื ื”ื’ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ื“ืขื•ื•ืขืœืึธืคึผืขื“ ืื™ืŸ C ++ ืึธื“ืขืจ ืคึผื™ื˜ื”ืึธืŸ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื“ื™ืคึผืœื•ื™ื“ ืื™ืŸ ืขื˜ืœืขื›ืข ื•ื•ืขื’ืŸ. ืฆื•ื•ื™ืฉืŸ ื–ื™ื™, ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ: ืงืจื™ื™ื™ื˜ื™ื ื’ ืกื™ืกื˜ืขื ืคึผืึทืงืึทื“ื–ืฉืึทื–, ืฉื™ืงืŸ ื–ื™ื™ ืฆื• ื“ื™ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ ืคื•ืŸ ื’ืขื–ืืžืœื˜ ื‘ื™ืœื“ืขืจ ืื•ืŸ ื–ื™ื™ืขืจ ืกืึทื‘ืกืึทืงื•ื•ืึทื ื˜ ื™ื ืกื˜ืึทืœื™ืจื•ื ื’ ืื•ื™ืฃ ืกืขืจื•ื•ืขืจืก. ืคึฟืึทืจ ืึทืŸ ืฉื•ื™ืŸ ืื•ืžื‘ืึทืงืึทื ื˜ ืกื™ื‘ื”, ืืŸ ืื ื“ืขืจ ืื•ืคึฟืŸ ืื™ื– ืื•ื™ืกื“ืขืจื•ื•ื™ื™ืœื˜, ื ื™ื™ืžืœื™: ื ื™ืฆืŸ CI, ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืขืงืกืขืงื•ื˜ืึทื‘ืœืข ื˜ืขืงืขืก ื–ืขื ืขืŸ ืงืึทืžืคึผื™ื™ืœื“, ืึท ื•ื•ื™ืจื˜ื•ืึทืœ ืคึผืจื•ื™ืขืงื˜ ืกื•ื•ื™ื•ื•ืข ืื™ื– ื‘ืืฉืืคืŸ, py ืžืึทื“ื–ืฉื•ืœื– ืคึฟื•ืŸ ืจืขืงื•ื•ื™ืจืขืžืขื ืฅ.ื˜ืงืกื˜ ื–ืขื ืขืŸ ืื™ื ืกื˜ืึทืœื™ืจืŸ, ืื•ืŸ ืึทืœืข ื“ื™ ืึทืจื˜ืึทืคืึทืงืฅ ื–ืขื ืขืŸ ื’ืขืฉื™ืงื˜ ืฆื•ื–ืืžืขืŸ ืžื™ื˜ ืงืึธื ืคื™ื’ืก, ืกืงืจื™ืคึผืก ืื•ืŸ ื“ื™ ืึทืงืึทืžืคึผืึทื ื™ื™ื ื’ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืกื•ื•ื™ื•ื•ืข ืฆื• ื“ื™ ืกืขืจื•ื•ืขืจืก. ื“ืขืจื ืึธืš, ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ื–ืขื ืขืŸ ืœืึธื ื˜ืฉื˜ ืคึฟื•ืŸ ืึท ื•ื•ื™ืจื˜ื•ืึทืœ ื‘ืึทื ื™ืฆืขืจ ืึธืŸ ืึทื“ืžื™ื ื™ืกื˜ืจืึทื˜ืึธืจ ืจืขื›ื˜.

Gitlab-CI ืื™ื– ืื•ื™ืกื“ืขืจื•ื•ื™ื™ืœื˜ ื•ื•ื™ ื“ื™ ืกื™ / ืกื™ ืกื™ืกื˜ืขื. ื“ื™ ืจื™ื–ืึทืœื˜ื™ื ื’ ืจืขืจื  - ืœื™ื ื™ืข ื’ืขืงื•ืงื˜ ืขืคึผืขืก ื•ื•ื™ ื“ืึธืก:

ืฆืขื•ื•ื™ืงืœืขืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืžื™ื˜ Docker Swarm
ืกื˜ืจืึทืงื˜ืฉืขืจืึทืœื™, gitlab-ci.yml ื’ืขืงื•ืงื˜ ื•ื•ื™ ื“ืึธืก:

---
variables:
  # ะผะธะฝะธะผะฐะปัŒะฝะฐั ะฒะตั€ัะธั ะฆะŸะฃ ะฝะฐ ัะตั€ะฒะตั€ะฐั…, ะณะดะต ั€ะฐะทะฒะพั€ะฐั‡ะธะฒะฐะตั‚ัั ะบะปะฐัั‚ะตั€
  CMAKE_CPUTYPE: "westmere"

  DEBIAN: "MYREGISTRY:5000/debian:latest"

before_script:
  - eval $(ssh-agent -s)
  - ssh-add <(echo "$SSH_PRIVATE_KEY")
  - mkdir -p ~/.ssh && echo -e "Host *ntStrictHostKeyChecking nonn" > ~/.ssh/config

stages:
  - build
  - testing
  - deploy

debug.debian:
  stage: build
  image: $DEBIAN
  script:
    - cd builds/release && ./build.sh
    paths:
      - bin/
      - builds/release/bin/
    when: always
release.debian:
  stage: build
  image: $DEBIAN
  script:
    - cd builds/release && ./build.sh
    paths:
      - bin/
      - builds/release/bin/
    when: always

## testing stage
tests.codestyle:
  stage: testing
  image: $DEBIAN
  dependencies:
    - release.debian
  script:
    - /bin/bash run_tests.sh -t codestyle -b "${CI_COMMIT_REF_NAME}_codestyle"
tests.debug.debian:
  stage: testing
  image: $DEBIAN
  dependencies:
    - debug.debian
  script:
    - /bin/bash run_tests.sh -e codestyle/test_pylint.py -b "${CI_COMMIT_REF_NAME}_debian_debug"
  artifacts:
    paths:
      - run_tests/username/
    when: always
    expire_in: 1 week
tests.release.debian:
  stage: testing
  image: $DEBIAN
  dependencies:
    - release.debian
  script:
    - /bin/bash run_tests.sh -e codestyle/test_pylint.py -b "${CI_COMMIT_REF_NAME}_debian_release"
  artifacts:
    paths:
      - run_tests/username/
    when: always
    expire_in: 1 week

## staging stage
deploy_staging:
  stage: deploy
  environment: staging
  image: $DEBIAN
  dependencies:
    - release.debian
  script:
    - cd scripts/deploy/ &&
        python3 createconfig.py -s $CI_ENVIRONMENT_NAME &&
        /bin/bash install_venv.sh -d -r ../../requirements.txt &&
        python3 prepare_init.d.py &&
        python3 deploy.py -s $CI_ENVIRONMENT_NAME
  when: manual

ืขืก ืื™ื– ื›ื“ืื™ ืฆื• ื‘ืืžืขืจืงืŸ ืึทื– ืคึฟืึทืจื–ืึทืžืœื•ื ื’ ืื•ืŸ ื˜ืขืกื˜ื™ื ื’ ืื™ื– ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ืื•ื™ืฃ ื–ื™ื™ืŸ ืื™ื™ื’ืŸ ื‘ื™ืœื“, ื•ื•ื• ืึทืœืข ื“ื™ ื ื™ื™ื˜ื™ืง ืกื™ืกื˜ืขื ืคึผืึทืงืึทื“ื–ืฉืึทื– ื–ืขื ืขืŸ ืฉื•ื™ืŸ ืื™ื ืกื˜ืึทืœื™ืจืŸ ืื•ืŸ ืื ื“ืขืจืข ืกืขื˜ื˜ื™ื ื’ืก ื–ืขื ืขืŸ ื’ืขืžืื›ื˜.

ื›ืึธื˜ืฉ ื™ืขื“ืขืจ ืคื•ืŸ ื“ื™ ืกืงืจื™ืคึผืก ืื™ืŸ ื“ื–ืฉืึธื‘ืก ืื™ื– ื˜ืฉื™ืงืึทื•ื•ืข ืื™ืŸ ื–ื™ื™ืŸ ืื™ื™ื’ืขื ืข ื•ื•ืขื’, ืื™ืš ืึทื•ื•ืึทื“ืข ื•ื•ืขื˜ ื ื™ืฉื˜ ืจืขื“ืŸ ื•ื•ืขื’ืŸ ื–ื™ื™; ื“ื™ืกืงืจื™ื™ื‘ื™ื ื’ ื™ืขื“ืขืจ ืคื•ืŸ ื–ื™ื™ ื•ื•ืขื˜ ื ืขืžืขืŸ ื”ื™ืคึผืฉ ืฆื™ื™ื˜ ืื•ืŸ ื“ืึธืก ืื™ื– ื ื™ืฉื˜ ื“ืขืจ ืฆื™ืœ ืคื•ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ. ืœืึธื–ืŸ ืžื™ืจ ื ืึธืจ ืฆื™ืขืŸ ื“ื™ื™ืŸ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ื˜ ืฆื• ื“ื™ ืคืึทืงื˜ ืึทื– ื“ื™ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ื‘ื™ื ืข ื‘ืืฉื˜ื™ื™ื˜ ืคื•ืŸ ืึท ืกื™ืงื•ื•ืึทื ืก ืคื•ืŸ ืคืึทืš ืกืงืจื™ืคึผืก:

  1. createconfig.py - ืงืจื™ื™ื™ืฅ ืึท ืกืขื˜ื˜ื™ื ื’ืก.ื™ื ื™ ื˜ืขืงืข ืžื™ื˜ ืกืขื˜ื˜ื™ื ื’ืก ืคึฟืึทืจ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ืื™ืŸ ืคืึทืจืฉื™ื“ืขื ืข ื™ื ื•ื•ื™ื™ืจืึทื ืžืึทื ืฅ ืคึฟืึทืจ ืกืึทื‘ืกืึทืงื•ื•ืึทื ื˜ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ (ืคึผืจืขืคึผืจืึธื“ื•ืงืฆื™ืข, ืคึผืจืึธื“ื•ืงืฆื™ืข, ื˜ืขืกื˜ื™ื ื’, ...)
  2. install_venv.sh - ืงืจื™ื™ื™ืฅ ืึท ื•ื•ื™ืจื˜ื•ืึทืœ ืกื•ื•ื™ื•ื•ืข ืคึฟืึทืจ ืคึผื™ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ืื™ืŸ ืึท ืกืคึผืขืฆื™ืคื™ืฉ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ืื•ืŸ ืงืึทืคึผื™ื– ืขืก ืฆื• ื•ื•ื™ื™ึทื˜ ืกืขืจื•ื•ืขืจืก
  3. prepare_init.d.py - ืคึผืจื™ืคึผืขืจื– ืกืงืจื™ืคึผืก ืคึฟืึทืจ ืึธื ื”ื™ื™ื‘-ื”ืึทืœื˜ืŸ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื“ื™ ืžื•ืกื˜ืขืจ
  4. deploy.py - ื“ื™ืคึผืœื•ื™ื“ื– ืื•ืŸ ืจื™ืกื˜ืึทืจื˜ ื ื™ื™ึท ืงืึทืžืคึผืึธื•ื ืึทื ืฅ

ืฆื™ื™ื˜ ืื™ื– ื“ื•ืจื›ื’ืขื’ืื ื’ืขืŸ. ื“ื™ ืกื˜ืึทื’ื™ื ื’ ื‘ื™ื ืข ืื™ื– ืจื™ืคึผืœื™ื™ืกื˜ ื“ื•ืจืš ืคึผืจืขืคึผืจืึธื“ื•ืงืฆื™ืข ืื•ืŸ ืคึผืจืึธื“ื•ืงืฆื™ืข. ืกื•ืคึผืคึผืึธืจื˜ ืคึฟืึทืจ ื“ืขื ืคึผืจืึธื“ื•ืงื˜ ืื™ื– ืฆื•ื’ืขืœื™ื™ื’ื˜ ืื•ื™ืฃ ืึท ืžืขืจ ืคืึทืจืฉืคึผืจื™ื™ื˜ื•ื ื’ (CentOS). ื ืึธืš 5 ืฉื˜ืึทืจืง ื’ืฉืžื™ื•ืช ืกืขืจื•ื•ืขืจืก ืื•ืŸ ืึท ื˜ื•ืฅ ื•ื•ื™ืจื˜ื•ืขืœ ื–ืขื ืขืŸ ืฆื•ื’ืขื’ืขื‘ืŸ. ืื•ืŸ ืขืก ืื™ื– ื’ืขื•ื•ืืจืŸ ื™ื ืงืจื™ืกื™ื ื’ืœื™ ืฉื•ื•ืขืจ ืคึฟืึทืจ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืื•ืŸ ื˜ืขืกื˜ืขืจืก ืฆื• ืคึผืจื•ื‘ื™ืจืŸ ื–ื™ื™ืขืจ ื˜ืึทืกืงืก ืื™ืŸ ืึท ืกื•ื•ื™ื•ื•ืข ืžืขืจ ืึธื“ืขืจ ื•ื•ื™ื™ื ื™ืงืขืจ ื ืึธืขื ื˜ ืฆื• ื“ื™ ืึทืจื‘ืขื˜ ืฉื˜ืึทื˜. ืื™ืŸ ื“ืขืจ ืฆืฒึทื˜ ืื™ื– ืงืœืึธืจ ื’ืขื•ื•ืึธืจืŸ, ืึทื– ืึธืŸ ืื™ื ืื™ื– ืื•ืžืžืขื’ืœืขืš ืฆื• ื˜ืึธืŸ...

ื˜ื™ื™ืœ ื•ื•

ืฆืขื•ื•ื™ืงืœืขืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืžื™ื˜ Docker Swarm

ืึทื–ื•ื™, ืื•ื ื“ื–ืขืจ ืงื ื•ื™ืœ ืื™ื– ืึท ืกืคึผืขืงื˜ืึทืงื™ืึทืœืขืจ ืกื™ืกื˜ืขื ืคื•ืŸ ืึท ืคึผืึธืจ ืคื•ืŸ ื˜ื•ืฅ ื™ื—ื™ื“ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ื•ื•ืึธืก ื–ืขื ืขืŸ ื ื™ืฉื˜ ื“ื™ืกืงืจื™ื™ื‘ื“ ื“ื•ืจืš Dockerfiles. ืื™ืจ ืงืขื ืขืŸ ืงืึทื ืคื™ื’ื™ืขืจ ืขืก ืคึฟืึทืจ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืฆื• ืึท ืกืคึผืขืฆื™ืคื™ืฉ ืกื•ื•ื™ื•ื•ืข ื‘ืœื•ื™ื– ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ. ืื•ื ื“ื–ืขืจ ืึทืจื‘ืขื˜ ืื™ื– ืฆื• ืฆืขื•ื•ื™ืงืœืขืŸ ื“ืขื ืงื ื•ื™ืœ ืื™ืŸ ืึท ืกื˜ืึทื’ื™ื ื’ ืกื•ื•ื™ื•ื•ืข ืฆื• ืคึผืจื•ื‘ื™ืจืŸ ืขืก ืื™ื™ื“ืขืจ ืคืึทืจ-ืžืขืœื“ื•ื ื’ ื˜ืขืกื˜ื™ื ื’.

ื˜ืขืึธืจืขื˜ื™ืฉ, ืขืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืขื˜ืœืขื›ืข ืงืœืึทืกื˜ืขืจื– ืืจื‘ืขื˜ืŸ ืกื™ื™ืžืึทืœื˜ื™ื™ื ื™ืึทืกืœื™: ื•ื•ื™ ืคื™ืœืข ื•ื•ื™ ืขืก ื–ืขื ืขืŸ ื˜ืึทืกืงืก ืื™ืŸ ืึท ื’ืขืขื ื“ื™ืงื˜ ืฉื˜ืึทื˜ ืึธื“ืขืจ ื ืึธืขื ื˜ ืฆื• ืงืึทืžืคึผืœื™ืฉืึทืŸ. ื“ื™ ืžืึทื›ื˜ ืคื•ืŸ ื“ื™ ืกืขืจื•ื•ืขืจืก ืื™ืŸ ืื•ื ื“ื–ืขืจ ื‘ืึทื–ื™ื™ึทื˜ื™ืงื•ื ื’ ืึทืœืึทื•ื– ืื•ื ื“ื– ืฆื• ืœื•ื™ืคืŸ ืขื˜ืœืขื›ืข ืงืœืึทืกื˜ืขืจื– ืื•ื™ืฃ ื™ืขื“ืขืจ ืกืขืจื•ื•ืขืจ. ื™ืขื“ืขืจ ืกื˜ืึทื’ื™ื ื’ ืงื ื•ื™ืœ ืžื•ื–ืŸ ื–ื™ื™ืŸ ืืคื’ืขื–ื•ื ื“ืขืจื˜ (ืขืก ื–ืึธืœ ื–ื™ื™ืŸ ืงื™ื™ืŸ ืึธื•ื•ื•ืขืจืœืึทืคึผ ืื™ืŸ ืคึผืึธืจืฅ, ื“ื™ืจืขืงื˜ืขืจื™ื–, ืืื–"ื• ื•).

ืื•ื ื“ื–ืขืจ ืžืขืจืกื˜ ื•ื•ืขืจื˜ืคื•ืœ ืžื™ื˜ืœ ืื™ื– ืื•ื ื“ื–ืขืจ ืฆื™ื™ื˜, ืื•ืŸ ืžื™ืจ ื”ืึธื‘ืŸ ื ื™ืฉื˜ ื”ืึธื‘ืŸ ืคื™ืœ ืคื•ืŸ ืขืก.

ืคึฟืึทืจ ืึท ืคืึทืกื˜ืขืจ ืึธื ื”ื™ื™ื‘, ืžื™ืจ ืื•ื™ืกื“ืขืจื•ื•ื™ื™ืœื˜ Docker Swarm ืจืขื›ื˜ ืฆื• ื–ื™ื™ืŸ ืคึผืึทืฉื˜ืขืก ืื•ืŸ ืคืœืขืงืกืึทื‘ืึทืœ ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ. ื“ืขืจ ืขืจืฉื˜ืขืจ ื–ืึทืš ืžื™ืจ ื”ืื‘ืŸ ืื™ื– ื’ืขื•ื•ืขืŸ ืฉืึทืคึฟืŸ ืึท ืคืึทืจื•ื•ืึทืœื˜ืขืจ ืื•ืŸ ืขื˜ืœืขื›ืข ื ืึธื•ื“ื– ืื•ื™ืฃ ื•ื•ื™ื™ึทื˜ ืกืขืจื•ื•ืขืจืก:

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
kilqc94pi2upzvabttikrfr5d     nop-test-1     Ready               Active                                  19.03.2
jilwe56pl2zvabupryuosdj78     nop-test-2     Ready               Active                                  19.03.2
j5a4yz1kr2xke6b1ohoqlnbq5 *   nop-test-3     Ready               Active              Leader              19.03.2

ื“ืขืจื ืึธืš, ืžื™ืจ ื‘ืืฉืืคืŸ ืึท ื ืขืฅ:


$ docker network create --driver overlay --subnet 10.10.10.0/24 nw_swarm

ื“ืขืจื ืึธืš, ืžื™ืจ ืงืึธื ื ืขืงื˜ืขื“ Gitlab-CI ืื•ืŸ Swarm ื ืึธื•ื“ื– ืื™ืŸ ื˜ืขืจืžื™ื ืขืŸ ืคื•ืŸ ื•ื•ื™ื™ึทื˜ ืคืึทืจื•ื•ืึทืœื˜ื•ื ื’ ืคื•ืŸ ื ืึธื•ื“ื– ืคึฟื•ืŸ CI: ื™ื ืกื˜ืึธืœื™ื ื’ ืกืขืจื˜ื™ืคื™ืงืึทืฅ, ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ืกื•ื“ ื•ื•ืขืจื™ืึทื‘ืึทืœื– ืื•ืŸ ืื•ื™ืš ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ื™ ื“ืึธืงืงืขืจ ื“ื™ื ืกื˜ ืื•ื™ืฃ ื“ื™ ืงืึธื ื˜ืจืึธืœ ืกืขืจื•ื•ืขืจ. ื“ืขื ืื™ื™ื ืขืจ ืึทืจื˜ื™ืงืœ ื’ืขืจืื˜ืขื•ื•ืขื˜ ืื•ื ื“ื– ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืฆื™ื™ึทื˜.

ื•ื•ื™ื™ึทื˜ืขืจ, ืžื™ืจ ืฆื•ื’ืขื’ืขื‘ืŸ ื“ื–ืฉืึธื‘ืก ืคึฟืึทืจ ืงืจื™ื™ื™ื˜ื™ื ื’ ืื•ืŸ ื“ื™ืกื˜ืจื•ื™ื™ื ื’ ื“ื™ ืึธื ืœื™ื™ื’ืŸ ืื™ืŸ .gitlab-ci .yml.

ืขื˜ืœืขื›ืข ืžืขืจ ื“ื–ืฉืึธื‘ืก ื–ืขื ืขืŸ ืฆื•ื’ืขื’ืขื‘ืŸ ืฆื• .gitlab-ci .yml

## staging stage
deploy_staging:
  stage: testing
  before_script:
    - echo "override global 'before_script'"
  image: "REGISTRY:5000/docker:latest"
  environment: staging
  dependencies: []
  variables:
    DOCKER_CERT_PATH: "/certs"
    DOCKER_HOST: tcp://10.50.173.107:2376
    DOCKER_TLS_VERIFY: 1
    CI_BIN_DEPENDENCIES_JOB: "release.centos.7"
  script:
    - mkdir -p $DOCKER_CERT_PATH
    - echo "$TLSCACERT" > $DOCKER_CERT_PATH/ca.pem
    - echo "$TLSCERT" > $DOCKER_CERT_PATH/cert.pem
    - echo "$TLSKEY" > $DOCKER_CERT_PATH/key.pem
    - docker stack deploy -c docker-compose.yml ${CI_ENVIRONMENT_NAME}_${CI_COMMIT_REF_NAME} --with-registry-auth
    - rm -rf $DOCKER_CERT_PATH
  when: manual

## stop staging stage
stop_staging:
  stage: testing
  before_script:
    - echo "override global 'before_script'"
  image: "REGISTRY:5000/docker:latest"
  environment: staging
  dependencies: []
  variables:
    DOCKER_CERT_PATH: "/certs"
    DOCKER_HOST: tcp://10.50.173.107:2376
    DOCKER_TLS_VERIFY: 1
  script:
    - mkdir -p $DOCKER_CERT_PATH
    - echo "$TLSCACERT" > $DOCKER_CERT_PATH/ca.pem
    - echo "$TLSCERT" > $DOCKER_CERT_PATH/cert.pem
    - echo "$TLSKEY" > $DOCKER_CERT_PATH/key.pem
    - docker stack rm ${CI_ENVIRONMENT_NAME}_${CI_COMMIT_REF_NAME}
    # TODO: need check that stopped
  when: manual

ืคึฟื•ืŸ ื“ื™ ืื•ื™ื‘ืŸ ืงืึธื“ ืคืจืึทื’ืžืขื ื˜ ืขืก ืื™ื– ืงืœืึธืจ ืึทื– ืฆื•ื•ื™ื™ ืงื ืขืคึผืœืขืš ื–ืขื ืขืŸ ืฆื•ื’ืขื’ืขื‘ืŸ ืฆื• ืคึผื™ื™ืคึผืœื™ื™ื ื– (ื“ื™ืคึผืœื•ื™_ืกื˜ืึทื’ื™ื ื’, ืกื˜ืึธืคึผ_ืกื˜ืึทื’ื™ื ื’) ื•ื•ืึธืก ื“ืึทืจืคืŸ ืžืึทื ื•ืึทืœ ืงืึทืžืฃ.

ืฆืขื•ื•ื™ืงืœืขืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืžื™ื˜ Docker Swarm
ื“ืขืจ ืึธื ืœื™ื™ื’ืŸ ื ืึธืžืขืŸ ืฉื•ื•ืขื‘ืขืœืขืš ื“ื™ ืฆื•ื•ื™ื™ึทื’ ื ืึธืžืขืŸ ืื•ืŸ ื“ื™ ืื™ื™ื’ื ืืจื˜ื™ืงื™ื™ื˜ ื–ืึธืœ ื–ื™ื™ืŸ ื’ืขื ื•ื’. ืกืขืจื•ื•ื™ืกืขืก ืื™ืŸ ื“ืขื ืึธื ืœื™ื™ื’ืŸ ื‘ืึทืงื•ืžืขืŸ ื™ื™ื ืฆื™ืง IP ืึทื“ืจืขืกืขืก ืื•ืŸ ืคึผืึธืจืฅ, ื“ื™ื™ืจืขืงื˜ืขืจื™ื–, ืขื˜ืง. ื•ื•ืขื˜ ื–ื™ื™ืŸ ืืคื’ืขื–ื•ื ื“ืขืจื˜, ืึธื‘ืขืจ ื“ื™ ื–ืขืœื‘ืข ืคื•ืŸ โ€‹โ€‹ืึธื ืœื™ื™ื’ืŸ ืฆื• ืึธื ืœื™ื™ื’ืŸ (ื–ื™ื ื˜ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ืขืงืข ืื™ื– ื“ื™ ื–ืขืœื‘ืข ืคึฟืึทืจ ืึทืœืข ืกื˜ืึทืงืก) - ื“ืึธืก ืื™ื– ื•ื•ืึธืก ืžื™ืจ ื’ืขื•ื•ืืœื˜. ืžื™ืจ ืฆืขื•ื•ื™ืงืœืขืŸ ื“ืขื ืึธื ืœื™ื™ื’ืŸ (ืงื ื•ื™ืœ) ื ื™ืฆืŸ ื“ืึธืงืงืขืจ-ืงืึธืžืคึผืึธืกืข.ื™ืžืœ, ื•ื•ืืก ื‘ืืฉืจื™ื™ื‘ื˜ ืื•ื ื“ื–ืขืจ ืงื ื•ื™ืœ.

ื“ืึธืงืงืขืจ-ืงืึธืžืคึผืึธืกืข.ื™ืžืœ

---
version: '3'

services:
  userprop:
    image: redis:alpine
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    networks:
      nw_swarm:
  celery_bcd:
    image: redis:alpine
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    networks:
      nw_swarm:

  schedulerdb:
    image: mariadb:latest
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
      MYSQL_DATABASE: schedulerdb
      MYSQL_USER: ****
      MYSQL_PASSWORD: ****
    command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--explicit_defaults_for_timestamp=1']
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    networks:
      nw_swarm:

  celerydb:
    image: mariadb:latest
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
      MYSQL_DATABASE: celerydb
      MYSQL_USER: ****
      MYSQL_PASSWORD: ****
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    networks:
      nw_swarm:

  cluster:
    image: $CENTOS7
    environment:
      - CENTOS
      - CI_ENVIRONMENT_NAME
      - CI_API_V4_URL
      - CI_REPOSITORY_URL
      - CI_PROJECT_ID
      - CI_PROJECT_URL
      - CI_PROJECT_PATH
      - CI_PROJECT_NAME
      - CI_COMMIT_REF_NAME
      - CI_BIN_DEPENDENCIES_JOB
    command: >
      sudo -u myusername -H /bin/bash -c ". /etc/profile &&
        mkdir -p /storage1/$CI_COMMIT_REF_NAME/$CI_PROJECT_NAME &&
        cd /storage1/$CI_COMMIT_REF_NAME/$CI_PROJECT_NAME &&
            git clone -b $CI_COMMIT_REF_NAME $CI_REPOSITORY_URL . &&
            curl $CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/artifacts/$CI_COMMIT_REF_NAME/download?job=$CI_BIN_DEPENDENCIES_JOB -o artifacts.zip &&
            unzip artifacts.zip ;
        cd /storage1/$CI_COMMIT_REF_NAME/$CI_PROJECT_NAME/scripts/deploy/ &&
            python3 createconfig.py -s $CI_ENVIRONMENT_NAME &&
            /bin/bash install_venv.sh -d -r ../../requirements.txt &&
            python3 prepare_init.d.py &&
            python3 deploy.py -s $CI_ENVIRONMENT_NAME"
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    tty: true
    stdin_open: true
    networks:
      nw_swarm:

networks:
  nw_swarm:
    external: true

ื“ืึธ ืื™ืจ ืงืขื ืขืŸ ื–ืขืŸ ืึทื– ื“ื™ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ื–ืขื ืขืŸ ืงืึธื ื ืขืงื˜ืขื“ ื“ื•ืจืš ืื™ื™ืŸ ื ืขืฅ (nw_swarm) ืื•ืŸ ื–ืขื ืขืŸ ืฆื•ื˜ืจื™ื˜ืœืขืš ืฆื• ื™ืขื“ืขืจ ืื ื“ืขืจืขืจ.

ืกื™ืกื˜ืขื ืงืึทืžืคึผืึธื•ื ืึทื ืฅ (ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ืจืขื“ื™ืก, ืžื™ืกืงืœ) ื–ืขื ืขืŸ ืืคื’ืขืฉื™ื™ื“ื˜ ืคื•ืŸ ื“ื™ ืึทืœื’ืขืžื™ื™ื ืข ื‘ืขืงืŸ ืคื•ืŸ ืžื ื”ื’ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ (ืื™ืŸ ืคึผืœืึทื ื–, ืžื ื”ื’ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ื–ืขื ืขืŸ ืื•ื™ืš ืฆืขื˜ื™ื™ืœื˜ ื•ื•ื™ ื‘ืึทื“ื™ื ื•ื ื’ืก). ื“ื™ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ื‘ื™ื ืข ืคื•ืŸ โ€‹โ€‹ืื•ื ื“ื–ืขืจ ืงื ื•ื™ืœ ืงื•ืงื˜ ื•ื•ื™ ื˜ืจืึทื ืกืคืขืจื™ื ื’ CMD ืฆื• ืื•ื ื“ื–ืขืจ ืื™ื™ืŸ ื’ืจื•ื™ืก ืงืึทื ืคื™ื’ื™ืขืจื“ ื‘ื™ืœื“ ืื•ืŸ, ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ, ืื™ื– ืคึผืจืึทืงื˜ืึทืงืœื™ ื ื™ื˜ ืึทื ื“ืขืจืฉ ืคื•ืŸ ื“ื™ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ื“ื™ืกืงืจื™ื™ื‘ื“ ืื™ืŸ ื˜ื™ื™ืœ I. ืื™ืš ื•ื•ืขืœ ื•ื ื˜ืขืจืฉื˜ืจื™ื™ึทื›ืŸ ื“ื™ ื“ื™ืคืขืจืึทื ืกื™ื–:

  • ื’ื™ื˜ ืงืœืึธื•ืŸ ... - ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ื“ื™ ื˜ืขืงืขืก ื ื™ื™ื˜ื™ืง ืฆื• ื“ื•ืจื›ืคื™ืจืŸ ื“ื™ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ (createconfig.py, install_venv.sh, ืขื˜ืง.)
  • ืงืขืจืœ ... && ืึธืคึผื˜ืจืึธื’ืŸ ... - ืืจืืคืงืืคื™ืข ืื•ืŸ ืึทื ื–ื™ืคึผ ื“ื™ ื‘ื•ื™ืขืŸ ืึทืจื˜ืึทืคืึทืงืฅ (ืงืึธืžืคึผื™ื™ืœื“ ื™ื•ื˜ื™ืœืึทื˜ื™ื–)

ืขืก ืื™ื– ื‘ืœื•ื™ื– ืื™ื™ืŸ ื ืึธืš ืึทื ื“ื™ืกืงืจื™ื™ื‘ื“ ืคึผืจืึธื‘ืœืขื: ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ื•ื•ืึธืก ื”ืึธื‘ืŸ ืึท ื•ื•ืขื‘ ืฆื•ื‘ื™ื ื“ ื–ืขื ืขืŸ ื ื™ืฉื˜ ืฆื•ื˜ืจื™ื˜ืœืขืš ืคึฟื•ืŸ ื“ื™ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ' ื‘ืจืึทื•ื–ืขืจื–. ืžื™ืจ ืกืึธืœื•ื•ืข ื“ืขื ืคึผืจืึธื‘ืœืขื ื ื™ืฆืŸ ืคืึทืจืงืขืจื˜ ืคึผืจืึทืงืกื™, ืึทื–ื•ื™:

ืื™ืŸ .gitlab-ci.yml, ื ืึธืš ื“ื™ืคึผืœื•ื™ื™ื ื’ ื“ื™ ืงื ื•ื™ืœ ืึธื ืœื™ื™ื’ืŸ, ืœื™ื™ื’ืŸ ืึท ืฉื•ืจื” ืคึฟืึทืจ ื“ื™ืคึผืœื•ื™ื™ื ื’ ื“ื™ ื‘ืึทืœืึทื ืกืขืจ (ื•ื•ืึธืก, ื•ื•ืขืŸ ื‘ืื’ืื ื’ืขืŸ, ื‘ืœื•ื™ื– ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื•ื ื’ืขืŸ ื–ื™ื™ึทืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ (ืงืจื™ื™ื™ืฅ ื ื™ื™ึท nginx ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ืขืงืขืก ืœื•ื™ื˜ ื“ื™ ืžื•ืกื˜ืขืจ: /etc/nginx/conf.d /${CI_COMMIT_REF_NAME}.conf) - ื–ืขืŸ ืงืึธื“ docker-compose-nginx.yml)

    - docker stack deploy -c docker-compose-nginx.yml ${CI_ENVIRONMENT_NAME} --with-registry-auth

docker-compose-nginx.yml

---
version: '3'

services:
  nginx:
    image: nginx:latest
    environment:
      CI_COMMIT_REF_NAME: ${CI_COMMIT_REF_NAME}
      NGINX_CONFIG: |-
            server {
                listen 8080;
                server_name staging_${CI_COMMIT_REF_NAME}_cluster.dev;

                location / {
                    proxy_pass http://staging_${CI_COMMIT_REF_NAME}_cluster:8080;
                }
            }
            server {
                listen 5555;
                server_name staging_${CI_COMMIT_REF_NAME}_cluster.dev;

                location / {
                    proxy_pass http://staging_${CI_COMMIT_REF_NAME}_cluster:5555;
                }
            }
    volumes:
      - /tmp/staging/nginx:/etc/nginx/conf.d
    command:
      /bin/bash -c "echo -e "$$NGINX_CONFIG" > /etc/nginx/conf.d/${CI_COMMIT_REF_NAME}.conf;
        nginx -g "daemon off;";
        /etc/init.d/nginx reload"
    ports:
      - 8080:8080
      - 5555:5555
      - 3000:3000
      - 443:443
      - 80:80
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    networks:
      nw_swarm:

networks:
  nw_swarm:
    external: true

ืื•ื™ืฃ ื“ืขื•ื•ืขืœืึธืคึผืขืจ ืงืึธืžืคึผื™ื•ื˜ืขืจืก, ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงืŸ /etc/hosts; ืฉื˜ืขืœืŸ ื“ื™ URL ืฆื• nginx:

10.50.173.106 staging_BRANCH-1831_cluster.dev

ืึทื–ื•ื™, ื“ื™ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืคื•ืŸ ืืคื’ืขื–ื•ื ื“ืขืจื˜ ืกื˜ืึทื’ื™ื ื’ ืงืœืึทืกื˜ืขืจื– ืื™ื– ื™ืžืคึผืœืึทืžืขื ืึทื“ ืื•ืŸ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืงืขื ืขืŸ ืื™ืฆื˜ ืงืึทื˜ืขืจ ื–ื™ื™ ืื™ืŸ ืงื™ื™ืŸ ืงื•ื•ืึทื ื˜ื™ื˜ื™ ื’ืขื ื•ื’ ืฆื• ืคึผืจื•ื‘ื™ืจืŸ ื–ื™ื™ืขืจ ื˜ืึทืกืงืก.

ืฆื•ืงื•ื ืคึฟื˜ ืคึผืœืึทื ื–:

  • ื‘ืึทื–ื•ื ื“ืขืจ ืื•ื ื“ื–ืขืจ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ื•ื•ื™ ื‘ืึทื“ื™ื ื•ื ื’ืก
  • ืฉืึทืคึฟืŸ ืึท Dockerfile ืคึฟืึทืจ ื™ืขื“ืขืจ
  • ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ื“ืขื˜ืขืงื˜ ื•ื•ื™ื™ื ื™ืงืขืจ ืœืึธื•ื“ื™ื“ ื ืึธื•ื“ื– ืื™ืŸ ื“ืขื ืึธื ืœื™ื™ื’ืŸ
  • ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ื ืึธื•ื“ื– ื ื™ืฆืŸ ืึท ื ืึธืžืขืŸ ืžื•ืกื˜ืขืจ (ืืœื ื•ื•ื™ ื ื™ืฆืŸ ืฉื™ื™ึทืŸ ื•ื•ื™ ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ)
  • ืœื™ื™ื’ ืึท ื˜ืฉืขืง ืึทื– ื“ืขืจ ืึธื ืœื™ื™ื’ืŸ ืื™ื– ื—ืจื•ื‘ึฟ
  • ...

ืกืคึผืขืฆื™ืขืœืข ื“ืึทื ืงืขืŸ ืคึฟืึทืจ ืึทืจื˜ื™ืงืœ.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’