Add auto-deploy workflow and fix dashboard URLs

This commit is contained in:
2026-04-20 22:44:10 +05:00
parent 53bfb305c6
commit b281778792
7 changed files with 593 additions and 3 deletions
+164
View File
@@ -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`
+216
View File
@@ -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:
+123
View File
@@ -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;
}
+3 -3
View File
@@ -119,19 +119,19 @@
<div class="service-card">
<h3>📚 Git Repository</h3>
<p>Access your mindmaps via Git</p>
<a href="http://localhost:3000" target="_blank">Open Gitea</a>
<a href="/git/" target="_blank">Open Gitea</a>
</div>
<div class="service-card">
<h3>🔌 API</h3>
<p>REST API for mindmap operations</p>
<a href="http://localhost:8080/health" target="_blank">Check API</a>
<a href="/api/health" target="_blank">Check API</a>
</div>
<div class="service-card">
<h3>📱 WebDAV</h3>
<p>Direct file access</p>
<a href="http://localhost:8081" target="_blank">Open WebDAV</a>
<a href="http://a-crm.controlsystem.kz:8084" target="_blank">Open WebDAV</a>
</div>
</div>