Procházet zdrojové kódy

Merge pull request #2573 from bass9030/docker-mysql-support

docker 구동시 mysql 지원추가
잉여개발기 před 9 měsíci
rodič
revize
8d5de7d951
7 změnil soubory, kde provedl 137 přidání a 35 odebrání
  1. 2 0
      .dockerignore
  2. 6 1
      .gitignore
  3. 14 10
      Dockerfile.ko
  4. 2 0
      debug_build.sh
  5. 41 0
      docker-compose.yaml
  6. 2 1
      requirements.txt
  7. 70 23
      route/tool/func.py

+ 2 - 0
.dockerignore

@@ -8,6 +8,8 @@ data/version.json
 
 route/tool/set_mark/custom.py
 
+*_data
+
 images
 
 .vscode

+ 6 - 1
.gitignore

@@ -36,4 +36,9 @@ route_go/bin/*
 !route_go/bin/test
 
 sitemap.xml
-sitemap_0.xml
+sitemap_0.xml
+
+*_data
+
+venv
+.env

+ 14 - 10
Dockerfile.ko

@@ -1,22 +1,26 @@
-FROM python:3.11.10-slim
+FROM python:3.11
 
 MAINTAINER 2du <min08101@naver.com>
 MAINTAINER hoparkgo9ma <me@ho9.me>
 
-ENV NAMU_DB_TYPE sqlite
-ENV NAMU_DB data
-ENV NAMU_HOST 0.0.0.0
-ENV NAMU_PORT 3000
-ENV NAMU_GOLANGPORT 3001
-ENV NAMU_LANG ko-KR
-ENV NAMU_MARKUP namumark
-ENV NAMU_ENCRYPT sha3
-ENV NAMU_DOCKER O
+
+ENV NAMU_DB_TYPE=sqlite
+ENV NAMU_DB=data
+ENV NAMU_HOST=0.0.0.0
+ENV NAMU_PORT=3000
+ENV NAMU_GOLANGPORT=3001
+ENV NAMU_LANG=ko-KR
+ENV NAMU_MARKUP=namumark
+ENV NAMU_ENCRYPT=sha3
+ENV NAMU_DOCKER=O
 
 ADD . /app
 WORKDIR /app
 
+# RUN echo "nameserver 1.1.1.1" >> /etc/resolv.conf
 RUN pip install -r requirements.txt
+RUN pip install -r requirements-optional.txt
+
 EXPOSE 3000
 
 CMD [ "python", "./app.py" ]

+ 2 - 0
debug_build.sh

@@ -0,0 +1,2 @@
+sudo rm -rf *_data
+docker compose up --build

+ 41 - 0
docker-compose.yaml

@@ -0,0 +1,41 @@
+services:
+    opennamu-web:
+        container_name: opennamu-web
+        # image: opennamu:latest
+        build:
+            context: .
+            dockerfile: Dockerfile.ko
+        ports:
+            - "3000:3000"
+        volumes:
+            - ./docker_data:/app/data
+        environment:
+            NAMU_DB_TYPE: mysql
+            NAMU_DB: data
+            NAMU_DB_HOST: opennamu-db
+            NAMU_DB_PORT: 3306
+            NAMU_DB_USER: opennamu
+            NAMU_DB_PASSWORD: opennamu_password
+            NAMU_LANG: ko-KR
+            NAMU_MARKUP: namumark
+        networks:
+            - opennamu
+        depends_on:
+            - opennamu-db
+
+    opennamu-db:
+        container_name: opennamu-db
+        image: mysql:latest
+        restart: always
+        environment:
+            MYSQL_ROOT_PASSWORD: root_password
+            MYSQL_DATABASE: data
+            MYSQL_USER: opennamu
+            MYSQL_PASSWORD: opennamu_password
+        volumes:
+            - ./db_data:/var/lib/mysql
+        networks:
+            - opennamu
+
+networks:
+    opennamu:

+ 2 - 1
requirements.txt

@@ -14,4 +14,5 @@ diff-match-patch
 
 pillow
 
-pymysql
+pymysql
+cryptography

+ 70 - 23
route/tool/func.py

@@ -25,13 +25,16 @@ print('Skin set version : ' + version_list['s_ver'])
 
 # Init-PIP_Install
 data_up_date = 1
-if os.path.exists(os.path.join('data', 'version.json')):
+if os.path.exists(os.path.join('data', 'version.json')): 
     with open(os.path.join('data', 'version.json'), encoding = 'utf8') as file_data:
         data_load_ver = file_data.read()
     
     if data_load_ver == version_list['r_ver']:
         data_up_date = 0
 
+if os.getenv('NAMU_DOCKER') == 'O': # skip update check when run at docker
+    data_up_date = 0
+
 if data_up_date == 1:
     with open(os.path.join('data', 'version.json'), 'w', encoding = 'utf8') as f:
         f.write(version_list['r_ver'])
@@ -254,25 +257,46 @@ class get_db_connect:
                 isolation_level = None
             )
         else:
-            if self.init_mode:
-                self.conn = pymysql.connect(
-                    host = self.db_set['db_mysql_host'],
-                    user = self.db_set['db_mysql_user'],
-                    password = self.db_set['db_mysql_pw'],
-                    charset = 'utf8mb4',
-                    port = int(self.db_set['db_mysql_port']),
-                    autocommit = True
-                )
-            else:
-                self.conn = pymysql.connect(
-                    host = self.db_set['db_mysql_host'],
-                    user = self.db_set['db_mysql_user'],
-                    password = self.db_set['db_mysql_pw'],
-                    charset = 'utf8mb4',
-                    port = int(self.db_set['db_mysql_port']),
-                    autocommit = True,
-                    db = self.db_set['db_name']
-                )
+            # try connect
+            print('Wait for DB connection...')
+
+            self.conn = None
+            try_cnt = 1
+            max_try = 30
+            while self.conn == None and try_cnt <= max_try:
+                try:
+                    if self.init_mode:
+                        self.conn = pymysql.connect(
+                            host = self.db_set['db_mysql_host'],
+                            user = self.db_set['db_mysql_user'],
+                            password = self.db_set['db_mysql_pw'],
+                            charset = 'utf8mb4',
+                            port = int(self.db_set['db_mysql_port']),
+                            autocommit = True
+                        )
+                    else:
+                        self.conn = pymysql.connect(
+                            host = self.db_set['db_mysql_host'],
+                            user = self.db_set['db_mysql_user'],
+                            password = self.db_set['db_mysql_pw'],
+                            charset = 'utf8mb4',
+                            port = int(self.db_set['db_mysql_port']),
+                            autocommit = True,
+                            db = self.db_set['db_name']
+                        )
+                except pymysql.err.OperationalError as err:
+                    if try_cnt + 1 > max_try:
+                        raise err
+                finally:
+                    if self.conn == None:
+                        try_cnt += 1
+                        time.sleep(1)
+
+            
+            if self.conn == None:
+                raise Exception("Unable to connect database")
+
+        print('DB connected')
 
         return self.conn
     
@@ -344,7 +368,31 @@ class class_check_json:
         return data_db_set
 
     def do_check_mysql_json(self, data_db_set):
-        if os.path.exists(os.path.join('data', 'mysql.json')):
+        
+        def do_check_mysql_env():
+            env_keys = ['NAMU_DB_HOST', 'NAMU_DB_PORT', 'NAMU_DB_USER', 'NAMU_DB_PASSWORD']
+            vaild = False
+            for key in env_keys:
+                if os.getenv(key):
+                    vaild = True
+                    break
+            return vaild
+        
+        if do_check_mysql_env():
+            # ['user', 'password', 'host', 'port']
+            set_data_mysql = {}
+            set_data_mysql['host'] = os.getenv('NAMU_DB_HOST') if os.getenv('NAMU_DB_HOST') else 'localhost'
+            set_data_mysql['port'] = os.getenv('NAMU_DB_PORT') if os.getenv('NAMU_DB_PORT') else 3306
+
+            if not os.getenv('NAMU_DB_USER'):
+                raise Exception('Error : NAMU_DB_USER env not set')
+            else: 
+                set_data_mysql['user'] = os.getenv('NAMU_DB_USER')
+            if not os.getenv('NAMU_DB_PASSWORD'):
+                raise Exception('Error : NAMU_DB_PASSWORD env not set')
+            else:
+                set_data_mysql['password'] = os.getenv('NAMU_DB_PASSWORD')
+        elif os.path.exists(os.path.join('data', 'mysql.json')):
             db_set_list = ['user', 'password', 'host', 'port']
             with open(os.path.join('data', 'mysql.json'), encoding = 'utf8') as file_data:
                 set_data = json_loads(file_data.read())
@@ -356,8 +404,7 @@ class class_check_json:
                     break
 
             set_data_mysql = set_data
-
-        if not os.path.exists(os.path.join('data', 'mysql.json')):
+        elif not os.path.exists(os.path.join('data', 'mysql.json')):
             set_data_mysql = {}
 
             print('DB user ID : ', end = '')