This commit is contained in:
jeremygan2021
2025-11-26 20:27:24 +08:00
parent 45bb0a4d41
commit a1872a7a33
5 changed files with 97 additions and 25 deletions

2
.env
View File

@@ -1,7 +1,7 @@
# 环境变量配置文件
# 数据库配置
DATABASE_URL=postgresql://luna:123luna@localhost:6432/luna
DATABASE_URL=postgresql://luna:123luna@6.6.6.86:6432/luna
# MQTT配置
MQTT_BROKER_HOST=luna-mqtt

View File

@@ -36,4 +36,4 @@ RUN mkdir -p static/uploads static/processed
EXPOSE 9999
# 启动命令
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "3199"]
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8199"]

View File

@@ -6,7 +6,7 @@ services:
dockerfile: Dockerfile
container_name: luna-app
ports:
- "3199:8199"
- "8199:8199"
volumes:
- ./static:/app/static
env_file:

View File

@@ -2,6 +2,14 @@
# =============================================================================
# Docker 镜像构建和部署自动化脚本
#
# 用法:
# ./docker_deplay.sh # 完整构建和部署流程 (默认AMD64架构)
# ./docker_deplay.sh -amd # 构建和部署AMD64架构
# ./docker_deplay.sh -arm # 构建和部署ARM64架构
# ./docker_deplay.sh -upload # 仅上传已存在的tar文件并部署
# ./docker_deplay.sh -upload -amd # 仅上传已存在的AMD64架构tar文件并部署
# ./docker_deplay.sh -upload -arm # 仅上传已存在的ARM64架构tar文件并部署
# =============================================================================
# 配置变量 - 请根据实际情况修改
@@ -12,10 +20,14 @@ SERVER_PORT="22" # SSH端口默认22
IMAGE_NAME="epage_server" # Docker镜像名称
IMAGE_TAG="latest" # Docker镜像标签
CONTAINER_NAME="epage_server-container" # 容器名称
LOCAL_PORT="3199" # 本地端口
LOCAL_PORT="8199" # 本地端口
CONTAINER_PORT="8199" # 容器端口
TAR_FILE="${IMAGE_NAME}-${IMAGE_TAG}.tar" # 压缩包文件名
# 架构相关变量
PLATFORM="linux/amd64" # 默认架构
ARCH_SUFFIX="" # 架构后缀用于区分不同架构的tar文件
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
@@ -59,6 +71,40 @@ check_dependencies() {
log_success "依赖检查完成"
}
# 解析命令行参数
parse_arguments() {
while [[ $# -gt 0 ]]; do
case $1 in
-amd)
PLATFORM="linux/amd64"
ARCH_SUFFIX="-amd64"
log_info "设置目标架构为 AMD64"
shift
;;
-arm)
PLATFORM="linux/arm64"
ARCH_SUFFIX="-arm64"
log_info "设置目标架构为 ARM64"
shift
;;
-upload)
UPLOAD_ONLY=true
log_info "设置为仅上传模式"
shift
;;
*)
log_error "未知参数: $1"
log_info "支持的参数: -amd, -arm, -upload"
exit 1
;;
esac
done
# 更新TAR_FILE名包含架构后缀
TAR_FILE="${IMAGE_NAME}-${IMAGE_TAG}${ARCH_SUFFIX}.tar"
log_info "镜像文件名: ${TAR_FILE}"
}
# 构建Docker镜像
build_image() {
log_info "开始构建 Docker 镜像..."
@@ -70,7 +116,7 @@ build_image() {
fi
# 构建镜像并导出为tar文件
docker buildx build --platform linux/amd64 -t "${IMAGE_NAME}:${IMAGE_TAG}" --output type=docker,dest="./${TAR_FILE}" .
docker buildx build --platform $PLATFORM -t "${IMAGE_NAME}:${IMAGE_TAG}" --output type=docker,dest="./${TAR_FILE}" .
if [ $? -eq 0 ]; then
log_success "Docker 镜像构建完成: ${TAR_FILE}"
@@ -104,24 +150,24 @@ deploy_on_server() {
echo "[INFO] 开始服务器端部署..."
# 检查并停止现有容器
if docker ps -a --format 'table {{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
if sudo docker ps -a --format 'table {{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
echo "[INFO] 发现现有容器 ${CONTAINER_NAME},正在停止并删除..."
docker stop ${CONTAINER_NAME} || true
docker rm ${CONTAINER_NAME} || true
sudo docker stop ${CONTAINER_NAME} || true
sudo docker rm ${CONTAINER_NAME} || true
fi
# 检查并删除现有镜像
if docker images --format 'table {{.Repository}}:{{.Tag}}' | grep -q "^${IMAGE_NAME}:${IMAGE_TAG}$"; then
if sudo docker images --format 'table {{.Repository}}:{{.Tag}}' | grep -q "^${IMAGE_NAME}:${IMAGE_TAG}$"; then
echo "[INFO] 发现现有镜像 ${IMAGE_NAME}:${IMAGE_TAG},正在删除..."
docker rmi ${IMAGE_NAME}:${IMAGE_TAG} || true
sudo docker rmi ${IMAGE_NAME}:${IMAGE_TAG} || true
fi
# 加载新镜像
echo "[INFO] 加载新镜像..."
docker load -i /tmp/${TAR_FILE}
sudo docker load -i /tmp/${TAR_FILE}
# 验证镜像是否加载成功
if docker images | grep -q "${IMAGE_NAME}"; then
if sudo docker images | grep -q "${IMAGE_NAME}"; then
echo "[SUCCESS] 镜像加载成功"
else
echo "[ERROR] 镜像加载失败"
@@ -130,17 +176,17 @@ deploy_on_server() {
# 运行新容器
echo "[INFO] 启动新容器..."
docker run -d -p ${LOCAL_PORT}:${CONTAINER_PORT} --name ${CONTAINER_NAME} ${IMAGE_NAME}:${IMAGE_TAG}
sudo docker run -d -p ${LOCAL_PORT}:${CONTAINER_PORT} --name ${CONTAINER_NAME} ${IMAGE_NAME}:${IMAGE_TAG}
# 验证容器是否启动成功
if docker ps | grep -q "${CONTAINER_NAME}"; then
if sudo docker ps | grep -q "${CONTAINER_NAME}"; then
echo "[SUCCESS] 容器启动成功"
echo "[INFO] 容器状态:"
docker ps | grep "${CONTAINER_NAME}"
sudo docker ps | grep "${CONTAINER_NAME}"
else
echo "[ERROR] 容器启动失败"
echo "[INFO] 查看容器日志:"
docker logs ${CONTAINER_NAME}
sudo docker logs ${CONTAINER_NAME}
exit 1
fi
@@ -182,10 +228,12 @@ show_deployment_info() {
echo "访问地址: http://${SERVER_HOST}:${LOCAL_PORT}"
echo "容器名称: ${CONTAINER_NAME}"
echo "镜像名称: ${IMAGE_NAME}:${IMAGE_TAG}"
echo "目标架构: ${PLATFORM}"
echo "镜像文件: ${TAR_FILE}"
echo "=========================================="
echo ""
log_info "如需查看容器日志,请在服务器上运行: docker logs ${CONTAINER_NAME}"
log_info "如需停止容器,请在服务器上运行: docker stop ${CONTAINER_NAME}"
log_info "如需查看容器日志,请在服务器上运行: sudo docker logs ${CONTAINER_NAME}"
log_info "如需停止容器,请在服务器上运行: sudo docker stop ${CONTAINER_NAME}"
}
# 主函数
@@ -195,6 +243,10 @@ main() {
echo "=========================================="
echo ""
# 解析命令行参数
UPLOAD_ONLY=false
parse_arguments "$@"
# 检查配置
if [ "$SERVER_HOST" = "your-server-ip" ] || [ "$SERVER_PASSWORD" = "your-password" ]; then
log_error "请先配置脚本顶部的服务器信息"
@@ -205,13 +257,33 @@ main() {
exit 1
fi
# 执行部署流程
check_dependencies
build_image
upload_to_server
deploy_on_server
cleanup_local
show_deployment_info
# 检查是否是上传模式
if [ "$UPLOAD_ONLY" = true ]; then
log_info "检测到 -upload 参数,跳过构建步骤"
# 检查tar文件是否存在
if [ ! -f "$TAR_FILE" ]; then
log_error "未找到tar文件: $TAR_FILE"
log_info "请先运行脚本构建镜像或确保tar文件存在"
exit 1
fi
log_success "找到tar文件: $TAR_FILE"
# 执行上传和部署流程
upload_to_server
deploy_on_server
cleanup_local
show_deployment_info
else
# 执行完整的部署流程
check_dependencies
build_image
upload_to_server
deploy_on_server
cleanup_local
show_deployment_info
fi
}
# 脚本入口