Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7e7bde05b8 |
@@ -1,8 +1,6 @@
|
|||||||
|
|
||||||
#MARIADB 비밀번호. (필수)
|
#MARIADB 비밀번호. (필수)
|
||||||
MARIADB_ROOT_PASSWORD=
|
MARIADB_ROOT_PASSWORD=
|
||||||
#MARIADB ROOT 접근 주소(선택, 외부 접근 시 % 입력)
|
|
||||||
MARIADB_ROOT_HOST=
|
|
||||||
HIDCHE_PW_SALT=
|
HIDCHE_PW_SALT=
|
||||||
HIDCHE_DB_PREFIX=hidche
|
HIDCHE_DB_PREFIX=hidche
|
||||||
|
|
||||||
|
|||||||
+6
-14
@@ -1,17 +1,17 @@
|
|||||||
FROM php:8.2-fpm-bullseye
|
FROM php:8.1-fpm-bullseye
|
||||||
#debian
|
#debian
|
||||||
|
|
||||||
ENV LC_ALL=C.UTF-8
|
ENV LC_ALL=C.UTF-8
|
||||||
|
|
||||||
RUN apt -y update ;\
|
RUN apt -y update ;\
|
||||||
apt -y install \
|
apt -y install \
|
||||||
bzip2 zip unzip p7zip-full git rsync \
|
bzip2 git rsync \
|
||||||
libmemcached-dev libcurl4-openssl-dev \
|
libmemcached-dev libcurl4-openssl-dev libmcrypt-dev \
|
||||||
libicu-dev libjpeg-dev libpng-dev libwebp-dev libavif-dev libfreetype6-dev \
|
libicu-dev libjpeg-dev libpng-dev libwebp-dev libfreetype6-dev \
|
||||||
libzip-dev libxml2-dev libsqlite3-dev gosu build-essential;
|
libzip-dev libxml2-dev libsqlite3-dev gosu build-essential;
|
||||||
|
|
||||||
RUN debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; \
|
RUN debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; \
|
||||||
docker-php-ext-configure gd --with-freetype --with-webp --with-avif --with-jpeg --with-png ; \
|
docker-php-ext-configure gd --with-freetype-dir=/usr --with-png-dir=/usr --with-jpeg-dir=/usr --with-webp-dir=/usr; \
|
||||||
docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd; \
|
docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd; \
|
||||||
docker-php-ext-configure mysqli --with-mysqli=mysqlnd; \
|
docker-php-ext-configure mysqli --with-mysqli=mysqlnd; \
|
||||||
docker-php-ext-install -j "$(nproc)" \
|
docker-php-ext-install -j "$(nproc)" \
|
||||||
@@ -19,14 +19,11 @@ RUN debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; \
|
|||||||
gd \
|
gd \
|
||||||
intl \
|
intl \
|
||||||
opcache \
|
opcache \
|
||||||
sysvmsg \
|
|
||||||
sysvsem \
|
|
||||||
sysvshm \
|
|
||||||
pcntl \
|
pcntl \
|
||||||
pdo_mysql \
|
pdo_mysql \
|
||||||
mysqli \
|
mysqli \
|
||||||
zip;
|
zip;
|
||||||
RUN pecl install memcached ds;
|
RUN pecl install memcached mcrypt;
|
||||||
|
|
||||||
RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - && \
|
RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - && \
|
||||||
apt install -yq nodejs
|
apt install -yq nodejs
|
||||||
@@ -61,10 +58,5 @@ RUN if [ "$UID" != 33 ]; then \
|
|||||||
|
|
||||||
COPY sam_conf.ini /usr/local/etc/php/conf.d/sam_conf.ini
|
COPY sam_conf.ini /usr/local/etc/php/conf.d/sam_conf.ini
|
||||||
|
|
||||||
# SETUP PHP-FPM CONFIG SETTINGS (max_children / max_requests)
|
|
||||||
RUN echo 'pm.max_children = 15' >> /usr/local/etc/php-fpm.d/zz-docker.conf && \
|
|
||||||
echo 'pm.max_requests = 500' >> /usr/local/etc/php-fpm.d/zz-docker.conf && \
|
|
||||||
echo 'request_terminate_timeout = 600' >> /usr/local/etc/php-fpm.d/zz-docker.conf
|
|
||||||
|
|
||||||
ENTRYPOINT ["entrypoint.sh"]
|
ENTRYPOINT ["entrypoint.sh"]
|
||||||
CMD ["php-fpm"]
|
CMD ["php-fpm"]
|
||||||
@@ -15,6 +15,12 @@ if [ ! -f "$samRoot/index.php" ]; then
|
|||||||
chown -R www-data:www-data $wwwRoot
|
chown -R www-data:www-data $wwwRoot
|
||||||
gosu www-data git clone $gameGitPath $samRoot
|
gosu www-data git clone $gameGitPath $samRoot
|
||||||
gosu www-data git checkout $gameGitBranch
|
gosu www-data git checkout $gameGitBranch
|
||||||
|
|
||||||
|
pushd $samRoot
|
||||||
|
gosu www-data npm ci
|
||||||
|
gosu www-data npm run build -- --env target=gateway
|
||||||
|
gosu www-data php composer.phar install
|
||||||
|
popd
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$HIDCHE_IMAGE_USE_INTERNAL" = "yes" ] && [ ! -d "$imageRoot" ]; then
|
if [ "$HIDCHE_IMAGE_USE_INTERNAL" = "yes" ] && [ ! -d "$imageRoot" ]; then
|
||||||
|
|||||||
@@ -16,6 +16,3 @@ opcache.save_comments=1
|
|||||||
opcache.revalidate_freq=1
|
opcache.revalidate_freq=1
|
||||||
opcache.file_cache="/var/www/opcache"
|
opcache.file_cache="/var/www/opcache"
|
||||||
opcache.jit="function"
|
opcache.jit="function"
|
||||||
|
|
||||||
extension=ds.so
|
|
||||||
extension=memcached.so
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
FROM python:3-alpine
|
|
||||||
#alpine + python3 + cron(from alpine) + mariadb-client
|
|
||||||
RUN apk add --no-cache mariadb-client rsync
|
|
||||||
|
|
||||||
COPY run_backup.py /usr/local/bin/
|
|
||||||
RUN chmod +x /usr/local/bin/run_backup.py && \
|
|
||||||
echo '0 5 * * * python3 /usr/local/bin/run_backup.py' > /etc/crontabs/root
|
|
||||||
|
|
||||||
ENTRYPOINT []
|
|
||||||
CMD ["crond", "-f" , "-L", "/dev/stdout"]
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import os
|
|
||||||
import os.path
|
|
||||||
from subprocess import Popen, PIPE, run as subprocess_run
|
|
||||||
from datetime import datetime
|
|
||||||
from multiprocessing.dummy import Pool as ThreadPool
|
|
||||||
|
|
||||||
def backup_table(db_name, table_name, output_prefix):
|
|
||||||
sql_path = '{}/{}/{}.sql.gz'.format(output_prefix, db_name, table_name)
|
|
||||||
#print(sql_path)
|
|
||||||
with open(sql_path, 'wb') as sql_out:
|
|
||||||
sqldump = Popen(['mysqldump', '-f', '--skip-comments', '-h', 'db', '-u', 'root', '--password={}'.format(root_pw), db_name, table_name], stdout=PIPE)
|
|
||||||
gzdump = Popen(['gzip', '-c'], stdin=sqldump.stdout, stdout=sql_out)
|
|
||||||
sqldump.wait()
|
|
||||||
gzdump.wait()
|
|
||||||
os.chmod(sql_path, 0o644)
|
|
||||||
print('sql done {}, {}'.format(db_name, table_name))
|
|
||||||
|
|
||||||
def backup_files(src_path, output_path):
|
|
||||||
subprocess_run(['rsync', '-au', src_path, output_path])
|
|
||||||
print('file done {}'.format(src_path))
|
|
||||||
|
|
||||||
now = datetime.now()
|
|
||||||
print('> backup begin', now.isoformat())
|
|
||||||
weekday = now.weekday()
|
|
||||||
hour = now.hour
|
|
||||||
|
|
||||||
store_path = '/var/backup'
|
|
||||||
output_prefix = '{}/hidche_backup_w{}-{:02}'.format(store_path, weekday, hour)
|
|
||||||
|
|
||||||
os.makedirs(output_prefix, exist_ok=True)
|
|
||||||
|
|
||||||
db_prefix = os.environ['HIDCHE_DB_PREFIX']
|
|
||||||
server_list = os.environ['HIDCHE_SERVER_LIST'].strip(' ,').split(',')
|
|
||||||
server_list.append('root')
|
|
||||||
|
|
||||||
board_db_name = os.environ['HIDCHE_DB_BBS_USER']
|
|
||||||
server_list.append(board_db_name)
|
|
||||||
#print(server_list)
|
|
||||||
|
|
||||||
root_pw = os.environ['MARIADB_ROOT_PASSWORD']
|
|
||||||
|
|
||||||
board_files_path = os.environ.get('HIDCHE_BOARD_FILES_PATH', '/var/www/board/files')
|
|
||||||
|
|
||||||
with ThreadPool(4) as pool:
|
|
||||||
waiters = []
|
|
||||||
waiters.append(pool.apply_async(backup_files, ('/var/www/html/sam/d_pic', '{}/sam_image'.format(output_prefix))))
|
|
||||||
print(board_files_path)
|
|
||||||
if os.path.exists(board_files_path):
|
|
||||||
waiters.append(pool.apply_async(backup_files, (board_files_path, '{}/board_files'.format(output_prefix))))
|
|
||||||
|
|
||||||
for server_name in server_list:
|
|
||||||
db_name = '{}_{}'.format(db_prefix, server_name)
|
|
||||||
raw_tables = subprocess_run(['mysql', '-NBA' , '-h' ,'db', '-u', 'root' ,'--password={}'.format(root_pw), '-D', db_name, '-e', 'show tables'], stdout=PIPE)
|
|
||||||
raw_tables = raw_tables.stdout.decode('utf-8').strip(' \n\t')
|
|
||||||
if raw_tables == '':
|
|
||||||
continue
|
|
||||||
|
|
||||||
tables = raw_tables.split('\n')
|
|
||||||
d_setting_path = '/var/www/html/sam/{}/d_setting'.format(server_name)
|
|
||||||
|
|
||||||
if os.path.exists(d_setting_path):
|
|
||||||
waiters.append(pool.apply_async(backup_files, (d_setting_path, '{}/{}'.format(output_prefix, db_name))))
|
|
||||||
|
|
||||||
os.makedirs('{}/{}'.format(output_prefix, db_name), exist_ok=True)
|
|
||||||
for table_name in tables:
|
|
||||||
waiters.append(pool.apply_async(backup_table, (db_name, table_name, output_prefix)))
|
|
||||||
for waiter in waiters:
|
|
||||||
waiter.wait()
|
|
||||||
|
|
||||||
print('> backup finish', datetime.now().isoformat())
|
|
||||||
+19
-7
@@ -1,17 +1,17 @@
|
|||||||
FROM php:8.2-fpm-bullseye
|
FROM php:7.4-fpm-bullseye
|
||||||
#debian
|
#debian
|
||||||
|
|
||||||
ENV LC_ALL=C.UTF-8
|
ENV LC_ALL=C.UTF-8
|
||||||
|
|
||||||
RUN apt -y update ;\
|
RUN apt -y update ;\
|
||||||
apt -y install \
|
apt -y install \
|
||||||
bzip2 zip unzip p7zip-full git rsync \
|
bzip2 git rsync \
|
||||||
libmemcached-dev libcurl4-openssl-dev \
|
libmemcached-dev libcurl4-openssl-dev libmcrypt-dev \
|
||||||
libicu-dev libjpeg-dev libpng-dev libwebp-dev libavif-dev libfreetype6-dev \
|
libicu-dev libjpeg-dev libpng-dev libwebp-dev libfreetype6-dev \
|
||||||
libzip-dev libxml2-dev libsqlite3-dev gosu build-essential;
|
libzip-dev libxml2-dev libsqlite3-dev gosu build-essential;
|
||||||
|
|
||||||
RUN debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; \
|
RUN debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; \
|
||||||
docker-php-ext-configure gd --with-freetype --with-webp --with-avif --with-jpeg --with-png ; \
|
docker-php-ext-configure gd --with-freetype-dir=/usr --with-png-dir=/usr --with-jpeg-dir=/usr --with-webp-dir=/usr; \
|
||||||
docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd; \
|
docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd; \
|
||||||
docker-php-ext-configure mysqli --with-mysqli=mysqlnd; \
|
docker-php-ext-configure mysqli --with-mysqli=mysqlnd; \
|
||||||
docker-php-ext-install -j "$(nproc)" \
|
docker-php-ext-install -j "$(nproc)" \
|
||||||
@@ -23,9 +23,21 @@ RUN debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; \
|
|||||||
pdo_mysql \
|
pdo_mysql \
|
||||||
mysqli \
|
mysqli \
|
||||||
zip;
|
zip;
|
||||||
RUN pecl install memcached ds;
|
RUN pecl install memcached mcrypt;
|
||||||
#from nextcloud setting
|
#from nextcloud setting
|
||||||
RUN mkdir -p /var/www/board; \
|
RUN { \
|
||||||
|
echo 'opcache.enable=1'; \
|
||||||
|
echo 'opcache.interned_strings_buffer=8'; \
|
||||||
|
echo 'opcache.max_accelerated_files=10000'; \
|
||||||
|
echo 'opcache.memory_consumption=128'; \
|
||||||
|
echo 'opcache.save_comments=1'; \
|
||||||
|
echo 'opcache.revalidate_freq=1'; \
|
||||||
|
} > /usr/local/etc/php/conf.d/opcache-recommended.ini; \
|
||||||
|
\
|
||||||
|
echo 'apc.enable_cli=1' >> /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini; \
|
||||||
|
\
|
||||||
|
echo 'memory_limit=512M' > /usr/local/etc/php/conf.d/memory-limit.ini; \
|
||||||
|
mkdir -p /var/www/board; \
|
||||||
mkdir -p /var/www/.ssh;
|
mkdir -p /var/www/.ssh;
|
||||||
|
|
||||||
COPY entrypoint.sh /usr/local/bin/
|
COPY entrypoint.sh /usr/local/bin/
|
||||||
|
|||||||
@@ -329,7 +329,6 @@ docker_setup_db() {
|
|||||||
mysql_note "Creating database ${fullDBName}"
|
mysql_note "Creating database ${fullDBName}"
|
||||||
subPW=`echo -n ${dbName}${HIDCHE_PW_SALT}${MARIADB_ROOT_PASSWORD}${dbName}${HIDCHE_PW_SALT} | shasum -a 512`
|
subPW=`echo -n ${dbName}${HIDCHE_PW_SALT}${MARIADB_ROOT_PASSWORD}${dbName}${HIDCHE_PW_SALT} | shasum -a 512`
|
||||||
subPW=${subPW:0:32}
|
subPW=${subPW:0:32}
|
||||||
mysql_note "GENERATED ${fullDBName} PASSWORD: $subPW"
|
|
||||||
local userPasswordEscaped
|
local userPasswordEscaped
|
||||||
userPasswordEscaped=$( docker_sql_escape_string_literal "${subPW}" )
|
userPasswordEscaped=$( docker_sql_escape_string_literal "${subPW}" )
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ services:
|
|||||||
build: ./web
|
build: ./web
|
||||||
restart: always
|
restart: always
|
||||||
#ports:
|
#ports:
|
||||||
|
# 기본 포트로 사용할 곳 지정. 아래와 같이 사용하면 8080
|
||||||
# - 8080:80
|
# - 8080:80
|
||||||
volumes:
|
volumes:
|
||||||
- hidche:/var/www/html:ro
|
- hidche:/var/www/html:ro
|
||||||
@@ -54,23 +55,6 @@ services:
|
|||||||
- db
|
- db
|
||||||
- web
|
- web
|
||||||
|
|
||||||
backup:
|
|
||||||
build: ./backup
|
|
||||||
restart: "no"
|
|
||||||
#restart: always
|
|
||||||
command:
|
|
||||||
- echo 'backup is disabled'
|
|
||||||
#- crond -f -L /dev/stdout
|
|
||||||
volumes:
|
|
||||||
- hidche:/var/www/html:ro
|
|
||||||
- backup:/var/backup
|
|
||||||
env_file:
|
|
||||||
- account.env
|
|
||||||
- game.env
|
|
||||||
depends_on:
|
|
||||||
- app
|
|
||||||
- db
|
|
||||||
|
|
||||||
cron:
|
cron:
|
||||||
build: ./cron
|
build: ./cron
|
||||||
restart: always
|
restart: always
|
||||||
@@ -83,4 +67,3 @@ volumes:
|
|||||||
db:
|
db:
|
||||||
hidche:
|
hidche:
|
||||||
board:
|
board:
|
||||||
backup:
|
|
||||||
@@ -66,19 +66,3 @@ services:
|
|||||||
target: /var/www/html
|
target: /var/www/html
|
||||||
depends_on:
|
depends_on:
|
||||||
- app
|
- app
|
||||||
|
|
||||||
backup:
|
|
||||||
restart: "no"
|
|
||||||
entrypoint: ["echo", "backup is disabled"]
|
|
||||||
volumes:
|
|
||||||
- type: bind
|
|
||||||
source: ~/dev_sam/backup
|
|
||||||
target: /var/backup
|
|
||||||
- type: bind
|
|
||||||
read_only: true
|
|
||||||
source: ~/dev_sam/app
|
|
||||||
target: /var/www/html
|
|
||||||
- type: bind
|
|
||||||
read_only: true
|
|
||||||
source: ~/dev_sam/board
|
|
||||||
target: /var/www/board
|
|
||||||
|
|||||||
@@ -19,6 +19,3 @@ HIDCHE_GAME_PATH=http://127.0.0.1:8080/sam
|
|||||||
HIDCHE_IMAGE_USE_INTERNAL=yes
|
HIDCHE_IMAGE_USE_INTERNAL=yes
|
||||||
#이미지 경로, HIDCHE_IMAGE_USE_INTERNAL이 yes인 경우 HIDCHE_GAME_PATH의 상대 경로. yes가 아닌 경우 전체 도메인 경로.
|
#이미지 경로, HIDCHE_IMAGE_USE_INTERNAL이 yes인 경우 HIDCHE_GAME_PATH의 상대 경로. yes가 아닌 경우 전체 도메인 경로.
|
||||||
HIDCHE_IMAGE_PATH=../image
|
HIDCHE_IMAGE_PATH=../image
|
||||||
|
|
||||||
#게시판 서버내 파일 백업 경로, /var/www/board/files 가 아니라면 직접 지정
|
|
||||||
#HIDCHE_BOARD_FILES_PATH=
|
|
||||||
@@ -81,8 +81,6 @@ setupDBResult = session.post('http://web/sam/f_install/j_setup_db.php', {
|
|||||||
'kakao_rest_key':env['HIDCHE_KAKAO_REST_KEY'],
|
'kakao_rest_key':env['HIDCHE_KAKAO_REST_KEY'],
|
||||||
'kakao_admin_key':env['HIDCHE_KAKAO_ADMIN_KEY'],
|
'kakao_admin_key':env['HIDCHE_KAKAO_ADMIN_KEY'],
|
||||||
}, headers=headers)
|
}, headers=headers)
|
||||||
if not setupDBResult.ok:
|
|
||||||
print(setupDBResult, flush=True)
|
|
||||||
setupDBJsonResult = json.loads(setupDBResult.text)
|
setupDBJsonResult = json.loads(setupDBResult.text)
|
||||||
print(setupDBJsonResult, flush=True)
|
print(setupDBJsonResult, flush=True)
|
||||||
|
|
||||||
@@ -101,8 +99,13 @@ setupAdminResult = session.post('http://web/sam/f_install/j_create_admin.php', q
|
|||||||
setupAdminJsonResult = json.loads(setupAdminResult.text)
|
setupAdminJsonResult = json.loads(setupAdminResult.text)
|
||||||
print(setupAdminJsonResult, flush=True)
|
print(setupAdminJsonResult, flush=True)
|
||||||
|
|
||||||
|
jsonQuery = {
|
||||||
|
"path": ["Login", "LoginByID"],
|
||||||
|
"args": query
|
||||||
|
}
|
||||||
|
|
||||||
print("Login Admin...", flush=True)
|
print("Login Admin...", flush=True)
|
||||||
loginResult = session.post('http://web/sam/api.php?path=Login%2FLoginByID', json=query, headers=headers)
|
loginResult = session.post('http://web/sam/api.php', json=jsonQuery)
|
||||||
print(loginResult.text, flush=True)
|
print(loginResult.text, flush=True)
|
||||||
|
|
||||||
serverList = str(env['HIDCHE_SERVER_LIST']).split(',')
|
serverList = str(env['HIDCHE_SERVER_LIST']).split(',')
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ server {
|
|||||||
include fastcgi_params;
|
include fastcgi_params;
|
||||||
fastcgi_pass board:9000;
|
fastcgi_pass board:9000;
|
||||||
fastcgi_index index.php;
|
fastcgi_index index.php;
|
||||||
fastcgi_param REMOTE_ADDR $http_x_real_ip;
|
|
||||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -37,7 +36,6 @@ server {
|
|||||||
proxy_read_timeout 600;
|
proxy_read_timeout 600;
|
||||||
fastcgi_pass app:9000;
|
fastcgi_pass app:9000;
|
||||||
fastcgi_index index.php;
|
fastcgi_index index.php;
|
||||||
fastcgi_param REMOTE_ADDR $http_x_real_ip;
|
|
||||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user