diff --git a/account.env b/account.env new file mode 100644 index 0000000..0831971 --- /dev/null +++ b/account.env @@ -0,0 +1,15 @@ + +#MYSQL 비밀번호. (필수) +MYSQL_ROOT_PASSWORD= +MYSQL_USER=hidche +MYSQL_PASSWORD= +HIDCHE_DB_PREFIX=hidche + + +#운영자 계정, 비밀번호. +HIDCHE_ADMIN= +HIDCHE_PASSWORD= + +#카카오 로그인을 위한 API +HIDCHE_KAKAO_REST_KEY= +HIDCHE_KAKAO_ADMIN_KEY= diff --git a/app/Dockerfile b/app/Dockerfile index 26d0887..b725d2a 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -37,14 +37,22 @@ RUN { \ \ echo 'memory_limit=512M' > /usr/local/etc/php/conf.d/memory-limit.ini; \ \ - mkdir /var/www/data; \ + mkdir -p /var/www/data; \ chown -R www-data:root /var/www; \ - chmod -R g=u /var/www + chmod -R g=u /var/www; \ + mkdir -p /var/www/.ssh; \ + chown www-data:www-data /var/www/.ssh; \ + chmod 700 /var/www/.ssh VOLUME /var/www/html ENV TZ=Asia/Seoul COPY entrypoint_hidche_app.sh /usr/local/bin/ +COPY id_ecdsa.key /var/www/.ssh/id_ecdsa +COPY known_hosts /var/www/.ssh/known_hosts +RUN \ + chown www-data:www-data /var/www/.ssh/*; \ + chmod 600 /var/www/.ssh/*; ENTRYPOINT ["entrypoint_hidche_app.sh"] CMD ["php-fpm"] \ No newline at end of file diff --git a/app/entrypoint_hidche_app.sh b/app/entrypoint_hidche_app.sh index fa0c473..d4a5724 100755 --- a/app/entrypoint_hidche_app.sh +++ b/app/entrypoint_hidche_app.sh @@ -1,27 +1,25 @@ #!/bin/bash -set -euxo pipefail +set -uxo pipefail shopt -s nullglob ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone +printf "[PHP]\ndate.timezone = \"$TZ\"\n" > /usr/local/etc/php/conf.d/tzone.ini wwwRoot="/var/www/html" samRoot="$wwwRoot/sam" imageRoot="$wwwRoot/image" -gameGitPath="https://storage.hided.net/gogs/devsam/core.git" -imgGitPath="https://storage.hided.net/gogs/devsam/image.git" - - -if [ ! -f "$wwwRoot/index.php" ]; then - echo " $wwwRoot/index.php - chown www-data:www-data $wwwRoot/index.php -fi - if [ ! -f "$samRoot/index.php" ]; then gosu www-data git clone $gameGitPath /var/www/html/sam fi if [ $HIDCHE_IMAGE_USE_INTERNAL = "yes" ] && [ ! -d "$imageRoot" ]; then + if [[ "$imageRoot" =~ ^ssh ]]; then + query=`echo "> /var/www/.ssh/known_hosts 2>/dev/null; + chown www-data:www-data /var/www/.ssh/known_hosts + chmod 600 /var/www/.ssh/known_hosts + fi gosu www-data git clone $imgGitPath /var/www/html/image fi diff --git a/app/id_ecdsa.key b/app/id_ecdsa.key new file mode 100644 index 0000000..bf47d0c --- /dev/null +++ b/app/id_ecdsa.key @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIFPwAmkXCRG4Q7RSUqL9uzi4SF09iXQGB785l3/Hbw0woAoGCCqGSM49 +AwEHoUQDQgAEpGiOeQnFmPb3fecADT0jikWWO03WvJIGux5j4+kh/g3FXP2Fjb1V +4SI264WpBZFTdoSyLKXWvrLeQCXZsZwa2w== +-----END EC PRIVATE KEY----- diff --git a/app/known_hosts b/app/known_hosts new file mode 100644 index 0000000..06f12be --- /dev/null +++ b/app/known_hosts @@ -0,0 +1,3 @@ +[storage.hided.net]:2525 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCb9BLlqXb8jsnho4Db6WTMQOnhjxC42lanowDicTjzaan7JgTrRxFbrLL8zUcqMhNpFBqD9oUxV2gKD00/BoVtXEbjKoa+GjKtDyU+RfejaAw4j+nVZjyjvXoIKMyzr6NqjA3mLdcd47KLZKtFQNKcOL00foMsqYJhmr75UM6scfCj8+KnjVLkNdlFtJ9fGlnA1FGmEoldHR+htN01E/Yx8teHQGo5W0hZ/tOvE+r7NWA2PXFqOrb+IXe3URVndDZb1idInQDuMRetrWgCEZSy4/sTIss030wkHkUdDuLCt2NnUvLEVlxvpQw72k9j/nRapkGthwN7x1L8yQYKY6iv|1|XTprP1yTMznxEkakYqFoyNVBs7A=|8wea12ZyJ0L/nHHQ3nEtWJHlikA= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCb9BLlqXb8jsnho4Db6WTMQOnhjxC42lanowDicTjzaan7JgTrRxFbrLL8zUcqMhNpFBqD9oUxV2gKD00/BoVtXEbjKoa+GjKtDyU+RfejaAw4j+nVZjyjvXoIKMyzr6NqjA3mLdcd47KLZKtFQNKcOL00foMsqYJhmr75UM6scfCj8+KnjVLkNdlFtJ9fGlnA1FGmEoldHR+htN01E/Yx8teHQGo5W0hZ/tOvE+r7NWA2PXFqOrb+IXe3URVndDZb1idInQDuMRetrWgCEZSy4/sTIss030wkHkUdDuLCt2NnUvLEVlxvpQw72k9j/nRapkGthwN7x1L8yQYKY6iv +|1|3UOicj4TheEV6TEnSfmHNKhpuWU=|EL7zXO8enUCmq5tmi4WlxuEp2BM= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCb9BLlqXb8jsnho4Db6WTMQOnhjxC42lanowDicTjzaan7JgTrRxFbrLL8zUcqMhNpFBqD9oUxV2gKD00/BoVtXEbjKoa+GjKtDyU+RfejaAw4j+nVZjyjvXoIKMyzr6NqjA3mLdcd47KLZKtFQNKcOL00foMsqYJhmr75UM6scfCj8+KnjVLkNdlFtJ9fGlnA1FGmEoldHR+htN01E/Yx8teHQGo5W0hZ/tOvE+r7NWA2PXFqOrb+IXe3URVndDZb1idInQDuMRetrWgCEZSy4/sTIss030wkHkUdDuLCt2NnUvLEVlxvpQw72k9j/nRapkGthwN7x1L8yQYKY6iv +|1|M8V56tJHA+xiw51scQfhSs5nZeE=|wIw/fQk0MR3l7Bo3Mqd0zR+S4rE= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCb9BLlqXb8jsnho4Db6WTMQOnhjxC42lanowDicTjzaan7JgTrRxFbrLL8zUcqMhNpFBqD9oUxV2gKD00/BoVtXEbjKoa+GjKtDyU+RfejaAw4j+nVZjyjvXoIKMyzr6NqjA3mLdcd47KLZKtFQNKcOL00foMsqYJhmr75UM6scfCj8+KnjVLkNdlFtJ9fGlnA1FGmEoldHR+htN01E/Yx8teHQGo5W0hZ/tOvE+r7NWA2PXFqOrb+IXe3URVndDZb1idInQDuMRetrWgCEZSy4/sTIss030wkHkUdDuLCt2NnUvLEVlxvpQw72k9j/nRapkGthwN7x1L8yQYKY6iv \ No newline at end of file diff --git a/cron/Dockerfile b/cron/Dockerfile index 52296e9..bad517a 100644 --- a/cron/Dockerfile +++ b/cron/Dockerfile @@ -2,6 +2,6 @@ FROM python:3-alpine #alpine + python3 + cron(from alpine) #only cron this -RUN echo '* * * * * python3 /var/www/html/sam/src/run_daemon.py' > /etc/crontabs/root - -CMD ["crond", "-l 2", "-f"] \ No newline at end of file +COPY entrypoint.sh / +RUN chmod +x /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] \ No newline at end of file diff --git a/cron/entrypoint.sh b/cron/entrypoint.sh new file mode 100644 index 0000000..db5f214 --- /dev/null +++ b/cron/entrypoint.sh @@ -0,0 +1,3 @@ +#!/bin/sh +set -e +echo '* * * * * python3 /var/www/html/sam/src/run_daemon.py' | crontab - && crond -f -L /dev/stdout \ No newline at end of file diff --git a/db/entrypoint_hidche_db.sh b/db/entrypoint_hidche_db.sh index 204b62f..eebd19d 100755 --- a/db/entrypoint_hidche_db.sh +++ b/db/entrypoint_hidche_db.sh @@ -58,7 +58,7 @@ _check_config() { #modifed file_env 'TZ' -echo `ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone` +ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone #modifed hidcheDBList=("root" "che" "kwe" "pwe" "twe" "nya" "pya" "hwe") @@ -171,7 +171,8 @@ if [ "$1" = 'mysqld' -a -z "$wantHelp" ]; then file_env 'HIDCHE_DB_PREFIX' if [ "$HIDCHE_DB_PREFIX" ]; then for dbName in "${hidcheDBList[@]}"; do - echo "CREATE DATABASE IF NOT EXISTS \`${HIDCHE_DB_PREFIX}_${dbName}\` ;" | "${mysql[@]}" + fullDBName="${HIDCHE_DB_PREFIX}_${dbName}" + echo "CREATE DATABASE IF NOT EXISTS \`$fullDBName\` ;" | "${mysql[@]}" done mysql+=( "${HIDCHE_DB_PREFIX}_${hidcheDBList[0]}" ) @@ -185,8 +186,14 @@ if [ "$1" = 'mysqld' -a -z "$wantHelp" ]; then #modifed if [ "$HIDCHE_DB_PREFIX" ]; then for dbName in "${hidcheDBList[@]}"; do - echo "GRANT ALL ON \`${HIDCHE_DB_PREFIX}_${dbName}\`.* TO '$MYSQL_USER'@'%' ;" | "${mysql[@]}" + fullDBName="${HIDCHE_DB_PREFIX}_${dbName}" + subPW=`echo -n ${dbName}${MYSQL_USER}${MYSQL_PASSWORD}${dbName} | shasum -a 512` + subPW=${subPW:0:32} + echo "CREATE USER '$fullDBName'@'%' IDENTIFIED BY '$subPW' ;" | "${mysql[@]}" + echo "GRANT ALL ON \`$fullDBName\`.* TO '$MYSQL_USER'@'%' ;" | "${mysql[@]}" + echo "GRANT ALL ON \`$fullDBName\`.* TO '$fullDBName'@'%' ;" | "${mysql[@]}" done + fi fi @@ -207,7 +214,7 @@ if [ "$1" = 'mysqld' -a -z "$wantHelp" ]; then fi echo - echo 'MySQL init process wid HIDCHE done. Ready for start up.' + echo 'MySQL init process with HIDCHE done. Ready for start up.' echo fi fi diff --git a/docker-compose.yml b/docker-compose.yml index 5a622f2..bd29b31 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,10 +6,9 @@ services: restart: always volumes: - db:/var/lib/mysql - environment: - - MYSQL_ROOT_PASSWORD= env_file: - - setup.env + - account.env + - game.env web: build: ./web @@ -25,7 +24,7 @@ services: volumes: - hidche:/var/www/html env_file: - - setup.env + - game.env depends_on: - db - web @@ -38,7 +37,8 @@ services: environment: - MYSQL_HOST=db env_file: - - setup.env + - account.env + - game.env depends_on: - app - db @@ -48,7 +48,7 @@ services: build: ./cron restart: always volumes: - - hidche:/var/www/html:ro + - hidche:/var/www/html depends_on: - app diff --git a/game.env b/game.env new file mode 100644 index 0000000..d3fa9a7 --- /dev/null +++ b/game.env @@ -0,0 +1,19 @@ + +#서버 git 주소. +#만약 https:// 대신 ssh://로 시작하는 주소를 사용하는 경우 app/id_ecdsa.key, app/known_host 에 ecdsa 개인키와 ssh값을 추가할 것. +gameGitPath=ssh://git@storage.hided.net:2525/devsam/core.git +imgGitPath=ssh://git@storage.hided.net:2525/devsam/image.git + +#게임 시간대. +TZ=Asia/Seoul + +#서버 리스트. 구현 문제로 아래 서버들로 현재 고정. Dockercompose 값 수정 불가. +HIDCHE_SERVER_LIST=che,kwe,pwe,twe,nya,pya,hwe + +#외부에서 접근 가능한(할) 경로로 지정. +HIDCHE_GAME_PATH=http://127.0.0.1:8080/sam + +#게임 서버에서 이미지를 같이 처리할 것인지 여부. +HIDCHE_IMAGE_USE_INTERNAL=yes +#이미지 경로, HIDCHE_IMAGE_USE_INTERNAL이 yes인 경우 HIDCHE_GAME_PATH의 상대 경로. yes가 아닌 경우 전체 도메인 경로. +HIDCHE_IMAGE_PATH=../image diff --git a/install/install_hidche.py b/install/install_hidche.py index 32b904e..dc6f258 100755 --- a/install/install_hidche.py +++ b/install/install_hidche.py @@ -16,11 +16,28 @@ def hash_password(globalSalt, password): env = os.environ wwwRoot = '/var/www/html' samRoot = '%s/sam'%wwwRoot -imageRoot= '%s/image'%wwwRoot - +indexPHP = '%s/index.php'%wwwRoot if os.path.exists('%s/hwe/d_setting/DB.php'): exit(0) +useWaitIndex = False +if not os.path.exists(indexPHP): + useWaitIndex = True + fp = open(indexPHP, 'wt', encoding='utf-8') + fp.write(""" + + + +HIDCHE - Auto Install Process + + + +

Please wait for installation.

+ + +""") + fp.close() + while True: try: r = requests.head('http://web/sam/f_install/j_install_status.php') @@ -40,19 +57,21 @@ while True: session = requests.session() +db_root_pw = hash_password('root', env['MYSQL_USER']+env['MYSQL_PASSWORD'])[:32] +db_root_name = '%s_root'%env['HIDCHE_DB_PREFIX'] + setupDBResult = session.post('http://web/sam/f_install/j_setup_db.php', { 'db_host':'db', 'db_port':3306, - 'db_id':env['MYSQL_USER'], - 'db_pw':env['MYSQL_PASSWORD'], - 'db_name':'%s_root'%env['HIDCHE_DB_PREFIX'], + 'db_id':db_root_name, + 'db_pw':db_root_pw, + 'db_name':db_root_name, 'serv_host':env['HIDCHE_GAME_PATH'], 'shared_icon_path':'%s/icons'%env['HIDCHE_IMAGE_PATH'], 'game_image_path':'%s/game'%env['HIDCHE_IMAGE_PATH'], 'kakao_rest_key':env['HIDCHE_KAKAO_REST_KEY'], 'kakao_admin_key':env['HIDCHE_KAKAO_ADMIN_KEY'], }) - setupDBJsonResult = json.loads(setupDBResult.text) print(setupDBJsonResult) @@ -65,12 +84,11 @@ query = { 'password':hashPassword, 'nickname':'운영자' } -print(query) setupAdminResult = session.post('http://web/sam/f_install/j_create_admin.php', query) setupAdminJsonResult = json.loads(setupAdminResult.text) print(setupAdminJsonResult) -loginResult=session.post('http://web/sam/j_login.php', query) +loginResult = session.post('http://web/sam/j_login.php', query) print(loginResult.text) serverList = str(env['HIDCHE_SERVER_LIST']).split(',') @@ -82,13 +100,21 @@ for serverName in serverList: }) print(serverName, updateResult.text) + db_pw = hash_password(serverName, env['MYSQL_USER']+env['MYSQL_PASSWORD'])[:32] + db_name = '%s_%s'%(env['HIDCHE_DB_PREFIX'], serverName) resetResult = session.post('http://web/sam/%s/j_install_db.php'%serverName, { 'db_host':'db', 'db_port':3306, - 'db_id':env['MYSQL_USER'], - 'db_pw':env['MYSQL_PASSWORD'], - 'db_name':'%s_%s'%(env['HIDCHE_DB_PREFIX'], serverName), + 'db_id':db_name, + 'db_pw':db_pw, + 'db_name':db_name, }) print(serverName, resetResult.text) -print('Welcome to HIDCHE') \ No newline at end of file +if useWaitIndex: + fp = open(indexPHP, 'wt', encoding='utf-8') + fp.write("