重构Dockerfile
This commit is contained in:
parent
0a6f5df0d5
commit
341d29300a
@ -1,4 +1,4 @@
|
||||
如果觉得SoulBook对您有帮助,那么您可以给开发者一些支持:
|
||||
如果觉得对您有帮助,那么您可以给开发者一些支持:
|
||||
|
||||
- 开源
|
||||
- 服务器的费用也是一笔开销
|
||||
|
||||
3
Pipfile
3
Pipfile
@ -1,7 +1,8 @@
|
||||
[[source]]
|
||||
verify_ssl = true
|
||||
name = "pypi"
|
||||
url = "https://pypi.douban.com/simple/"
|
||||
#url = "https://pypi.douban.com/simple/"
|
||||
url = "https://mirrors.aliyun.com/pypi/simple/"
|
||||
|
||||
[requires]
|
||||
python_version = "3.6"
|
||||
|
||||
1
build.sh
Normal file
1
build.sh
Normal file
@ -0,0 +1 @@
|
||||
sudo docker build -t guyue55/soulbook . -f docker/Dockerfile-slim
|
||||
@ -1,9 +0,0 @@
|
||||
version: '3'
|
||||
services:
|
||||
web:
|
||||
image: howie6879/owllook
|
||||
command: pipenv run gunicorn -c soulbook/config/gunicorn.py --worker-class sanic.worker.GunicornWorker soulbook.server:app
|
||||
ports:
|
||||
- "8001:8001"
|
||||
volumes:
|
||||
- .:/soulbook
|
||||
25
docker/Dockerfile-alpine
Normal file
25
docker/Dockerfile-alpine
Normal file
@ -0,0 +1,25 @@
|
||||
# 基于python3.6镜像来构建镜像
|
||||
FROM python:3.6-alpine
|
||||
MAINTAINER guyue55 <guyuecw@qq.com>
|
||||
ENV TIME_ZONE=Asia/Shanghai
|
||||
|
||||
# 换源
|
||||
RUN echo "https://mirrors.aliyun.com/alpine/v3.15/main" > /etc/apk/repositories \
|
||||
&& echo "https://mirrors.aliyun.com/alpine/v3.15/community" >> /etc/apk/repositories \
|
||||
&& echo "${TIME_ZONE}" > /etc/timezone \
|
||||
&& ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime
|
||||
|
||||
# 安装基础库
|
||||
RUN apk --no-cache add gcc g++ libc-dev libffi-dev musl-dev cmake build-base
|
||||
|
||||
WORKDIR /app
|
||||
COPY . .
|
||||
|
||||
#RUN pip install --no-cache-dir --trusted-host mirrors.aliyun.com -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt
|
||||
RUN pip install --no-cache-dir -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt
|
||||
|
||||
RUN find . -name "*.pyc" -delete
|
||||
|
||||
EXPOSE 8001
|
||||
|
||||
CMD gunicorn -c soulbook/config/gunicorn.py --worker-class sanic.worker.GunicornWorker soulbook.server:app --log-level=debug
|
||||
16
docker/Dockerfile-slim
Normal file
16
docker/Dockerfile-slim
Normal file
@ -0,0 +1,16 @@
|
||||
# 基于python3.6镜像来构建镜像
|
||||
FROM python:3.6-slim
|
||||
MAINTAINER guyue55 <guyuecw@qq.com>
|
||||
ENV TIME_ZONE=Asia/Shanghai
|
||||
RUN echo "${TIME_ZONE}" > /etc/timezone \
|
||||
&& ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime
|
||||
|
||||
ADD . /app
|
||||
WORKDIR /app
|
||||
|
||||
RUN pip install --no-cache-dir --trusted-host mirrors.aliyun.com -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt
|
||||
RUN find . -name "*.pyc" -delete
|
||||
|
||||
EXPOSE 8001
|
||||
|
||||
CMD gunicorn -c soulbook/config/gunicorn.py --worker-class sanic.worker.GunicornWorker soulbook.server:app --log-level=debug
|
||||
9
docker/docker-compose.yml
Normal file
9
docker/docker-compose.yml
Normal file
@ -0,0 +1,9 @@
|
||||
version: '3'
|
||||
services:
|
||||
web:
|
||||
image: guyue55/owllook
|
||||
command: gunicorn -c soulbook/config/gunicorn.py --worker-class sanic.worker.GunicornWorker soulbook.server:app
|
||||
ports:
|
||||
- "8001:8001"
|
||||
volumes:
|
||||
- .:/app
|
||||
2
run_docker.sh
Normal file
2
run_docker.sh
Normal file
@ -0,0 +1,2 @@
|
||||
# sudo docker run -it -d -p 8001:8001 -e MONGO_HOST=127.0.0.1 -e MONGO_PORT=27017 -e REDIS_ENDPOINT=127.0.0.1 -e REDIS_PORT=6379 -e REDIS_PASSWORD=password guyue55/soulbook
|
||||
sudo docker run -it -d -p 8001:8001 --env-file .env guyue55/soulbook
|
||||
@ -17,24 +17,24 @@ class DevConfig(Config):
|
||||
REDIS_ENDPOINT=os.getenv('REDIS_ENDPOINT', "localhost"),
|
||||
REDIS_PORT=int(os.getenv('REDIS_PORT', 6379)),
|
||||
REDIS_PASSWORD=os.getenv('REDIS_PASSWORD', None),
|
||||
CACHE_DB=0,
|
||||
SESSION_DB=1,
|
||||
CACHE_DB=int(os.getenv('CACHE_DB', 0)),
|
||||
SESSION_DB=int(os.getenv('SESSION_DB', 1)),
|
||||
POOLSIZE=10,
|
||||
)
|
||||
MONGODB = dict(
|
||||
MONGO_HOST=os.getenv('MONGO_HOST', "127.0.0.1"),
|
||||
MONGO_PORT=int(os.getenv('MONGO_PORT', 27017)),
|
||||
MONGO_USERNAME="",
|
||||
MONGO_PASSWORD="",
|
||||
DATABASE='soulbook',
|
||||
MONGO_USERNAME=os.getenv('MONGO_USERNAME', ""),
|
||||
MONGO_PASSWORD=os.getenv('MONGO_PASSWORD', ""),
|
||||
DATABASE=os.getenv('MONGO_DB', "soulbook"),
|
||||
)
|
||||
|
||||
# website
|
||||
WEBSITE = dict(
|
||||
IS_RUNNING=os.getenv('OWLLOOK_IS_RUNNING', True),
|
||||
TOKEN=os.getenv('OWLLOOK_TOKEN', '')
|
||||
IS_RUNNING=os.getenv('IS_RUNNING', "true").lower() == "true",
|
||||
TOKEN=os.getenv('TOKEN', '')
|
||||
)
|
||||
|
||||
AUTH = {
|
||||
"Owllook-Api-Key": os.getenv('OWLLOOK_API_KEY', "your key")
|
||||
"Owllook-Api-Key": os.getenv('API_KEY', "your key")
|
||||
}
|
||||
|
||||
@ -23,18 +23,30 @@ from soulbook.config import CONFIG, LOGGER
|
||||
|
||||
def authenticator(key):
|
||||
"""
|
||||
验证请求头中的特定键值对是否与配置中的值匹配
|
||||
|
||||
:param keys: 验证方式 Owllook-Api-Key : Magic Key, Authorization : Token
|
||||
:return: 返回值
|
||||
:param key: 需要验证的请求头键名,例如 "Owllook-Api-Key" 或 "Authorization"
|
||||
:return: 装饰器函数,用于验证请求头中的键值对
|
||||
"""
|
||||
|
||||
def wrapper(func):
|
||||
@wraps(func)
|
||||
async def authenticate(request, *args, **kwargs):
|
||||
"""
|
||||
验证请求头中的键值对是否与配置中的值匹配
|
||||
|
||||
:param request: Sanic 请求对象
|
||||
:param args: 位置参数
|
||||
:param kwargs: 关键字参数
|
||||
:return: 如果验证成功,返回被装饰函数的结果;否则返回未授权的响应
|
||||
"""
|
||||
# 从请求头中获取指定键的值
|
||||
value = request.headers.get(key, None)
|
||||
# 如果值存在且与配置中的值匹配,则调用被装饰的函数
|
||||
if value and CONFIG.AUTH[key] == value:
|
||||
response = await func(request, *args, **kwargs)
|
||||
return response
|
||||
# 如果值不存在或与配置中的值不匹配,则返回未授权的响应
|
||||
else:
|
||||
return response_handle(request, UniResponse.NOT_AUTHORIZED, status=401)
|
||||
|
||||
@ -108,35 +120,61 @@ def cached(
|
||||
:param plugins: plugins to use when calling the cmd hooks
|
||||
Default is the one configured in ``aiocache.settings.DEFAULT_PLUGINS``
|
||||
"""
|
||||
# 将传入的关键字参数存储在 cache_kwargs 中,以便后续使用
|
||||
cache_kwargs = kwargs
|
||||
|
||||
def cached_decorator(func):
|
||||
"""
|
||||
装饰器函数,用于缓存函数的返回值
|
||||
|
||||
:param func: 被装饰的函数
|
||||
:return: 包装后的函数
|
||||
"""
|
||||
async def wrapper(*args, **kwargs):
|
||||
"""
|
||||
包装后的函数,用于执行缓存逻辑
|
||||
|
||||
:param args: 位置参数
|
||||
:param kwargs: 关键字参数
|
||||
:return: 函数的返回值
|
||||
"""
|
||||
# 获取缓存实例,使用传入的参数或默认配置
|
||||
cache_instance = get_cache(
|
||||
cache=cache, serializer=serializer, plugins=plugins, **cache_kwargs)
|
||||
# 获取函数的参数字典
|
||||
args_dict = get_args_dict(func, args, kwargs)
|
||||
# 生成缓存键,如果没有指定 key,则使用函数名、参数和关键字参数生成
|
||||
cache_key = key or args_dict.get(
|
||||
key_from_attr,
|
||||
(func.__module__ or 'stub') + func.__name__ + str(args) + str(kwargs))
|
||||
|
||||
try:
|
||||
# 检查缓存中是否存在该键
|
||||
if await cache_instance.exists(cache_key):
|
||||
# 如果存在,从缓存中获取值并返回
|
||||
return await cache_instance.get(cache_key)
|
||||
|
||||
except Exception:
|
||||
# 如果发生异常,记录日志
|
||||
logger.exception("Unexpected error with %s", cache_instance)
|
||||
|
||||
# 如果缓存中不存在该键,调用原始函数获取结果
|
||||
result = await func(*args, **kwargs)
|
||||
if result:
|
||||
try:
|
||||
# 将结果存入缓存
|
||||
await cache_instance.set(cache_key, result, ttl=ttl)
|
||||
except Exception:
|
||||
# 如果发生异常,记录日志
|
||||
logger.exception("Unexpected error with %s", cache_instance)
|
||||
|
||||
# 返回函数的结果
|
||||
return result
|
||||
|
||||
# 返回包装后的函数
|
||||
return wrapper
|
||||
|
||||
# 返回装饰器函数
|
||||
return cached_decorator
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user