Skip to content

Commit ffe8900

Browse files
build: init directory.
1 parent 9b21a36 commit ffe8900

File tree

11 files changed

+321
-5
lines changed

11 files changed

+321
-5
lines changed

.github/workflows/build-and-push.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ on:
77
inputs:
88
dockerImageTag:
99
description: 'Image Tag'
10-
default: 'v1.10.3-dev'
10+
default: 'v2.0.0-dev'
1111
required: true
1212
dockerImageTagWithLatest:
1313
description: '是否发布latest tag(正式发版时选择,测试版本切勿选择)'

apps/common/config/tokenizer_manage_config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def get_tokenizer():
1717
if TokenizerManage.tokenizer is None:
1818
TokenizerManage.tokenizer = BertTokenizer.from_pretrained(
1919
'bert-base-cased',
20-
cache_dir="/opt/maxkb/model/tokenizer",
20+
cache_dir="/opt/maxkb-app/model/tokenizer",
2121
local_files_only=True,
2222
resume_download=False,
2323
force_download=False)

installer/Dockerfile

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
FROM ghcr.io/1panel-dev/maxkb-vector-model:v1.0.1 AS vector-model
2+
FROM node:18-alpine3.18 AS web-build
3+
COPY ui ui
4+
RUN cd ui && \
5+
npm install && \
6+
npm run build && \
7+
rm -rf ./node_modules
8+
FROM ghcr.io/1panel-dev/maxkb-python-pg:python3.11-pg17.4 AS stage-build
9+
10+
ARG DEPENDENCIES=" \
11+
python3-pip"
12+
13+
RUN apt-get update && \
14+
apt-get install -y --no-install-recommends $DEPENDENCIES && \
15+
apt-get clean all && \
16+
rm -rf /var/lib/apt/lists/*
17+
18+
COPY . /opt/maxkb-app
19+
RUN mkdir -p /opt/maxkb-app /opt/maxkb-app/model && \
20+
rm -rf /opt/maxkb/app/ui
21+
22+
COPY --from=web-build ui /opt/maxkb-app/ui
23+
WORKDIR /opt/maxkb-app
24+
RUN python3 -m venv /opt/py3 && \
25+
pip install poetry==1.8.5 --break-system-packages && \
26+
poetry config virtualenvs.create false && \
27+
. /opt/py3/bin/activate && \
28+
if [ "$(uname -m)" = "x86_64" ]; then sed -i 's/^torch.*/torch = {version = "^2.6.0+cpu", source = "pytorch"}/g' pyproject.toml; fi && \
29+
poetry install && \
30+
#export MAXKB_CONFIG_TYPE=ENV && python3 /opt/maxkb-app/apps/manage.py compilemessages \
31+
echo test
32+
33+
FROM ghcr.io/1panel-dev/maxkb-python-pg:python3.11-pg17.4
34+
ARG DOCKER_IMAGE_TAG=dev \
35+
BUILD_AT \
36+
GITHUB_COMMIT
37+
38+
ENV MAXKB_VERSION="${DOCKER_IMAGE_TAG} (build at ${BUILD_AT}, commit: ${GITHUB_COMMIT})" \
39+
MAXKB_CONFIG_TYPE=ENV \
40+
MAXKB_DB_NAME=maxkb \
41+
MAXKB_DB_HOST=127.0.0.1 \
42+
MAXKB_DB_PORT=5432 \
43+
MAXKB_DB_USER=${POSTGRES_USER} \
44+
MAXKB_DB_PASSWORD=${POSTGRES_PASSWORD} \
45+
MAXKB_DB_MAX_OVERFLOW=80 \
46+
MAXKB_EMBEDDING_MODEL_NAME=/opt/maxkb-app/model/embedding/shibing624_text2vec-base-chinese \
47+
MAXKB_EMBEDDING_MODEL_PATH=/opt/maxkb-app/model/embedding \
48+
MAXKB_SANDBOX=1 \
49+
LANG=en_US.UTF-8 \
50+
PATH=/opt/py3/bin:$PATH \
51+
PIP_TARGET=/opt/maxkb/python-packages \
52+
PYTHONPATH=/opt/maxkb/python-packages \
53+
PYTHONUNBUFFERED=1
54+
55+
WORKDIR /opt/maxkb/app
56+
COPY --from=stage-build /opt/maxkb-app /opt/maxkb=app
57+
COPY --from=stage-build /opt/py3 /opt/py3
58+
COPY --from=vector-model /opt/maxkb/app/model /opt/maxkb-app/model
59+
60+
RUN chmod 755 /opt/maxkb-app/installer/*.sh && \
61+
cp -f /opt/maxkb-app/installer/*.sh /usr/bin/ && \
62+
cp -f /opt/maxkb-app/installer/init.sql /docker-entrypoint-initdb.d && \
63+
rm -rf /opt/maxkb-app/installer
64+
cp -r /opt/maxkb-app/model/base/hub /opt/maxkb-app/model/tokenizer && \
65+
curl -L --connect-timeout 120 -m 1800 https://resource.fit2cloud.com/maxkb/ffmpeg/get-ffmpeg-linux | sh && \
66+
mkdir -p /opt/maxkb-app/sandbox/ && \
67+
find /opt/maxkb-app -mindepth 1 -not -name 'sandbox' -exec chmod 700 {} + && \
68+
chmod 755 /tmp && \
69+
useradd --no-create-home --home /opt/maxkb-app/sandbox sandbox -g root && \
70+
chown -R sandbox:root /opt/maxkb-app/sandbox && \
71+
chmod g-x /usr/local/bin/* /usr/bin/* /bin/* /usr/sbin/* /sbin/* /usr/lib/postgresql/15/bin/* && \
72+
chmod g+x /usr/local/bin/python*
73+
74+
EXPOSE 8080
75+
VOLUME /opt/maxkb
76+
ENTRYPOINT ["bash", "-c"]
77+
CMD [ "/usr/bin/start-all.sh" ]

installer/Dockerfile-python-pg

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ ARG DEPENDENCIES=" \
88
ca-certificates \
99
vim \
1010
gettext \
11+
redis-server \
1112
postgresql-17-pgvector \
1213
postgresql-17-age"
1314

@@ -17,4 +18,11 @@ RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
1718
apt-get clean all && \
1819
rm -rf /var/lib/apt/lists/*
1920

20-
COPY --from=python-stage /usr/local /usr/local
21+
COPY --from=python-stage /usr/local /usr/local
22+
23+
ENV PGDATA=/opt/maxkb/data/postgresql/pgdata \
24+
POSTGRES_USER=root \
25+
POSTGRES_PASSWORD=Password123@postgres \
26+
POSTGRES_MAX_CONNECTIONS=1000 \
27+
REDIS_PASSWORD=Password123@redis \
28+
LANG=en_US.UTF-8

installer/init.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
CREATE DATABASE "maxkb";
2+
3+
\c "maxkb";
4+
5+
CREATE EXTENSION "vector";

installer/start-all.sh

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#!/bin/bash
2+
3+
if [ "$MAXKB_DB_HOST" = "127.0.0.1" ]; then
4+
echo "PostgreSQL starting..."
5+
/usr/bin/start-postgres.sh
6+
echo "PostgreSQL started."
7+
fi
8+
9+
10+
if [ "$MAXKB_REDIS_HOST" = "127.0.0.1" ]; then
11+
echo "Redis starting..."
12+
/usr/bin/start-redis.sh
13+
echo "Redis started."
14+
fi
15+
16+
/usr/bin/start-maxkb.sh

installer/start-maxkb.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/bin/bash
2+
3+
mkdir -p /opt/maxkb/logs
4+
mkdir -p /opt/maxkb/local
5+
mkdir -p /opt/maxkb/python-packages
6+
7+
python /opt/maxkb-app/main.py start

installer/start-postgres.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/bin/bash
2+
3+
mkdir -p /opt/maxkb/data/postgresql
4+
5+
docker-entrypoint.sh postgres -c max_connections=${POSTGRES_MAX_CONNECTIONS} &
6+
sleep 10
7+
/usr/bin/wait-for-it.sh 127.0.0.1:5432 --timeout=120 --strict

installer/start-redis.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/bin/bash
2+
3+
mkdir -p /opt/maxkb/data/redis
4+
5+
if [ ! -f /opt/maxkb/conf/redis.conf ]; then
6+
mkdir -p /opt/maxkb/conf
7+
touch /opt/maxkb/conf/redis.conf
8+
printf "bind 0.0.0.0\nport 6379\nmaxmemory 1G\nmaxmemory-policy allkeys-lru\ndir /opt/maxkb/data/redis\nrequirepass "${REDIS_PASSWORD}"\n" > /opt/maxkb/conf/redis.conf
9+
fi
10+
11+
redis-server /opt/maxkb/conf/redis.conf &
12+
sleep 5
13+
/usr/bin/wait-for-it.sh 127.0.0.1:6379 --timeout=60 --strict

installer/wait-for-it.sh

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
#!/usr/bin/env bash
2+
# Use this script to test if a given TCP host/port are available
3+
4+
WAITFORIT_cmdname=${0##*/}
5+
6+
echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
7+
8+
usage()
9+
{
10+
cat << USAGE >&2
11+
Usage:
12+
$WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
13+
-h HOST | --host=HOST Host or IP under test
14+
-p PORT | --port=PORT TCP port under test
15+
Alternatively, you specify the host and port as host:port
16+
-s | --strict Only execute subcommand if the test succeeds
17+
-q | --quiet Don't output any status messages
18+
-t TIMEOUT | --timeout=TIMEOUT
19+
Timeout in seconds, zero for no timeout
20+
-- COMMAND ARGS Execute command with args after the test finishes
21+
USAGE
22+
exit 1
23+
}
24+
25+
wait_for()
26+
{
27+
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
28+
echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
29+
else
30+
echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
31+
fi
32+
WAITFORIT_start_ts=$(date +%s)
33+
while :
34+
do
35+
if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
36+
nc -z $WAITFORIT_HOST $WAITFORIT_PORT
37+
WAITFORIT_result=$?
38+
else
39+
(echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
40+
WAITFORIT_result=$?
41+
fi
42+
if [[ $WAITFORIT_result -eq 0 ]]; then
43+
WAITFORIT_end_ts=$(date +%s)
44+
echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
45+
break
46+
fi
47+
sleep 1
48+
done
49+
return $WAITFORIT_result
50+
}
51+
52+
wait_for_wrapper()
53+
{
54+
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
55+
if [[ $WAITFORIT_QUIET -eq 1 ]]; then
56+
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
57+
else
58+
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
59+
fi
60+
WAITFORIT_PID=$!
61+
trap "kill -INT -$WAITFORIT_PID" INT
62+
wait $WAITFORIT_PID
63+
WAITFORIT_RESULT=$?
64+
if [[ $WAITFORIT_RESULT -ne 0 ]]; then
65+
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
66+
fi
67+
return $WAITFORIT_RESULT
68+
}
69+
70+
# process arguments
71+
while [[ $# -gt 0 ]]
72+
do
73+
case "$1" in
74+
*:* )
75+
WAITFORIT_hostport=(${1//:/ })
76+
WAITFORIT_HOST=${WAITFORIT_hostport[0]}
77+
WAITFORIT_PORT=${WAITFORIT_hostport[1]}
78+
shift 1
79+
;;
80+
--child)
81+
WAITFORIT_CHILD=1
82+
shift 1
83+
;;
84+
-q | --quiet)
85+
WAITFORIT_QUIET=1
86+
shift 1
87+
;;
88+
-s | --strict)
89+
WAITFORIT_STRICT=1
90+
shift 1
91+
;;
92+
-h)
93+
WAITFORIT_HOST="$2"
94+
if [[ $WAITFORIT_HOST == "" ]]; then break; fi
95+
shift 2
96+
;;
97+
--host=*)
98+
WAITFORIT_HOST="${1#*=}"
99+
shift 1
100+
;;
101+
-p)
102+
WAITFORIT_PORT="$2"
103+
if [[ $WAITFORIT_PORT == "" ]]; then break; fi
104+
shift 2
105+
;;
106+
--port=*)
107+
WAITFORIT_PORT="${1#*=}"
108+
shift 1
109+
;;
110+
-t)
111+
WAITFORIT_TIMEOUT="$2"
112+
if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
113+
shift 2
114+
;;
115+
--timeout=*)
116+
WAITFORIT_TIMEOUT="${1#*=}"
117+
shift 1
118+
;;
119+
--)
120+
shift
121+
WAITFORIT_CLI=("$@")
122+
break
123+
;;
124+
--help)
125+
usage
126+
;;
127+
*)
128+
echoerr "Unknown argument: $1"
129+
usage
130+
;;
131+
esac
132+
done
133+
134+
if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
135+
echoerr "Error: you need to provide a host and port to test."
136+
usage
137+
fi
138+
139+
WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
140+
WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
141+
WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
142+
WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
143+
144+
# Check to see if timeout is from busybox?
145+
WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
146+
WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
147+
148+
WAITFORIT_BUSYTIMEFLAG=""
149+
if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
150+
WAITFORIT_ISBUSY=1
151+
# Check if busybox timeout uses -t flag
152+
# (recent Alpine versions don't support -t anymore)
153+
if timeout &>/dev/stdout | grep -q -e '-t '; then
154+
WAITFORIT_BUSYTIMEFLAG="-t"
155+
fi
156+
else
157+
WAITFORIT_ISBUSY=0
158+
fi
159+
160+
if [[ $WAITFORIT_CHILD -gt 0 ]]; then
161+
wait_for
162+
WAITFORIT_RESULT=$?
163+
exit $WAITFORIT_RESULT
164+
else
165+
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
166+
wait_for_wrapper
167+
WAITFORIT_RESULT=$?
168+
else
169+
wait_for
170+
WAITFORIT_RESULT=$?
171+
fi
172+
fi
173+
174+
if [[ $WAITFORIT_CLI != "" ]]; then
175+
if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
176+
echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
177+
exit $WAITFORIT_RESULT
178+
fi
179+
exec "${WAITFORIT_CLI[@]}"
180+
else
181+
exit $WAITFORIT_RESULT
182+
fi

0 commit comments

Comments
 (0)