Compare commits

...

2 Commits

Author SHA1 Message Date
bfe02c57b2 更新 public/assets/install.sh
All checks were successful
DevStar Studio CI/CD Pipeline / DevStarStudio-CICD-Pipeline (pull_request) Successful in 45m20s
2025-12-25 06:11:13 +00:00
4a6fc80f85 feat: add macOS platform support for Docker deployment
All checks were successful
DevStar Studio CI/CD Pipeline / DevStarStudio-CICD-Pipeline (pull_request) Successful in 47m58s
2025-12-25 13:37:07 +08:00

View File

@@ -10,6 +10,9 @@ DATA_VOLUME=devstar_data
DATA_VOLUME_FILE="$HOME/.devstar/data_volume"
CONTAINER_FILE="$HOME/.devstar/container_name"
SUDO="sudo"
PLATFORM=""
# 错误处理函数
error_handler() {
devstar help
@@ -41,12 +44,12 @@ failure() {
create_volume() {
local volume_name="${1:-$DATA_VOLUME}"
if sudo docker volume inspect "$volume_name" >/dev/null 2>&1; then
if $SUDO docker volume inspect "$volume_name" >/dev/null 2>&1; then
echo "检测到数据卷 '$volume_name' 已存在" >&2
return 0
fi
if sudo docker volume create "$volume_name"; then
if $SUDO docker volume create "$volume_name"; then
echo "数据卷 '$volume_name' 创建成功"
return 0
else
@@ -59,20 +62,20 @@ delete_volume() {
local volume_name="${1:-$DATA_VOLUME}"
# 检查数据卷是否存在
if ! sudo docker volume inspect "$volume_name" >/dev/null 2>&1; then
if ! $SUDO docker volume inspect "$volume_name" >/dev/null 2>&1; then
echo "数据卷 '$volume_name' 不存在" >&2
return 1
fi
# 执行删除
if sudo docker volume rm "$volume_name" 2>/dev/null; then
if $SUDO docker volume rm "$volume_name" 2>/dev/null; then
echo "Docker数据卷 '$volume_name' 已删除"
return 0
else
echo "删除失败!尝试强制删除..." >&2
# 尝试强制删除
if sudo docker volume rm -f "$volume_name" 2>/dev/null; then
if $SUDO docker volume rm -f "$volume_name" 2>/dev/null; then
echo "Docker数据卷 '$volume_name' 已强制删除"
return 0
else
@@ -85,26 +88,48 @@ delete_volume() {
# Detect the OS type and install dependencies
function install_dependencies {
# Install dependencies based on the OS type
success "dependencies install begin: "
OS_ID=$(grep '^ID=' /etc/os-release | cut -d= -f2 | tr -d '"')
success "dependencies install begin: "
# 检测操作系统类型
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS 系统
OS_ID="macos"
elif [[ -f /etc/os-release ]]; then
# Linux 系统
OS_ID=$(grep '^ID=' /etc/os-release | cut -d= -f2 | tr -d '"')
else
OS_ID="unknown"
fi
case $OS_ID in
macos)
SUDO=""
# macOS 上检测架构Apple Silicon 需要平台参数
if [[ "$(uname -m)" == "arm64" ]]; then
PLATFORM="--platform linux/amd64"
fi
# macOSDocker Desktop 需要手动安装
if ! command -v docker &> /dev/null; then
brew install docker docker-compose
else
echo "Docker Installed, $(docker --version)"
fi
;;
ubuntu|debian)
# 检查是否需要更新
if ! command -v docker &> /dev/null || ! command -v ip &> /dev/null; then
sudo apt-get update
$SUDO apt-get update
fi
# 检查 Docker 是否已安装
if ! command -v docker &> /dev/null; then
echo "Installing Docker..."
# 安装 Docker
sudo apt-get install -y docker.io
$SUDO apt-get install -y docker.io
echo "Docker Installed"
else
echo "Docker Installed, $(docker --version)"
fi
if ! command -v ip &> /dev/null; then
sudo apt-get install -y iproute2
$SUDO apt-get install -y iproute2
fi
;;
*)
@@ -117,26 +142,26 @@ function install_dependencies {
# Function to install
function install {
install_dependencies
if sudo docker pull mengning997/devstar-studio:$VERSION; then
sudo docker tag mengning997/devstar-studio:$VERSION devstar.cn/devstar/devstar-studio:latest
success "Successfully pulled mengning997/devstar-studio:$VERSION renamed to devstar.cn/devstar/devstar-studio:latest"
else
sudo docker pull devstar.cn/devstar/devstar-studio:latest
success "Successfully pulled devstar.cn/devstar/devstar-studio:latest"
if $SUDO docker pull $PLATFORM mengning997/devstar-studio:$VERSION; then
$SUDO docker tag mengning997/devstar-studio:$VERSION devstar.cn/devstar/devstar-studio:$VERSION
success "Successfully pulled mengning997/devstar-studio:$VERSION renamed to devstar.cn/devstar/devstar-studio:$VERSION"
else
$SUDO docker pull $PLATFORM devstar.cn/devstar/devstar-studio:$VERSION
success "Successfully pulled devstar.cn/devstar/devstar-studio:$VERSION"
fi
if sudo docker pull mengning997/webterminal:$VERSION; then
sudo docker tag mengning997/webterminal:$VERSION devstar.cn/devstar/webterminal:latest
success "Successfully pulled mengning997/webterminal:$VERSION renamed to devstar.cn/devstar/webterminal:latest"
else
sudo docker pull devstar.cn/devstar/webterminal:latest
success "Successfully pulled devstar.cn/devstar/webterminal:latest"
if $SUDO docker pull $PLATFORM mengning997/webterminal:$VERSION; then
$SUDO docker tag mengning997/webterminal:$VERSION devstar.cn/devstar/webterminal:$VERSION
success "Successfully pulled mengning997/webterminal:$VERSION renamed to devstar.cn/devstar/webterminal:$VERSION"
else
$SUDO docker pull $PLATFORM devstar.cn/devstar/webterminal:$VERSION
success "Successfully pulled devstar.cn/devstar/webterminal:$VERSION"
fi
if sudo docker pull mengning997/act_runner:$VERSION; then
sudo docker tag mengning997/act_runner:$VERSION devstar.cn/devstar/act_runner:latest
success "Successfully pulled mengning997/act_runner:$VERSION renamed to devstar.cn/devstar/act_runner:latest"
else
sudo docker pull devstar.cn/devstar/act_runner:latest
success "Successfully pulled devstar.cn/devstar/act_runner:latest"
if $SUDO docker pull $PLATFORM mengning997/act_runner:$VERSION; then
$SUDO docker tag mengning997/act_runner:$VERSION devstar.cn/devstar/act_runner:$VERSION
success "Successfully pulled mengning997/act_runner:$VERSION renamed to devstar.cn/devstar/act_runner:$VERSION"
else
$SUDO docker pull $PLATFORM devstar.cn/devstar/act_runner:$VERSION
success "Successfully pulled devstar.cn/devstar/act_runner:$VERSION"
fi
}
@@ -145,6 +170,22 @@ function start {
if [[ -z "$IMAGE_STR" ]]; then
install
fi
# 确保 ip 命令存在Linux 环境)
if [[ "$OSTYPE" != "darwin"* ]] && ! command -v ip >/dev/null 2>&1; then
if [[ -f /etc/os-release ]]; then
OS_ID=$(grep '^ID=' /etc/os-release | cut -d= -f2 | tr -d '"')
case $OS_ID in
ubuntu|debian)
$SUDO apt-get update -qq && $SUDO apt-get install -y iproute2 2>/dev/null && echo "iproute2 已安装" || true
;;
centos|fedora|rhel)
$SUDO yum install -y iproute 2>/dev/null || true
;;
esac
fi
fi
# 创建Docker数据卷用于持久化存储DevStar相关的配置和用户数据
if create_volume "$DATA_VOLUME"; then
mkdir -p "$(dirname "$DATA_VOLUME_FILE")"
@@ -158,13 +199,34 @@ function start {
exit 1
fi
sudo chmod 666 /var/run/docker.sock
DOMAIN_NAME=$(ip route get 1 2>/dev/null | awk '{print $7; exit}')
# macOS 上跳过 chmodDocker Desktop 自动处理 docker.sock 权限
if [[ "$OSTYPE" != "darwin"* ]]; then
$SUDO chmod 666 /var/run/docker.sock 2>/dev/null || true
fi
# 获取域名/IP - 支持 macOS 和 Linux
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS 获取本地 IP
DOMAIN_NAME=$(ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || echo "localhost")
else
# Linux 获取本地 IP
if command -v ip >/dev/null 2>&1; then
DOMAIN_NAME=$(ip route get 1 2>/dev/null | awk '{print $7; exit}')
else
# 如果 ip 命令不存在,使用默认值
DOMAIN_NAME="localhost"
fi
fi
if [[ -f "/.dockerenv" ]]; then
if [[ -S "/var/run/docker.sock" ]] && command -v docker >/dev/null 2>&1; then
# DooD 环境 - 获取宿主机IP
DOMAIN_NAME=$(ip route | grep default | awk '{print $3}' 2>/dev/null)
if command -v ip >/dev/null 2>&1; then
DOMAIN_NAME=$(ip route | grep default | awk '{print $3}' 2>/dev/null)
else
# 如果 ip 命令不存在,使用 Docker 默认网关 IP
DOMAIN_NAME="172.17.0.1"
fi
fi
# 普通容器环境保持原来的容器IP
fi
@@ -181,7 +243,7 @@ function start {
fi
echo "$CONTAINER_NAME" > "$CONTAINER_FILE"
echo "容器名称 '$CONTAINER_NAME' 已保存到配置文件"
sudo docker run --restart=always --name $CONTAINER_NAME -d -p $PORT:3000 -p $SSH_PORT:$SSH_PORT -v /var/run/docker.sock:/var/run/docker.sock -v ${DATA_VOLUME}:/var/lib/gitea -v ${DATA_VOLUME}:/etc/gitea $IMAGE_STR
$SUDO docker run $PLATFORM --restart=always --name $CONTAINER_NAME -d --group-add 0 -p $PORT:3000 -p $SSH_PORT:$SSH_PORT -v /var/run/docker.sock:/var/run/docker.sock -v ${DATA_VOLUME}:/var/lib/gitea -v ${DATA_VOLUME}:/etc/gitea $IMAGE_STR
# 打开 `http://localhost:8080` 完成安装。
success "-------------------------------------------------------"
success "DevStar started in http://$DOMAIN_NAME:$PORT successfully!"
@@ -192,25 +254,26 @@ function start {
# Function to stop
function stop {
if [[ -e "$CONTAINER_FILE" ]]; then
if [ $(docker ps -a --filter "name=$(cat "$CONTAINER_FILE")" -q | wc -l) -gt 0 ]; then
sudo docker stop $(docker ps -a --filter "name=$(cat "$CONTAINER_FILE")" -q) && \
sudo docker rm -f $(docker ps -a --filter "name=$(cat "$CONTAINER_FILE")" -q)
if [ $($SUDO docker ps -a --filter "name=$(cat "$CONTAINER_FILE")" -q | wc -l) -gt 0 ]; then
$SUDO docker stop $($SUDO docker ps -a --filter "name=$(cat "$CONTAINER_FILE")" -q) && \
$SUDO docker rm -f $($SUDO docker ps -a --filter "name=$(cat "$CONTAINER_FILE")" -q)
fi
sudo rm -rf $CONTAINER_FILE
fi
if [ $(docker ps -a --filter "name=^/webterminal-" -q | wc -l) -gt 0 ]; then
sudo docker stop $(docker ps -a --filter "name=^/webterminal-" -q) && sudo docker rm -f $(docker ps -a --filter "name=^/webterminal-" -q)
if [ $($SUDO docker ps -a --filter "name=^/webterminal-" -q | wc -l) -gt 0 ]; then
$SUDO docker stop $($SUDO docker ps -a --filter "name=^/webterminal-" -q) && $SUDO docker rm -f $($SUDO docker ps -a --filter "name=^/webterminal-" -q)
fi
if [ $($SUDO docker ps -a --filter "name=^/runner-" -q | wc -l) -gt 0 ]; then
$SUDO docker stop $($SUDO docker ps -a --filter "name=^/runner-" -q) && $SUDO docker rm -f $($SUDO docker ps -a --filter "name=^/runner-" -q)
fi
if [ $(docker ps -a --filter "name=^/runner-" -q | wc -l) -gt 0 ]; then
sudo docker stop $(docker ps -a --filter "name=^/runner-" -q) && sudo docker rm -f $(docker ps -a --filter "name=^/runner-" -q)
fi
}
# Function to logs
function logs {
# 查看devstar-studio容器的运行日志
echo "=== 容器日志:$(cat "$CONTAINER_FILE") ==="
sudo docker logs $(cat "$CONTAINER_FILE")
$SUDO docker logs $(cat "$CONTAINER_FILE")
}
# Function to clean
@@ -249,7 +312,7 @@ case "$1" in
usage
;;
start)
ARGS=$(getopt --long port::,ssh-port::,data-volume::,version::,image:: -- "$@")
ARGS=$(getopt --long port:,ssh-port:,data-volume:,version:,image: -- "$@")
if [ $? -ne 0 ]; then
failure "ARGS ERROR!"
exit 1
@@ -298,16 +361,16 @@ case "$1" in
clean
;;
*)
# 获取当前脚本的文件名
script_name=$(basename "$0")
# 判断脚本名是否为 devstar
if [ "$script_name" != "devstar" ]; then
sudo mv ./install.sh /usr/bin/devstar
# 获取当前脚本的文件名
script_name=$(basename "$0")
# 判断脚本名是否为 devstar
if [ "$script_name" != "devstar" ]; then
$SUDO mv ./install.sh /usr/bin/devstar
rm -rf install.sh
success "--------------------------------------"
success "DevStar Studio installed successfully!"
success "--------------------------------------"
success "Copyright 2024 Mengning Software All rights reserved."
success "Copyright 2024 Mengning Software All rights reserved."
devstar help
fi
;;