diff --git a/.gitignore b/.gitignore
index aa7624b..21a3b90 100644
--- a/.gitignore
+++ b/.gitignore
@@ -221,8 +221,8 @@ media/
# Configuration file with private data:
-# *.env
-# .env
+*.env
+.env
# Local settings files:
*local.py
diff --git a/get-gitlab-projects/get_project_core/.gitignore b/get-gitlab-projects/get_project_core/.gitignore
new file mode 100644
index 0000000..2eea525
--- /dev/null
+++ b/get-gitlab-projects/get_project_core/.gitignore
@@ -0,0 +1 @@
+.env
\ No newline at end of file
diff --git a/get-gitlab-projects/get_project_core/__init__.py b/get-gitlab-projects/get_project_core/__init__.py
new file mode 100644
index 0000000..62a2ee5
--- /dev/null
+++ b/get-gitlab-projects/get_project_core/__init__.py
@@ -0,0 +1,4 @@
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
diff --git a/get-gitlab-projects/get_project_core/settings.py b/get-gitlab-projects/get_project_core/settings.py
new file mode 100644
index 0000000..67ffab0
--- /dev/null
+++ b/get-gitlab-projects/get_project_core/settings.py
@@ -0,0 +1,30 @@
+import importlib.util
+import logging
+import sys
+
+from decouple import AutoConfig
+from pathlib import Path
+
+current_dir = Path(__file__).parent.parent
+config = AutoConfig(search_path=current_dir.joinpath('get_project_core'))
+
+
+# use loguru if it is possible for color output
+if importlib.util.find_spec('loguru') is not None:
+ from loguru import logger
+ logger.remove()
+ logger.add(sink=sys.stdout, colorize=True, level='DEBUG',
+ format="{time:DD.MM.YYYY HH:mm:ss} | {level} | "
+ "{message}")
+
+# use standard logging
+else:
+ logger = logging.getLogger()
+ logger.setLevel(logging.INFO)
+
+ console_handler = logging.StreamHandler()
+ console_handler.setLevel(logging.INFO)
+ log_formatter = logging.Formatter("%(asctime)s | %(levelname)s | %(message)s")
+ console_handler.setFormatter(log_formatter)
+
+ logger.addHandler(console_handler)
diff --git a/get-gitlab-projects/get_project_core/update-repos.sh b/get-gitlab-projects/get_project_core/update-repos.sh
new file mode 100755
index 0000000..7598269
--- /dev/null
+++ b/get-gitlab-projects/get_project_core/update-repos.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/bash
+
+git pull --all
\ No newline at end of file
diff --git a/get-gitlab-projects/get_projects.py b/get-gitlab-projects/get_projects.py
new file mode 100644
index 0000000..3237f14
--- /dev/null
+++ b/get-gitlab-projects/get_projects.py
@@ -0,0 +1,40 @@
+import json # noqa # pylint: disable=unused-import
+import subprocess
+import time
+
+import requests
+
+from get_project_core.settings import logger, config, current_dir
+
+headers = {'PRIVATE-TOKEN': config('X5_SCM_TOKEN', cast=str)}
+
+
+def create_repositories(group_id: int):
+ """
+ Create submodules from gitlab group
+
+ :param group_id: Can be find under group name
+ """
+ request = requests.get(f'https://scm.x5.ru/api/v4/groups/{group_id}/projects', headers=headers, verify=False)
+ # logger.info(f'{json.dumps(request.json(), indent=4, separators=(",", ":"))}')
+
+ repos = request.json()
+
+ for repo in repos:
+ name = str(repo.get("ssh_url_to_repo", None)).strip()
+ subprocess.Popen(['git', 'submodule', 'add', name])
+ logger.info(f'Created: {name}')
+ time.sleep(15)
+
+
+def update_submodules():
+ """
+ Update all submodules
+
+ """
+ subprocess.Popen(['git', 'submodule', 'foreach', f'{current_dir}/get-project-core/update-repos.sh'])
+
+
+if __name__ == '__main__':
+ create_repositories(group_id=3574)
+ # update_submodules()