diff --git a/.github/workflows/deploy-server.yml b/.github/workflows/deploy-server.yml new file mode 100644 index 0000000..e406028 --- /dev/null +++ b/.github/workflows/deploy-server.yml @@ -0,0 +1,85 @@ +name: 🚀 Деплой Nanaxe Server + +on: + push: + branches: [main] + paths: + - 'server/**' + - '.github/workflows/deploy-server.yml' + workflow_dispatch: + +jobs: + deploy: + runs-on: self-hosted + name: Деплой сервера майндкарт + steps: + - name: 📥 Скачать код + uses: actions/checkout@v4 + + - name: 🔄 Синхронизация файлов + run: | + SERVER_PATH="/opt/nanaxe-server" + + mkdir -p $SERVER_PATH/api + mkdir -p $SERVER_PATH/nginx/html + mkdir -p $SERVER_PATH/nginx/conf.d + mkdir -p $SERVER_PATH/scripts + + # Синхронизация docker-compose + cp -f server/docker-compose.yml $SERVER_PATH/docker-compose.yml + + # Синхронизация API + rsync -av --delete server/api/ $SERVER_PATH/api/ + + # Синхронизация nginx + cp -f server/nginx/nginx.conf $SERVER_PATH/nginx/nginx.conf + cp -f server/nginx/html/* $SERVER_PATH/nginx/html/ + + # Синхронизация скриптов + cp -f server/scripts/* $SERVER_PATH/scripts/ 2>/dev/null || true + + # Копировать .env если не существует + if [ ! -f $SERVER_PATH/.env ]; then + cp -f server/.env.example $SERVER_PATH/.env + echo "⚠️ Создан .env из примера - ОБНОВИТЕ ДЛЯ PRODUCTION!" + fi + + echo "✅ Файлы синхронизированы" + + - name: 🐳 Пересборка и перезапуск + run: | + cd /opt/nanaxe-server + + # Пересобрать API + docker compose build nanaxe-api + + # Перезапустить все сервисы + docker compose down + docker compose up -d + + echo "✅ Сервисы перезапущены" + + - name: ✅ Проверка здоровья + run: | + sleep 10 + + # Проверка API + API_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8082/health 2>/dev/null || echo "000") + if [ "$API_STATUS" = "200" ]; then + echo "✅ API работает" + else + echo "⚠️ API статус: $API_STATUS" + fi + + # Проверка Gitea + GITEA_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:3001 2>/dev/null || echo "000") + if [ "$GITEA_STATUS" = "200" ]; then + echo "✅ Gitea работает" + else + echo "⚠️ Gitea статус: $GITEA_STATUS" + fi + + # Список контейнеров + docker compose -f /opt/nanaxe-server/docker-compose.yml ps + + echo "✅ ДЕПЛОЙ ЗАВЕРШЁН УСПЕШНО!" diff --git a/.gitignore b/.gitignore index bec3afd..ac8bb35 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,4 @@ coverage/ # Temporary files *.tmp *.temp +server/api/node_modules/ diff --git a/obsidian-git b/obsidian-git new file mode 160000 index 0000000..8e91800 --- /dev/null +++ b/obsidian-git @@ -0,0 +1 @@ +Subproject commit 8e91800cfa4834a434f0a3bfe939ff9e259f69fd diff --git a/server/INTEGRATION_GUIDE.md b/server/INTEGRATION_GUIDE.md new file mode 100644 index 0000000..40903aa --- /dev/null +++ b/server/INTEGRATION_GUIDE.md @@ -0,0 +1,164 @@ +# 🔗 Интеграция Nanaxe Server с Consyscab + +Это руководство по добавлению Nanaxe Server в существующую инфраструктуру Consyscab. + +## 📁 Структура файлов + +``` +project-root/ +├── docker-compose.yml # Объединённый файл +├── docker/ +│ ├── nginx/ +│ │ └── conf.d/ +│ │ ├── default.conf # Существующий конфиг +│ │ └── nanaxe.conf # Новый: конфиг Nanaxe +│ ├── php/ +│ └── postgres/ +│ └── init-db.sh +├── nanaxe/ # Новая папка +│ ├── api/ # Nanaxe API код +│ │ ├── Dockerfile +│ │ ├── package.json +│ │ └── src/ +│ ├── nginx/ +│ │ └── nanaxe.conf # Nginx конфиг для Nanaxe +│ ├── html/ # Статические файлы +│ │ └── index.html +│ └── postgres-init/ +│ └── init-gitea.sql # Инициализация БД Gitea +├── backend/ # Symfony +├── frontend/ # Quasar +├── moodle/ # Moodle +└── .env # Переменные окружения +``` + +## 🚀 Быстрый старт + +### 1. Скопируйте файлы Nanaxe + +```bash +# Скопируйте папку nanaxe/ в корень проекта вашего друга +cp -r /path/to/nanaxe/server/nanaxe ./ + +# Скопируйте объединённый docker-compose.yml +cp /path/to/nanaxe/server/docker-compose.integrated.yml ./docker-compose.yml +``` + +### 2. Обновите .env + +Добавьте в `.env`: + +```env +# Nanaxe Configuration +GITEA_DOMAIN=git.yourdomain.com +GITEA_SECRET_KEY=$(openssl rand -base64 32) +GITEA_TOKEN= +NANAXE_JWT_SECRET=$(openssl rand -base64 32) +WEBDAV_USER=admin +WEBDAV_PASSWORD=$(openssl rand -base64 16) +DB_PASSWORD=your_postgres_password +``` + +### 3. Настройте DNS + +Настройте поддомены: +- `git.yourdomain.com` → IP сервера +- `api.yourdomain.com` → IP сервера +- `nanaxe.yourdomain.com` → IP сервера (опционально) + +### 4. Запустите + +```bash +docker compose down +docker compose up -d --build +``` + +## 🔧 Ручная интеграция (если не хотите заменять docker-compose.yml) + +### Добавьте сервисы в существующий docker-compose.yml: + +```yaml + # Nanaxe Gitea + nanaxe_gitea: + image: gitea/gitea:latest + container_name: nanaxe_gitea + environment: + - GITEA__database__DB_TYPE=postgres + - GITEA__database__HOST=consyscab_db:5432 + - GITEA__database__NAME=gitea + - GITEA__database__USER=user + - GITEA__database__PASSWD=${DB_PASSWORD} + volumes: + - gitea_data:/data + networks: + - consyscab-network + + # Nanaxe API + nanaxe_api: + build: + context: ./nanaxe/api + container_name: nanaxe_api + environment: + - NODE_ENV=production + - PORT=8080 + - GITEA_URL=http://nanaxe_gitea:3000 + - JWT_SECRET=${NANAXE_JWT_SECRET} + volumes: + - mindmap_data:/app/mindmaps + networks: + - consyscab-network + +volumes: + pg_data: + gitea_data: # Добавьте + mindmap_data: # Добавьте +``` + +### Добавьте в nginx конфиг: + +Создайте файл `docker/nginx/conf.d/nanaxe.conf`: + +```nginx +server { + listen 80; + server_name git.yourdomain.com; + + location / { + proxy_pass http://nanaxe_gitea:3000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } +} + +server { + listen 80; + server_name api.yourdomain.com; + + location / { + proxy_pass http://nanaxe_api:8080; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } +} +``` + +## ✅ Проверка + +```bash +# Проверьте статус +docker compose ps + +# Проверьте API +curl http://api.yourdomain.com/health + +# Откройте Gitea +open http://git.yourdomain.com +``` + +## 📝 Примечания + +- Nanaxe использует ту же PostgreSQL базу, что и Consyscab +- Nginx вашего друга проксирует запросы к Nanaxe +- Все сервисы в одной Docker сети `consyscab-network` +- Данные Gitea хранятся в volume `gitea_data` +- Mindmaps хранятся в volume `mindmap_data` diff --git a/server/docker-compose.integrated.yml b/server/docker-compose.integrated.yml new file mode 100644 index 0000000..9eeb718 --- /dev/null +++ b/server/docker-compose.integrated.yml @@ -0,0 +1,216 @@ +# Nanaxe Server + Consyscab Integration +# Объединённая конфигурация для совместного развёртывания + +services: + # ========================================== + # 1. Единая база данных PostgreSQL + # ========================================== + consyscab_db: + image: postgres:16-alpine + container_name: consyscab_db + environment: + - POSTGRES_USER=user + - POSTGRES_PASSWORD=${DB_PASSWORD:-password} + - POSTGRES_DB=symfony_db + volumes: + - pg_data:/var/lib/postgresql/data + - ./docker/postgres/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh:ro + # Nanaxe: инициализация базы Gitea + - ./nanaxe/postgres-init:/docker-entrypoint-initdb.d/nanaxe:ro + networks: + - consyscab-network + healthcheck: + test: ["CMD-SHELL", "pg_isready -U user"] + interval: 10s + timeout: 5s + retries: 5 + + # ========================================== + # 2. PHP 8.4 (Symfony + Moodle) + # ========================================== + consyscab_php: + build: + context: ./docker/php + container_name: consyscab_php + volumes: + - ./backend:/var/www/symfony + - ./moodle:/var/www/moodle + - ./moodledata:/var/www/moodledata + - ./docker/php/custom.ini:/usr/local/etc/php/conf.d/custom.ini:ro + - ~/.gitconfig:/var/www/.gitconfig:ro + depends_on: + consyscab_db: + condition: service_healthy + consyscab_memcached: + condition: service_started + networks: + - consyscab-network + + # ========================================== + # 3. Nginx (Consyscab + Nanaxe) + # ========================================== + consyscab_nginx: + image: nginx:alpine + container_name: consyscab_nginx + ports: + - "80:80" + - "443:443" + volumes: + - ./backend:/var/www/symfony + - ./moodle:/var/www/moodle + - ./docker/nginx/conf.d:/etc/nginx/conf.d + # Nanaxe: дополнительная конфигурация + - ./nanaxe/nginx:/etc/nginx/conf.d/nanaxe:ro + - ./nanaxe/html:/usr/share/nginx/html/nanaxe:ro + depends_on: + - consyscab_php + - nanaxe_gitea + - nanaxe_api + networks: + - consyscab-network + + # ========================================== + # 4. Adminer + # ========================================== + consyscab_adminer: + image: adminer + container_name: consyscab_adminer + depends_on: + - consyscab_db + networks: + - consyscab-network + + # ========================================== + # 5. Memcached + # ========================================== + consyscab_memcached: + image: memcached:alpine + container_name: consyscab_memcached + networks: + - consyscab-network + + # ========================================== + # 6. Node.js для Quasar + # ========================================== + consyscab_front: + image: node:22-alpine + container_name: consyscab_front + user: "1000:1000" + ports: + - "9000:9000" + - "9005:9005" + working_dir: /app + volumes: + - ./frontend:/app + - ~/.gitconfig:/var/www/.gitconfig:ro + environment: + - NODE_ENV=development + tty: true + stdin_open: true + networks: + - consyscab-network + + # ========================================== + # 7. Mercure Hub + # ========================================== + consyscab_mercure: + image: dunglas/mercure + container_name: consyscab_mercure + environment: + MERCURE_PUBLISHER_JWT_KEY: ${MERCURE_JWT_SECRET:-secret} + MERCURE_SUBSCRIBER_JWT_KEY: ${MERCURE_JWT_SECRET:-secret} + ALLOW_ANONYMOUS: 1 + networks: + - consyscab-network + + # ========================================== + # 8. Nanaxe Gitea (Git сервер) + # ========================================== + nanaxe_gitea: + image: gitea/gitea:latest + container_name: nanaxe_gitea + environment: + - USER_UID=1000 + - USER_GID=1000 + - GITEA__database__DB_TYPE=postgres + - GITEA__database__HOST=consyscab_db:5432 + - GITEA__database__NAME=gitea + - GITEA__database__USER=user + - GITEA__database__PASSWD=${DB_PASSWORD:-password} + - GITEA__server__DOMAIN=${GITEA_DOMAIN:-git.localhost} + - GITEA__server__ROOT_URL=http://${GITEA_DOMAIN:-git.localhost} + - GITEA__server__SSH_DOMAIN=${GITEA_DOMAIN:-git.localhost} + - GITEA__server__SSH_PORT=2221 + - GITEA__server__SSH_LISTEN_PORT=22 + - GITEA__security__INSTALL_LOCK=true + - GITEA__security__SECRET_KEY=${GITEA_SECRET_KEY} + - GITEA__service__DISABLE_REGISTRATION=false + - GITEA__service__REQUIRE_SIGNIN_VIEW=false + volumes: + - gitea_data:/data + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + depends_on: + consyscab_db: + condition: service_healthy + networks: + - consyscab-network + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:3000/api/healthz"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + # ========================================== + # 9. Nanaxe API Server + # ========================================== + nanaxe_api: + build: + context: ./nanaxe/api + dockerfile: Dockerfile + container_name: nanaxe_api + environment: + - NODE_ENV=production + - PORT=8080 + - GITEA_URL=http://nanaxe_gitea:3000 + - GITEA_TOKEN=${GITEA_TOKEN} + - JWT_SECRET=${NANAXE_JWT_SECRET} + - MINDMAP_STORAGE_PATH=/app/mindmaps + volumes: + - mindmap_data:/app/mindmaps + - ./nanaxe/logs:/app/logs + depends_on: + - nanaxe_gitea + - consyscab_db + networks: + - consyscab-network + healthcheck: + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080/health"] + interval: 30s + timeout: 10s + retries: 3 + + # ========================================== + # 10. Nanaxe WebDAV (опционально) + # ========================================== + nanaxe_webdav: + image: bytemark/webdav + container_name: nanaxe_webdav + environment: + - AUTH_TYPE=Basic + - USERNAME=${WEBDAV_USER:-admin} + - PASSWORD=${WEBDAV_PASSWORD} + volumes: + - mindmap_data:/var/lib/dav + networks: + - consyscab-network + +networks: + consyscab-network: + driver: bridge + +volumes: + pg_data: + gitea_data: + mindmap_data: diff --git a/server/nanaxe/nginx/nanaxe.conf b/server/nanaxe/nginx/nanaxe.conf new file mode 100644 index 0000000..0273fd9 --- /dev/null +++ b/server/nanaxe/nginx/nanaxe.conf @@ -0,0 +1,123 @@ +# Nanaxe Server Nginx Configuration +# Добавьте этот файл в ./docker/nginx/conf.d/ вашего друга + +# Resolver для Docker DNS +resolver 127.0.0.11 valid=30s; + +# ========================================== +# Gitea - Git сервер +# ========================================== +server { + listen 80; + server_name git.* ~^git\..+$; + + client_max_body_size 512M; + + location / { + set $gitea_backend nanaxe_gitea:3000; + proxy_pass http://$gitea_backend; + proxy_http_version 1.1; + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # WebSocket support + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + } +} + +# ========================================== +# Nanaxe API +# ========================================== +server { + listen 80; + server_name api.* ~^api\..+$; + + location / { + set $api_backend nanaxe_api:8080; + proxy_pass http://$api_backend; + proxy_http_version 1.1; + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # CORS + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always; + + if ($request_method = 'OPTIONS') { + return 204; + } + + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + } +} + +# ========================================== +# Nanaxe Dashboard (опционально) +# ========================================== +server { + listen 80; + server_name nanaxe.* ~^nanaxe\..+$; + + location / { + root /usr/share/nginx/html/nanaxe; + try_files $uri $uri/ /index.html; + } + + location /api/ { + set $api_backend nanaxe_api:8080; + proxy_pass http://$api_backend/; + proxy_http_version 1.1; + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} + +# ========================================== +# WebDAV (если нужен прямой доступ) +# ========================================== +server { + listen 80; + server_name webdav.* ~^webdav\..+$; + + location / { + set $webdav_backend nanaxe_webdav:80; + proxy_pass http://$webdav_backend; + proxy_http_version 1.1; + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + # WebDAV methods + dav_methods PUT DELETE MKCOL COPY MOVE; + dav_ext_methods PROPFIND OPTIONS; + + client_max_body_size 100M; + client_body_temp_path /tmp; + } +} + +# ========================================== +# Map для WebSocket connection upgrade +# ========================================== +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} diff --git a/server/nginx/html/index.html b/server/nginx/html/index.html index 2f79be4..c92de7e 100644 --- a/server/nginx/html/index.html +++ b/server/nginx/html/index.html @@ -119,19 +119,19 @@

📚 Git Repository

Access your mindmaps via Git

- Open Gitea + Open Gitea

🔌 API

REST API for mindmap operations

- Check API + Check API

📱 WebDAV

Direct file access

- Open WebDAV + Open WebDAV