Clone
2
Deploy
s.zotov edited this page 2026-04-13 12:25:01 +05:00

Деплой

Сервер

Параметр Значение
IP 147.45.109.108
OS Ubuntu 24.04
Docker 29.2, Compose 5.1
RAM 2 GB
Диск 38 GB SSD
Домены app.aspekter.ru, coins.aspekter.ru

Структура на сервере

/opt/aspekter/                    # Основная папка (git repo)
├── z51-pug-builder/
│   ├── data/                     # Docker volume — данные проектов
│   ├── src/                      # Docker volume — исходники (live reload)
│   └── vite.config.js            # Docker volume — API
├── email-gen/                    # Email шаблоны
├── data/images/                  # Локальное хранение картинок
├── coin-scout/data/              # SQLite для Coin Scout
└── docker-compose*.yml

/etc/nginx/sites-enabled/
├── emailbro.conf                 # app.aspekter.ru → 127.0.0.1:5175
└── coins.conf                    # coins.aspekter.ru → 127.0.0.1:5180

/etc/letsencrypt/live/
├── app.aspekter.ru/              # SSL сертификат
└── coins.aspekter.ru/            # SSL сертификат

Docker Compose

Три файла:

  • docker-compose.yml — базовые сервисы (builder, email-gen-api)
  • docker-compose.dev.yml — dev: порт 5174, data-dev/, coin-scout
  • docker-compose.prod.yml — prod: порт 5175 на 127.0.0.1, volume mounts для src и vite.config.js

Prod запуск:

cd /opt/aspekter
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build

Volume mounts в prod позволяют обновлять код без пересборки контейнера:

volumes:
  - ./z51-pug-builder/data:/app/data
  - ./z51-pug-builder/vite.config.js:/app/vite.config.js
  - ./z51-pug-builder/src:/app/src
  - ./data/images:/app/data/images

SSL сертификаты

Let's Encrypt через certbot (standalone mode):

systemctl stop nginx  # освободить порт 80
certbot certonly --standalone -d app.aspekter.ru --agree-tos --email admin@aspekter.ru
certbot certonly --standalone -d coins.aspekter.ru --agree-tos --email admin@aspekter.ru
systemctl start nginx

Автообновление настроено через certbot systemd timer.

Обновление кода

cd /opt/aspekter
git pull origin main

# Если изменился только код (src, vite.config.js) — перезапуск не нужен (live reload)
# Если изменился Dockerfile или package.json:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build

DNS

systemd-resolved может перезаписывать /etc/resolv.conf при перезапуске docker. Постоянный фикс:

mkdir -p /etc/systemd/resolved.conf.d
cat > /etc/systemd/resolved.conf.d/dns.conf << EOF
[Resolve]
DNS=8.8.8.8 1.1.1.1
FallbackDNS=8.8.4.4
EOF
systemctl restart systemd-resolved

Хранение картинок

Два режима (настраивается per-project в Настройки → Интеграции):

Режим Где хранятся Публичный URL
FTP/SFTP Внешний сервер Настраивается в ftpConfig.baseUrl
Локально /opt/aspekter/data/images/{project}/{folder}/ https://app.aspekter.ru/images/{project}/{folder}/file.png

Nginx раздаёт локальные картинки статикой (expires 30d, Cache-Control immutable).

Мониторинг

docker ps                    # статус контейнеров
docker logs aspekter-builder # логи приложения
docker logs aspekter-email-gen-api  # логи рендерера