From 95716a6506f3756045de59cdcea46a3c299c5950 Mon Sep 17 00:00:00 2001 From: Mikan Date: Thu, 12 Mar 2026 23:17:50 +0300 Subject: [PATCH] working --- dnsmasq/dnsmasq.conf | 11 ++- docker-compose.yml | 155 ++++++++++++++++++++---------------- nginx/html/index.html | 7 +- scripts/00-init.sh | 1 - scripts/01-generate-cert.sh | 49 ------------ scripts/02-apply-config.sh | 0 scripts/add-service.sh | 76 ++++++------------ 7 files changed, 125 insertions(+), 174 deletions(-) mode change 100644 => 100755 scripts/00-init.sh delete mode 100644 scripts/01-generate-cert.sh mode change 100644 => 100755 scripts/02-apply-config.sh mode change 100644 => 100755 scripts/add-service.sh diff --git a/dnsmasq/dnsmasq.conf b/dnsmasq/dnsmasq.conf index 4cfc907..8b39677 100644 --- a/dnsmasq/dnsmasq.conf +++ b/dnsmasq/dnsmasq.conf @@ -1,2 +1,9 @@ -# Этот файл будет перезаписан при запуске ./scripts/02-apply-config.sh -# Не редактируйте вручную \ No newline at end of file +address=/.mikan/10.0.0.3 +address=/.mikan.local/10.0.0.3 +local=/.mikan/ +local=/.mikan.local/ +no-resolv +server=1.1.1.1 +server=8.8.8.8 +log-queries +log-facility=/dev/stdout diff --git a/docker-compose.yml b/docker-compose.yml index efe709e..7eed772 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,70 +1,87 @@ -version: '3.8' - -services: - nginx-proxy: - image: nginxproxy/nginx-proxy:alpine - container_name: nginx-proxy - restart: unless-stopped - ports: - - "80:80" - - "443:443" - volumes: - - /var/run/docker.sock:/tmp/docker.sock:ro - - ./nginx/certs:/etc/nginx/certs:ro - - ./nginx/vhost.d:/etc/nginx/vhost.d:ro - - ./nginx/html:/usr/share/nginx/html:rw - networks: - devnet: - ipv4_address: ${NGINX_IP} - environment: - - DEFAULT_HOST=welcome.${LOCAL_DOMAIN} - - HTTPS_METHOD=redirect - - SSL_POLICY=Mozilla-Modern - - DEFAULT_SSL_CERT=/etc/nginx/certs/default.crt - - DEFAULT_SSL_KEY=/etc/nginx/certs/default.key - labels: - - "com.github.nginx-proxy.nginx-proxy=true" - - nginx-proxy-companion: - image: nginxproxy/acme-companion - container_name: nginx-proxy-companion - restart: unless-stopped - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - - ./nginx/certs:/etc/nginx/certs:rw - - ./acme:/etc/acme.sh - - ./nginx/vhost.d:/etc/nginx/vhost.d:rw - networks: - - devnet - environment: - - DEFAULT_EMAIL=${LETSENCRYPT_EMAIL} - - NGINX_PROXY_CONTAINER=nginx-proxy - - ACME_CA_URI=https://acme-staging-v02.api.letsencrypt.org/directory - depends_on: - - nginx-proxy - - welcome: - image: nginx:alpine - container_name: welcome - restart: unless-stopped - volumes: - - ./nginx/html:/usr/share/nginx/html:ro - environment: - - VIRTUAL_HOST=welcome.${LOCAL_DOMAIN},welcome.${LOCAL_DOMAIN}.local - networks: - - devnet - depends_on: - - nginx-proxy - -networks: - devnet: - driver: bridge - ipam: - config: - - subnet: ${SUBNET} - gateway: ${GATEWAY} - -volumes: - acme: - vhost.d: +version: '3.8' + +services: + nginx-proxy: + image: nginxproxy/nginx-proxy:alpine + container_name: nginx-proxy + restart: unless-stopped + ports: + - "80:80" + - "443:443" + volumes: + - /var/run/docker.sock:/tmp/docker.sock:ro + - ./nginx/certs:/etc/nginx/certs:ro + - ./nginx/vhost.d:/etc/nginx/vhost.d:ro + - ./nginx/html:/usr/share/nginx/html:rw + networks: + devnet: + ipv4_address: ${NGINX_IP} + environment: + - DEFAULT_HOST=welcome.${LOCAL_DOMAIN} + - HTTPS_METHOD=redirect + - SSL_POLICY=Mozilla-Modern + - DEFAULT_SSL_CERT=/etc/nginx/certs/default.crt + - DEFAULT_SSL_KEY=/etc/nginx/certs/default.key + labels: + - "com.github.nginx-proxy.nginx-proxy=true" + + nginx-proxy-companion: + image: nginxproxy/acme-companion + container_name: nginx-proxy-companion + restart: unless-stopped + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./nginx/certs:/etc/nginx/certs:rw + - ./acme:/etc/acme.sh + - ./nginx/vhost.d:/etc/nginx/vhost.d:rw + networks: + - devnet + environment: + - DEFAULT_EMAIL=${LETSENCRYPT_EMAIL} + - NGINX_PROXY_CONTAINER=nginx-proxy + - ACME_CA_URI=https://acme-staging-v02.api.letsencrypt.org/directory + depends_on: + - nginx-proxy + + welcome: + image: nginx:alpine + container_name: welcome + restart: unless-stopped + volumes: + - ./nginx/html:/usr/share/nginx/html:ro + environment: + - VIRTUAL_HOST=welcome.${LOCAL_DOMAIN},welcome.${LOCAL_DOMAIN}.local + networks: + - devnet + depends_on: + - nginx-proxy + + dnsmasq: + image: jpillora/dnsmasq + container_name: dnsmasq + restart: unless-stopped + ports: + - "53:53/udp" + - "53:53/tcp" + volumes: + - ./dnsmasq/dnsmasq.conf:/etc/dnsmasq.conf:ro + cap_add: + - NET_ADMIN + networks: + devnet: + ipv4_address: ${DNSMASQ_IP} + healthcheck: + test: ["CMD", "nslookup", "localhost", "127.0.0.1"] + interval: 30s + timeout: 5s + retries: 3 + +networks: + devnet: + external: true + name: devnet + +volumes: + acme: + vhost.d: html: \ No newline at end of file diff --git a/nginx/html/index.html b/nginx/html/index.html index c54cefe..168cb27 100644 --- a/nginx/html/index.html +++ b/nginx/html/index.html @@ -1,7 +1,8 @@ -Placeholder +Добро пожаловать! -

Run ./scripts/00-init.sh to generate content

+

Сервисы .mikan

+

Добавьте свои сервисы в папку services/

- \ No newline at end of file + diff --git a/scripts/00-init.sh b/scripts/00-init.sh old mode 100644 new mode 100755 index 6d36416..2e7af30 --- a/scripts/00-init.sh +++ b/scripts/00-init.sh @@ -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 diff --git a/scripts/01-generate-cert.sh b/scripts/01-generate-cert.sh deleted file mode 100644 index 6580ae9..0000000 --- a/scripts/01-generate-cert.sh +++ /dev/null @@ -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" \ No newline at end of file diff --git a/scripts/02-apply-config.sh b/scripts/02-apply-config.sh old mode 100644 new mode 100755 diff --git a/scripts/add-service.sh b/scripts/add-service.sh old mode 100644 new mode 100755 index a023a62..32e8240 --- a/scripts/add-service.sh +++ b/scripts/add-service.sh @@ -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 [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" <> "$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" \ No newline at end of file +exec "$SCRIPT_DIR/regenerate-cert.sh" \ No newline at end of file