This commit is contained in:
Mikan
2026-02-13 21:58:35 +03:00
parent 60204db3d2
commit 71ffcc89bf
10 changed files with 213 additions and 227 deletions

View File

@@ -24,7 +24,6 @@ echo "Проверка сети devnet..."
if ! docker network inspect devnet &>/dev/null; then
echo "Создаём сеть devnet..."
docker network create \
--driver=bridge \
--subnet="${SUBNET}" \
--gateway="${GATEWAY}" \
devnet

View File

@@ -1,49 +0,0 @@
#!/bin/bash
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$SCRIPT_DIR/.."
if [ ! -f "$PROJECT_ROOT/.env" ]; then
echo "Файл .env не найден. Запустите сначала ./scripts/00-init.sh"
exit 1
fi
export $(grep -v '^#' "$PROJECT_ROOT/.env" | xargs)
CERTS_DIR="$PROJECT_ROOT/nginx/certs"
CA_DIR="$PROJECT_ROOT/ca"
if ! command -v mkcert &> /dev/null; then
echo "mkcert не установлен."
echo "Linux: sudo apt install mkcert"
echo "macOS: brew install mkcert nss"
exit 1
fi
mkdir -p "$CERTS_DIR" "$CA_DIR"
DOMAINS=(
"*.$LOCAL_DOMAIN"
"*.$LOCAL_DOMAIN.local"
"$LOCAL_DOMAIN"
"localhost"
"127.0.0.1"
"::1"
)
if [ -n "$PUBLIC_DOMAIN" ]; then
DOMAINS+=("*.$PUBLIC_DOMAIN" "$PUBLIC_DOMAIN")
fi
mkcert -install
mkcert \
-cert-file "$CERTS_DIR/default.crt" \
-key-file "$CERTS_DIR/default.key" \
"${DOMAINS[@]}"
cp "$(mkcert -CAROOT)/rootCA.pem" "$CA_DIR/rootCA.pem"
echo "Сертификаты созданы в $CERTS_DIR"
echo "Установите корневой сертификат на устройствах:"
echo " $CA_DIR/rootCA.pem"

38
scripts/01-init-ca.sh Normal file
View File

@@ -0,0 +1,38 @@
#!/bin/bash
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$SCRIPT_DIR/.."
if [ -f "$ROOT_DIR/.env" ]; then
export $(grep -v '^#' "$ROOT_DIR/.env" | xargs)
fi
LOCAL_DOMAIN=${LOCAL_DOMAIN:-mikan}
CA_DIR="$ROOT_DIR/ca"
CERTS_DIR="$ROOT_DIR/nginx/certs"
DOMAINS_FILE="$ROOT_DIR/domains.txt"
mkdir -p "$CA_DIR" "$CERTS_DIR"
if [ ! -f "$DOMAINS_FILE" ]; then
touch "$DOMAINS_FILE"
fi
if [ ! -f "$CA_DIR/rootCA.pem" ]; then
mkcert -install
cp "$(mkcert -CAROOT)/rootCA.pem" "$CA_DIR/rootCA.pem"
cp "$(mkcert -CAROOT)/rootCA-key.pem" "$CA_DIR/rootCA-key.pem"
cat > "$DOMAINS_FILE" <<EOF
$LOCAL_DOMAIN
welcome.$LOCAL_DOMAIN
localhost
127.0.0.1
::1
*.services.$LOCAL_DOMAIN
*.services.local
EOF
fi
exec "$SCRIPT_DIR/regenerate-cert.sh"

View File

@@ -1,65 +1,41 @@
#!/bin/bash
set -e
if [ $# -ne 2 ]; then
echo "Использование: $0 <название> <порт>"
echo "Пример: $0 gitea 3000"
exit 1
fi
NAME=$1
PORT=$2
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$SCRIPT_DIR/.."
ROOT_DIR="$SCRIPT_DIR/.."
if [ ! -f "$PROJECT_ROOT/.env" ]; then
echo "Файл .env не найден. Запустите сначала ./scripts/00-init.sh"
if [ -f "$ROOT_DIR/.env" ]; then
export $(grep -v '^#' "$ROOT_DIR/.env" | xargs)
fi
LOCAL_DOMAIN=${LOCAL_DOMAIN:-mikan}
if [ $# -lt 1 ]; then
echo "Usage: $0 <service_name> [extra_domains...]"
exit 1
fi
export $(grep -v '^#' "$PROJECT_ROOT/.env" | xargs)
SERVICE_NAME=$1
shift
EXTRA_DOMAINS=("$@")
SERVICE_DIR="$PROJECT_ROOT/services/$NAME"
DOMAINS_FILE="$ROOT_DIR/domains.txt"
if [ -d "$SERVICE_DIR" ]; then
echo "Сервис '$NAME' уже существует!"
exit 1
if [ ! -f "$DOMAINS_FILE" ]; then
touch "$DOMAINS_FILE"
fi
mkdir -p "$SERVICE_DIR/data"
PRIMARY="${SERVICE_NAME}.${LOCAL_DOMAIN}"
ALIAS="${SERVICE_NAME}.local"
cat > "$SERVICE_DIR/docker-compose.yml" <<EOF
version: '3.8'
{
echo "$PRIMARY"
echo "$ALIAS"
for domain in "${EXTRA_DOMAINS[@]}"; do
echo "$domain"
done
} >> "$DOMAINS_FILE"
services:
$NAME:
image: nginx:alpine
container_name: $NAME
restart: unless-stopped
environment:
- VIRTUAL_HOST=$NAME.$LOCAL_DOMAIN,$NAME.$LOCAL_DOMAIN.local
$(if [ -n "$PUBLIC_DOMAIN" ]; then
echo " - LETSENCRYPT_HOST=$NAME.$PUBLIC_DOMAIN"
echo " - LETSENCRYPT_EMAIL=$LETSENCRYPT_EMAIL"
else
echo " # LETSENCRYPT_HOST="
echo " # LETSENCRYPT_EMAIL="
fi)
- VIRTUAL_PORT=$PORT
volumes:
- .//data
networks:
- devnet
depends_on:
- nginx-proxy
sort -u "$DOMAINS_FILE" | grep -v '^$' > "$DOMAINS_FILE.tmp" && mv "$DOMAINS_FILE.tmp" "$DOMAINS_FILE"
networks:
devnet:
external: true
EOF
echo "Сервис '$NAME' создан в $SERVICE_DIR"
echo "Запустите:"
echo " cd $PROJECT_ROOT"
echo " docker compose -f docker-compose.yml -f services/$NAME/docker-compose.yml up -d"
exec "$SCRIPT_DIR/regenerate-cert.sh"

View File

@@ -0,0 +1,32 @@
#!/bin/bash
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$SCRIPT_DIR/.."
if [ -f "$ROOT_DIR/.env" ]; then
export $(grep -v '^#' "$ROOT_DIR/.env" | xargs)
fi
DOMAINS_FILE="$ROOT_DIR/domains.txt"
CERTS_DIR="$ROOT_DIR/nginx/certs"
if [ ! -f "$DOMAINS_FILE" ]; then
echo "Error: $DOMAINS_FILE not found" >&2
exit 1
fi
mapfile -t DOMAINS < <(grep -v '^$' "$DOMAINS_FILE")
if [ ${#DOMAINS[@]} -eq 0 ]; then
echo "Error: no domains found in $DOMAINS_FILE" >&2
exit 1
fi
mkcert \
-cert-file "$CERTS_DIR/default.crt.new" \
-key-file "$CERTS_DIR/default.key.new" \
"${DOMAINS[@]}"
mv "$CERTS_DIR/default.crt.new" "$CERTS_DIR/default.crt"
mv "$CERTS_DIR/default.key.new" "$CERTS_DIR/default.key"

11
scripts/reload-nginx.sh Normal file
View File

@@ -0,0 +1,11 @@
#!/bin/bash
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$SCRIPT_DIR/.."
CERTS_DIR="$ROOT_DIR/nginx/certs"
cp "$CERTS_DIR/default.crt" "$CERTS_DIR/default.key" "$CERTS_DIR/"
docker compose -f "$ROOT_DIR/docker-compose.yml" exec nginx-proxy nginx -s reload 2>/dev/null || \
docker compose -f "$ROOT_DIR/docker-compose.yml" restart nginx-proxy