Compare commits
15 Commits
legacy-199
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 452b9457e9 | |||
| 3ac0e90831 | |||
| a5805b9de4 | |||
| c8a022b3de | |||
| 1fd84d0e01 | |||
| 27fa0c3f1c | |||
| e7dfd04c96 | |||
| 180f9a6193 | |||
| 60813cf019 | |||
| b2a7df1d40 | |||
| 34bd75c30f | |||
| 6acc7aa5d3 | |||
| abfc004643 | |||
| 523b2a8f21 | |||
| 7a745ec541 |
32
.dockerignore
Normal file
32
.dockerignore
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Git и контроль версий
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
.gitattributes
|
||||||
|
|
||||||
|
# IDE и редакторы
|
||||||
|
.idea
|
||||||
|
.vscode
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Документация (не нужна в контейнере)
|
||||||
|
README.md
|
||||||
|
*.md
|
||||||
|
|
||||||
|
# Docker compose файлы (не копируем в контейнер)
|
||||||
|
docker-compose.yml
|
||||||
|
docker-compose.prod.yml
|
||||||
|
Dockerfile
|
||||||
|
|
||||||
|
# Логи и temp файлы
|
||||||
|
logs/
|
||||||
|
*.log
|
||||||
|
tmp/
|
||||||
|
|
||||||
|
# Python, если вдруг будет скрипты
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
6
.env.example
Normal file
6
.env.example
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# Пример файла `.env` из которого проект берёт секреты.
|
||||||
|
# Переименуйте его в `.env` и заполните своими значениями.
|
||||||
|
|
||||||
|
# Настройки достпа к пакетам в репозитории, чтобы wathtower мог проверять их свежесть и скачивать
|
||||||
|
REPO_USER=xxxxx
|
||||||
|
REPO_PASS=xxxxx
|
||||||
55
.gitea/workflows/docker-publish.yaml
Normal file
55
.gitea/workflows/docker-publish.yaml
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
name: Build and Push CadPoint1998-site
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
# Запускать только при создании тега, начинающегося с 'v' (например, v1.0.0)
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-push:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
|
||||||
|
# Генерируем метаданные (теги) для Docker
|
||||||
|
- name: Docker meta
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v4
|
||||||
|
with:
|
||||||
|
# Важно: используем gitea.repository
|
||||||
|
images: git.cube2.ru/${{ gitea.repository }}
|
||||||
|
tags: |
|
||||||
|
type=ref,event=tag
|
||||||
|
type=raw,value=latest,enable=${{ gitea.ref_type == 'tag' }}
|
||||||
|
|
||||||
|
- name: Login to Gitea Registry
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: git.cube2.ru
|
||||||
|
# Важно: используем gitea.actor
|
||||||
|
username: ${{ gitea.actor }}
|
||||||
|
password: ${{ secrets.REGISTRY_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Build and push image LPON-site
|
||||||
|
uses: docker/build-push-action@v4
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
# platforms: linux/amd64
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
push: true
|
||||||
|
# Используем теги, сгенерированные шагом meta (v0.1.0 и latest)
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
# Кэширование для ускорения повторных сборок
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
|
# Увеличиваем тайм-аут на случай медленного интернета
|
||||||
|
timeout: 1800 # 30 минут
|
||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -22,3 +22,7 @@ Thumbs.db
|
|||||||
|
|
||||||
*.iml
|
*.iml
|
||||||
.idea/
|
.idea/
|
||||||
|
|
||||||
|
# Секреты
|
||||||
|
.env
|
||||||
|
|
||||||
|
|||||||
152
DEPLOYMENT.md
Normal file
152
DEPLOYMENT.md
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
# Развёртывание cadpoint1998 на продакшене
|
||||||
|
|
||||||
|
## 📋 Архитектура
|
||||||
|
|
||||||
|
```txt
|
||||||
|
┌─────────────────────────────────────────────────────────┐
|
||||||
|
│ Хост (продакшен) │
|
||||||
|
├─────────────────────────────────────────────────────────┤
|
||||||
|
│ │
|
||||||
|
│ Внешний nginx (на хосте или в контейнере) │
|
||||||
|
│ ├─ Прослушивает: 0.0.0.0:80 (public) │
|
||||||
|
│ ├─ Обслуживает: 1998.cadpoint.ru │
|
||||||
|
│ └─ Проксирует → 127.0.0.1:8030 │
|
||||||
|
│ ↓ │
|
||||||
|
│ Docker контейнер cadpoint1998 │
|
||||||
|
│ ├─ Прослушивает: 0.0.0.0:8030 (internal) │
|
||||||
|
│ ├─ Обслуживает: статический HTML (KOI8-R) + gzip │
|
||||||
|
│ └─ Watchtower следит за обновлениями │
|
||||||
|
│ │
|
||||||
|
└─────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 Шаги развёртывания
|
||||||
|
|
||||||
|
### 1. Подготовка на локальной машине
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Убедись, что коммиты в `main`
|
||||||
|
git add .
|
||||||
|
git commit -m "Add external nginx config and deployment script"
|
||||||
|
git push origin main
|
||||||
|
|
||||||
|
# Создаёшь тег для деплоя
|
||||||
|
git tag v1.0.0
|
||||||
|
git push origin v1.0.0
|
||||||
|
|
||||||
|
# Gitea Workflow запустится автоматически и соберёт образ
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Подготовка сервера (вход по SSH)
|
||||||
|
|
||||||
|
А. Создать папку для проекта (замените `<папка-прилолжений>` и `<прилолжение>` на свои значения):
|
||||||
|
```bash
|
||||||
|
# На продакшене (как e-serg или sudo)
|
||||||
|
mkdir -p ~/<папка-прилолжений>/<прилолжение>
|
||||||
|
cd ~/<папка-прилолжений>/<прилолжение>
|
||||||
|
```
|
||||||
|
|
||||||
|
Б. Создайте в ней каталог для конфигурационных файлов nginx:
|
||||||
|
```bash
|
||||||
|
mkdir -p config/nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
В. Создать файл `docker-compose.yml`, поместите в нее содержимое из `docker-compose.prod.yml` (копи-паст из репозитрия).
|
||||||
|
|
||||||
|
Г. Создайте файл для переменных окружения проекта `.env` и заполните его (см. образец файла `.env.example` в репозитории).
|
||||||
|
|
||||||
|
|
||||||
|
### 3. Запуск контейнера на сервере
|
||||||
|
|
||||||
|
Запусти контейнер (конфиги nginx скопируются автоматически)
|
||||||
|
```
|
||||||
|
sudo docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
Контейнер выведет при запуске:
|
||||||
|
- 📋 Копирование внешнего nginx конфига на хост...
|
||||||
|
- ✅ Пример nginx-конфика создан в ./config/nginx/cadpoint1998--external-nginx.conf.sample
|
||||||
|
- ✅ Боевой nginx-конфиг создан в ./config/nginx/cadpoint1998--external-nginx.conf
|
||||||
|
|
||||||
|
### 4. Настройка внешнего nginx на хосте
|
||||||
|
|
||||||
|
Сделай символическую ссылку на конфиг в папке nginx (или скопируй его):
|
||||||
|
```bash
|
||||||
|
sudo ln -s <полный-путь-к-home>/<папка-прилолжений>/<прилолжение>/config/nginx/cadpoint1998--external-nginx.conf /etc/nginx/sites-enabled
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверь, что конфиг корректный и nginx может его загрузить:
|
||||||
|
```bash
|
||||||
|
sudo nginx -t
|
||||||
|
```
|
||||||
|
|
||||||
|
Если ошибок нет и все `ok` перезапусти сервис nginx:
|
||||||
|
```bash
|
||||||
|
sudo systemctl reload nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверь, что сайт отвечает по адресу `http://1998.cadpoint.ru` (не забудь настроить DNS):
|
||||||
|
```bash
|
||||||
|
curl -v http://1998.cadpoint.ru/index.htm
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Настройка сертификата SSL (если нужен)
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo certbot --nginx -d 1998.cadpoint.ru
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔄 Обновление сайта
|
||||||
|
|
||||||
|
Когда ты создашь и запушишь новый тег в репозиторий:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git tag v1.0.1
|
||||||
|
git push origin v1.0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
**Автоматически происходит:**
|
||||||
|
1. Gitea запускает workflow (docker-publish.yaml)
|
||||||
|
2. Собирается новый образ и пушится в реестр как `v1.0.1` и `latest`
|
||||||
|
3. На сервере Watchtower каждые 30 минут проверяет реестр
|
||||||
|
4. Находит новый образ и автоматически:
|
||||||
|
- Pulls новый образ
|
||||||
|
- Стопит старый контейнер
|
||||||
|
- Запускает новый контейнер
|
||||||
|
- Копирует конфиги (если это первый запуск)
|
||||||
|
|
||||||
|
**Ручной pull (если не хочешь ждать Watchtower):**
|
||||||
|
```bash
|
||||||
|
cd ~/<папка-прилолжений>/<прилолжение>
|
||||||
|
sudo docker compose pull
|
||||||
|
sudo docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## ⚠️ Важно про конфиги
|
||||||
|
|
||||||
|
При каждом запуске контейнера он копирует конфиги из образа на хост:
|
||||||
|
|
||||||
|
1. **Первый запуск**: оба конфига копируются
|
||||||
|
- `.sample` (свежий из контейнера, для справки)
|
||||||
|
- основной (для использования в nginx)
|
||||||
|
|
||||||
|
2. **Последующие запуски**: только `.sample` обновляется
|
||||||
|
- Основной конфиг НЕ перезаписывается
|
||||||
|
- Это защищает ручные правки (например, после certbot)
|
||||||
|
|
||||||
|
## 📊 Мониторинг
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Логи контейнера
|
||||||
|
sudo docker logs cadpoint1998-site | tail -100
|
||||||
|
|
||||||
|
# Логи Watchtower
|
||||||
|
sudo docker logs cadpoint1998-watchtower | tail -50
|
||||||
|
|
||||||
|
# Проверка доступности (с хоста)
|
||||||
|
curl -v http://127.0.0.1:8030/index.htm
|
||||||
|
|
||||||
|
# Проверка через внешний nginx
|
||||||
|
curl -v -H 'Host: 1998.cadpoint.ru' http://localhost
|
||||||
|
```
|
||||||
|
|
||||||
27
Dockerfile
Normal file
27
Dockerfile
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Архивный сайт cad.ru (1998) — контейнеризированный с nginx
|
||||||
|
# Образ полностью self-contained: конфиг + HTML копируются в образ
|
||||||
|
# Используется как для dev, так и для prod
|
||||||
|
|
||||||
|
FROM nginx:alpine
|
||||||
|
|
||||||
|
# Удаляем стандартный nginx конфиг (по умолчанию)
|
||||||
|
RUN rm /etc/nginx/conf.d/default.conf
|
||||||
|
|
||||||
|
# Копируем custom конфиг cadpoint1998 как default (для внутреннего nginx)
|
||||||
|
# Это обеспечивает правильную кодировку KOI8-R и маршрутизацию
|
||||||
|
COPY config/nginx/cadpoint1998--internal-nginx.conf /etc/nginx/conf.d/default.conf
|
||||||
|
|
||||||
|
# Копируем все статические HTML файлы в корень документов nginx
|
||||||
|
# Архив содержит исторический контент (не обновляется), поэтому полностью в образ
|
||||||
|
COPY html/ /usr/share/nginx/html/
|
||||||
|
|
||||||
|
# Копируем внешний nginx конфиг для экспорта на хост (через volume)
|
||||||
|
# Это нужно для настройки reverse-proxy на хосте
|
||||||
|
COPY config/nginx/cadpoint1998--external-nginx.conf /tmp/cadpoint1998--external-nginx.conf.source
|
||||||
|
|
||||||
|
# Экспозируем порт 80 (внутренний, проксируется внешним nginx на хосте)
|
||||||
|
EXPOSE 80
|
||||||
|
|
||||||
|
# Встроенный nginx:alpine entrypoint запустит команду из docker-compose
|
||||||
|
# (command переопределяется в docker-compose.prod.yml для prod окружения)
|
||||||
|
|
||||||
61
README.md
61
README.md
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## ВСЕ о САПР (CAD/CAM/CAE Archive)
|
## ВСЕ о САПР (CAD/CAM/CAE Archive)
|
||||||
|
|
||||||
Архивная версия исторического русскоязычного сайта о системах автоматизированного проектирования (САПР), созданного в 1998–1999 годах. Развернуто, для обозрения по адресу: [1998.cadpoint.ru/](https://1998.cadpoint.ru/).
|
Это архивная версия исторического русскоязычного сайта о системах автоматизированного проектирования (САПР), созданного в 1998–1999 годах для "Русской Промышленной Компании" (РПК). Развернуто по адресу: [1998.cadpoint.ru](https://1998.cadpoint.ru/).
|
||||||
|
|
||||||
**Осторожно:**
|
**Осторожно:**
|
||||||
- фреймы (frameset) и meta-refresh;
|
- фреймы (frameset) и meta-refresh;
|
||||||
@@ -63,12 +63,17 @@ Content-Type: text/html; charset=koi8-r
|
|||||||
│ ├── images/ # Баннеры и логотипы
|
│ ├── images/ # Баннеры и логотипы
|
||||||
│ ├── robots.txt # Инструкции для поисковых роботов
|
│ ├── robots.txt # Инструкции для поисковых роботов
|
||||||
│ └── favicon.* # Иконки браузера
|
│ └── favicon.* # Иконки браузера
|
||||||
├── configs/ # Конфигурация nginx
|
├── config/
|
||||||
│ ├── cadpoin-ru_1998.conf
|
│ └── nginx/
|
||||||
│ └── cadpoin-ru_1998_w_ssl.conf
|
│ ├── cadpoint1998--internal-nginx.conf # Конфиг внутреннего nginx (в контейнере)
|
||||||
|
│ └── cadpoint1998--external-nginx.conf # Конфиг внешнего nginx (на хосте, для reverse-proxy)
|
||||||
|
├── Dockerfile # Контейнеризация архива (nginx + HTML + конфиги)
|
||||||
|
├── docker-compose.yml # Dev-конфиг (локальное тестирование)
|
||||||
|
├── docker-compose.prod.yml # Prod-конфиг (продакшен с Watchtower)
|
||||||
├── .gitignore # Исключение из репозитория
|
├── .gitignore # Исключение из репозитория
|
||||||
├── .gitattributes # Правила кодировки и обработки файлов
|
├── .gitattributes # Правила кодировки и обработки файлов
|
||||||
├── .editorconfig # Рекомендации для редакторов
|
├── .editorconfig # Рекомендации для редакторов
|
||||||
|
├── .env.example # Пример переменных окружения
|
||||||
└── README.md # Этот файл
|
└── README.md # Этот файл
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -115,17 +120,53 @@ Content-Type: text/html; charset=koi8-r
|
|||||||
|
|
||||||
Проект может быть расширен в отдельных ветках:
|
Проект может быть расширен в отдельных ветках:
|
||||||
|
|
||||||
- **`legacy-1998`** — архивная версия в оригинальном виде (текущая ветка)
|
- **`legacy-1998`** — архивная версия в оригинальном виде (ветка сохранения истории)
|
||||||
- **`main`** — версия с миграцией:
|
- **`main`** — современная версия с контейнеризацией (текущая ветка):
|
||||||
- Развертывание в Docker
|
- ✅ Docker контейнеризация (nginx:alpine)
|
||||||
- Возможно что-то еще (пока не знаю)
|
- ✅ docker-compose для dev и prod
|
||||||
|
- ✅ Watchtower для автоматических обновлений образа
|
||||||
|
- ✅ Gitea CI/CD пайплайн (автосборка при тегировании)
|
||||||
|
- ✅ Support для SSL/TLS (через certbot)
|
||||||
|
- ✅ Reverse-proxy через внешний nginx
|
||||||
|
|
||||||
|
## Контейнеризация (2026)
|
||||||
|
|
||||||
|
Архив полностью перемещён в Docker контейнер с современной инфраструктурой:
|
||||||
|
|
||||||
|
### Что включено
|
||||||
|
|
||||||
|
- **Образ**: `git.cube2.ru/erjemin/1998-cad-cadpoint:latest` (nginx:alpine)
|
||||||
|
- **Содержимое образа**:
|
||||||
|
- nginx (web-сервер)
|
||||||
|
- Конфиг для внутреннего nginx (с поддержкой KOI8-R)
|
||||||
|
- Весь архив HTML сайта (KOI8-R)
|
||||||
|
- Конфиг для внешнего nginx (для reverse-proxy на хосте)
|
||||||
|
|
||||||
|
### Как запустить
|
||||||
|
|
||||||
|
**Development (локально):**
|
||||||
|
```bash
|
||||||
|
docker-compose up --build
|
||||||
|
# Сайт доступен на http://127.0.0.1:8030
|
||||||
|
```
|
||||||
|
|
||||||
|
**Production (на сервере):**
|
||||||
|
```bash
|
||||||
|
docker-compose -f docker-compose.prod.yml up -d
|
||||||
|
# Watchtower автоматически следит за обновлениями образа
|
||||||
|
# Сайт проксируется через внешний nginx на хосте
|
||||||
|
```
|
||||||
|
|
||||||
|
### Детальная документация
|
||||||
|
|
||||||
|
См. [DEPLOYMENT.md](DEPLOYMENT.md) для полной инструкции по развёртыванию на продакшене.
|
||||||
|
|
||||||
## Контакты и лицензия
|
## Контакты и лицензия
|
||||||
|
|
||||||
Автор: *Sergei Erjemin* (это я)
|
Автор: *Sergei Erjemin* (это я)
|
||||||
Контакт: `erjemin@gmail.com`
|
Контакт: `erjemin@gmail.com`
|
||||||
|
|
||||||
Архив сохранён и перенесён в современную инфраструктуру в 2026 году.
|
Архив сохранён и перенесён в современную инфраструктуру (Docker) в 2026 году.
|
||||||
|
|
||||||
---
|
---
|
||||||
**Последнее обновление:** March 27, 2026
|
**Последнее обновление:** March 28, 2026 (добавлена контейнеризация)
|
||||||
|
|||||||
90
config/nginx/cadpoint1998--external-nginx.conf
Normal file
90
config/nginx/cadpoint1998--external-nginx.conf
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
# Внешний nginx конфиг для проксирования к контейнеру cadpoint1998
|
||||||
|
# Это конфиг для ХОСТА (не внутри контейнера)
|
||||||
|
|
||||||
|
upstream cadpoint1998_backend {
|
||||||
|
# Контейнер слушает на localhost:8030 (из docker-compose.prod.yml)
|
||||||
|
server 127.0.0.1:8030;
|
||||||
|
keepalive 32;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Редирект с www на основной домен
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
server_name www.1998.cadpoint.ru;
|
||||||
|
|
||||||
|
# Редирект на основной домен (без www)
|
||||||
|
return 301 http://1998.cadpoint.ru$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
server_name 1998.cadpoint.ru;
|
||||||
|
|
||||||
|
# Редирект HTTP → HTTPS (cerbot добавит SSL позже)
|
||||||
|
# Пока оставляем HTTP для тестирования
|
||||||
|
# Раскомментируй после добавления SSL:
|
||||||
|
# return 301 https://$server_name$request_uri;
|
||||||
|
|
||||||
|
# Логи для этого виртуального хоста
|
||||||
|
# --- ЛОГИ ---
|
||||||
|
access_log /var/log/nginx/cadpoint1998.access.log;
|
||||||
|
error_log /var/log/nginx/cadpoint1998.error.log warn;
|
||||||
|
|
||||||
|
# Основной блок проксирования
|
||||||
|
location / {
|
||||||
|
# Проксируем все запросы в контейнер
|
||||||
|
proxy_pass http://cadpoint1998_backend;
|
||||||
|
|
||||||
|
# Сохраняем оригинальный хост в заголовке (важно для правильной работы контейнера)
|
||||||
|
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;
|
||||||
|
|
||||||
|
# Keepalive для улучшения производительности
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Connection "";
|
||||||
|
|
||||||
|
# Timeouts для длительных запросов
|
||||||
|
proxy_connect_timeout 60s;
|
||||||
|
proxy_send_timeout 60s;
|
||||||
|
proxy_read_timeout 60s;
|
||||||
|
|
||||||
|
# Буферизация (для архивного сайта можно отключить если мало памяти)
|
||||||
|
# proxy_buffering off;
|
||||||
|
proxy_buffering on;
|
||||||
|
proxy_buffer_size 4k;
|
||||||
|
proxy_buffers 8 4k;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Кэширование статических файлов (HTML, GIF, CSS, JS, иконки)
|
||||||
|
location ~* \.(htm|html|gif|png|jpe?g|svg|ico|css|js|woff|woff2|ttf|eot)$ {
|
||||||
|
proxy_pass http://cadpoint1998_backend;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
|
||||||
|
# Кэш в браузере на 7 дней для статики (архив не меняется)
|
||||||
|
expires 7d;
|
||||||
|
add_header Cache-Control "public, max-age=604800, immutable";
|
||||||
|
|
||||||
|
# Логирование отключаем для статики (шум в логах)
|
||||||
|
access_log off;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Health check для мониторинга (внутренний эндпоинт)
|
||||||
|
location = /health {
|
||||||
|
access_log off;
|
||||||
|
default_type text/plain;
|
||||||
|
return 200 "OK\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
# Запретить доступ к скрытым файлам
|
||||||
|
location ~ /\. {
|
||||||
|
deny all;
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
75
config/nginx/cadpoint1998--internal-nginx.conf
Normal file
75
config/nginx/cadpoint1998--internal-nginx.conf
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
# --- ОПТИМИЗАЦИЯ ПРОИЗВОДИТЕЛЬНОСТИ ---
|
||||||
|
# sendfile on; # можно включить для больших статик файлов, но для контейнера избыточно
|
||||||
|
tcp_nopush on; # отправляй данные только когда буфер полон (меньше пакетов)
|
||||||
|
tcp_nodelay on; # не жди, отправляй сразу (для low-latency интеракции)
|
||||||
|
# keepalive_timeout 65; # по умолчанию работает, фреймовый сайт не требует особого тюнинга
|
||||||
|
types_hash_max_size 2048; # размер хэша для mime.types
|
||||||
|
|
||||||
|
# MIME-типы и кодировка по умолчанию
|
||||||
|
include /etc/nginx/mime.types;
|
||||||
|
# default_type application/octet-stream; # оставляю по умолчанию
|
||||||
|
|
||||||
|
# Настройки логов (stdout/stderr для docker logs)
|
||||||
|
access_log /dev/stdout; # вывод в stdout контейнера (видно через docker logs)
|
||||||
|
error_log /dev/stderr warn; # ошибки в stderr
|
||||||
|
|
||||||
|
# Настройки сжатия gzip (для экономии трафика между контейнером и внешним nginx)
|
||||||
|
gzip on; # включаем сжатие
|
||||||
|
gzip_proxied any; # сжимаем, даже если запрос идет через прокси
|
||||||
|
gzip_comp_level 6; # уровень сжатия (6 = хороший баланс между CPU и ratio)
|
||||||
|
gzip_buffers 16 8k; # буферы для сжатия (16 буферов по 8к)
|
||||||
|
gzip_http_version 1.1; # поддерживаем gzip с HTTP/1.1+
|
||||||
|
gzip_disable "msie6"; # не сжимаем для IE6 (исторический артефакт, но оставляю)
|
||||||
|
gzip_vary on; # добавляем Vary: Accept-Encoding в response (важно для кешей)
|
||||||
|
gzip_min_length 512; # сжимаем только если больше 512 байт (меньше — толку нет)
|
||||||
|
gzip_types text/plain # какие MIME-типы сжимать
|
||||||
|
text/css
|
||||||
|
application/json
|
||||||
|
application/x-javascript
|
||||||
|
text/xml application/xml
|
||||||
|
application/xml+rss
|
||||||
|
text/javascript
|
||||||
|
application/javascript
|
||||||
|
application/vnd.ms-fontobject
|
||||||
|
application/x-font-ttf
|
||||||
|
font/opentype
|
||||||
|
image/svg+xml
|
||||||
|
image/x-icon;
|
||||||
|
|
||||||
|
# --- КОНФИГУРАЦИЯ СЕРВЕРА ---
|
||||||
|
server {
|
||||||
|
listen 80 default_server; # слушаем по умолчанию на порте 80 внутри контейнера
|
||||||
|
listen [::]:80; # поддержка IPv6
|
||||||
|
server_name _; # принимаем любое имя хоста (внутренний контейнер)
|
||||||
|
|
||||||
|
root /usr/share/nginx/html; # корень для статических файлов (монтируется снаружи)
|
||||||
|
index index.htm index1.htm index.html; # приоритет индексов (index.htm для KOI8-R)
|
||||||
|
|
||||||
|
charset koi8-r; # отправляем charset=koi8-r в Content-Type заголовке
|
||||||
|
source_charset koi8-r; # исходная кодировка файлов на диске
|
||||||
|
|
||||||
|
client_max_body_size 50M; # максимальный размер тела запроса (для загрузок)
|
||||||
|
|
||||||
|
# Корневой путь → явно на index.htm (для фреймовой структуры)
|
||||||
|
location = / {
|
||||||
|
try_files /index.htm =404;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Все остальные пути → статические файлы как есть
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ =404;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Обработчики ошибок (если они есть в корне html/)
|
||||||
|
error_page 404 /404.html;
|
||||||
|
error_page 500 /500.html;
|
||||||
|
|
||||||
|
# Внутренние редиректы (не возвращаем клиенту, только используем для error_page)
|
||||||
|
location = /404.html {
|
||||||
|
internal;
|
||||||
|
}
|
||||||
|
|
||||||
|
location = /500.html {
|
||||||
|
internal;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
# Разработка сайта LPON.RU
|
|
||||||
# == Конфикурационный файл nginx cadpoint.conf
|
|
||||||
|
|
||||||
# Описываем апстрим-потоки которые должен подключить Nginx
|
|
||||||
# Для каждого сайта надо настроить свйо поток, со своим уникальным именем.
|
|
||||||
# Если будете настраивать несколько python (django) сайтов - измените название upstream
|
|
||||||
|
|
||||||
# конфигурируем сервер
|
|
||||||
server {
|
|
||||||
server_name 1998.cadpoint.ru; # доменное имя сайта
|
|
||||||
# listen 443 ssl http2; # managed by Certbot
|
|
||||||
listen 80; # managed by Certbot
|
|
||||||
|
|
||||||
root /home/web/cadpoint-ru_1998/html;
|
|
||||||
location = / {
|
|
||||||
try_files /index.htm =404;
|
|
||||||
}
|
|
||||||
|
|
||||||
charset koi8-r; # кодировка по умолчанию
|
|
||||||
source_charset koi8-r;
|
|
||||||
access_log /home/web/cadpoint-ru_1998/logs/cadpoint-ru_1998-access.log; # логи с доступом
|
|
||||||
error_log /home/web/cadpoint-ru_1998/logs/cadpoint-ru_1998-error.log; # логи с ошибками
|
|
||||||
client_max_body_size 100M; # максимальный объем файла для загрузки на сайт (max upload size)
|
|
||||||
error_page 404 /404.html;
|
|
||||||
error_page 500 /500.html;
|
|
||||||
|
|
||||||
# location /robots.txt { root /home/web/cadpoint-ru_1998/html; } # Расположение robots.txt
|
|
||||||
# location /favicon.ico { root /home/web/cadpoint-ru_1998/html; } # Расположение favicon.ico
|
|
||||||
# location /favicon.gif { root /home/web/cadpoint-ru_1998/html; } # Расположение favicon
|
|
||||||
# location /favicon.png { root /home/web/cadpoint-ru_1998/html; } # Расположение favicon
|
|
||||||
# location /favicon.svg { root /home/web/cadpoint-ru_1998/html; } # Расположение favicon
|
|
||||||
# location /author.txt { root /home/web/cadpoint-ru_1998/html; } # Расположение author.txt
|
|
||||||
location = /404.html {
|
|
||||||
root /home/web/cadpoint-ru_1998/html/index.html;
|
|
||||||
internal;
|
|
||||||
}
|
|
||||||
location = /500.html {
|
|
||||||
root /home/web/cadpoint-ru_1998/html/index.html;
|
|
||||||
internal;
|
|
||||||
}
|
|
||||||
# location ~ \.(html|htm|ico|svg|png|gif|jpg|jpeg)$ {
|
|
||||||
# root /home/web/cadpoint-ru_1998/public; # Расположение статичных *.xml, *.html и *.txt
|
|
||||||
# }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
# переадресация с www на "без" www
|
|
||||||
server {
|
|
||||||
server_name www.1998.cadpoint.ru;
|
|
||||||
|
|
||||||
listen 443 ssl; # managed by Certbot
|
|
||||||
ssl_certificate /etc/letsencrypt/live/1998.cadpoint.ru/fullchain.pem; # managed by Certbot
|
|
||||||
ssl_certificate_key /etc/letsencrypt/live/1998.cadpoint.ru/privkey.pem; # managed by Certbot
|
|
||||||
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
|
|
||||||
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
|
|
||||||
|
|
||||||
return 301 http://1998.cadpoint.ru$request_uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
|
||||||
server_name 1998.cadpoint.ru;
|
|
||||||
|
|
||||||
listen 443 ssl; # managed by Certbot
|
|
||||||
ssl_certificate /etc/letsencrypt/live/1998.cadpoint.ru/fullchain.pem; # managed by Certbot
|
|
||||||
ssl_certificate_key /etc/letsencrypt/live/1998.cadpoint.ru/privkey.pem; # managed by Certbot
|
|
||||||
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
|
|
||||||
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
|
|
||||||
|
|
||||||
return 301 http://1998.cadpoint.ru$request_uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
|
||||||
server_name www.1998.cadpoint.ru;
|
|
||||||
listen 80;
|
|
||||||
if ($host = www.1998.cadpoint.ru) {
|
|
||||||
return 301 http://$host$request_uri;
|
|
||||||
} # managed by Certbot
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
# Разработка сайта LPON.RU
|
|
||||||
# == Конфикурационный файл nginx cadpoint.conf
|
|
||||||
|
|
||||||
# Описываем апстрим-потоки которые должен подключить Nginx
|
|
||||||
# Для каждого сайта надо настроить свйо поток, со своим уникальным именем.
|
|
||||||
# Если будете настраивать несколько python (django) сайтов - измените название upstream
|
|
||||||
|
|
||||||
# конфигурируем сервер
|
|
||||||
server {
|
|
||||||
server_name 1998.cadpoint.ru; # доменное имя сайта
|
|
||||||
# listen 443 ssl http2; # managed by Certbot
|
|
||||||
listen 443 ssl; # managed by Certbot
|
|
||||||
root /home/web/cadpoint-ru_1998/html;
|
|
||||||
location = / {
|
|
||||||
try_files /index.htm =404;
|
|
||||||
# try_files /index.htm;
|
|
||||||
}
|
|
||||||
ssl_certificate /etc/letsencrypt/live/1998.cadpoint.ru/fullchain.pem; # managed by Certbot
|
|
||||||
ssl_certificate_key /etc/letsencrypt/live/1998.cadpoint.ru/privkey.pem; # managed by Certbot
|
|
||||||
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
|
|
||||||
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
|
|
||||||
|
|
||||||
charset koi8-r; # кодировка по умолчанию
|
|
||||||
access_log /home/web/cadpoint-ru_1998/logs/cadpoint-ru_1998-access.log; # логи с доступом
|
|
||||||
error_log /home/web/cadpoint-ru_1998/logs/cadpoint-ru_1998-error.log; # логи с ошибками
|
|
||||||
client_max_body_size 100M; # максимальный объем файла для загрузки на сайт (max upload size)
|
|
||||||
error_page 404 /404.html;
|
|
||||||
error_page 500 /500.html;
|
|
||||||
|
|
||||||
# location /robots.txt { root /home/web/cadpoint-ru_1998/html; } # Расположение robots.txt
|
|
||||||
# location /favicon.ico { root /home/web/cadpoint-ru_1998/html; } # Расположение favicon.ico
|
|
||||||
# location /favicon.gif { root /home/web/cadpoint-ru_1998/html; } # Расположение favicon
|
|
||||||
# location /favicon.png { root /home/web/cadpoint-ru_1998/html; } # Расположение favicon
|
|
||||||
# location /favicon.svg { root /home/web/cadpoint-ru_1998/html; } # Расположение favicon
|
|
||||||
# location /author.txt { root /home/web/cadpoint-ru_1998/html; } # Расположение author.txt
|
|
||||||
location = /404.html {
|
|
||||||
root /home/web/cadpoint-ru_1998/html/index.html;
|
|
||||||
internal;
|
|
||||||
}
|
|
||||||
location = /500.html {
|
|
||||||
root /home/web/cadpoint-ru_1998/html/index.html;
|
|
||||||
internal;
|
|
||||||
}
|
|
||||||
# location ~ \.(html|htm|ico|svg|png|gif|jpg|jpeg)$ {
|
|
||||||
# root /home/web/cadpoint-ru_1998/public; # Расположение статичных *.xml, *.html и *.txt
|
|
||||||
# }
|
|
||||||
}
|
|
||||||
|
|
||||||
# переадресация с www на "без" www
|
|
||||||
server {
|
|
||||||
server_name www.1998.cadpoint.ru;
|
|
||||||
return 301 http://1998.cadpoint.ru$request_uri;
|
|
||||||
|
|
||||||
listen 443 ssl; # managed by Certbot
|
|
||||||
ssl_certificate /etc/letsencrypt/live/1998.cadpoint.ru/fullchain.pem; # managed by Certbot
|
|
||||||
ssl_certificate_key /etc/letsencrypt/live/1998.cadpoint.ru/privkey.pem; # managed by Certbot
|
|
||||||
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
|
|
||||||
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
|
|
||||||
}
|
|
||||||
server {
|
|
||||||
if ($host = 1998.cadpoint.ru) {
|
|
||||||
return 301 https://$host$request_uri;
|
|
||||||
} # managed by Certbot
|
|
||||||
|
|
||||||
|
|
||||||
server_name 1998.cadpoint.ru;
|
|
||||||
listen 80;
|
|
||||||
return 404; # managed by Certbot
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
server {
|
|
||||||
if ($host = www.1998.cadpoint.ru) {
|
|
||||||
return 301 https://$host$request_uri;
|
|
||||||
} # managed by Certbot
|
|
||||||
|
|
||||||
|
|
||||||
server_name www.1998.cadpoint.ru;
|
|
||||||
listen 80;
|
|
||||||
return 404; # managed by Certbot
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
91
docker-compose.prod.yml
Normal file
91
docker-compose.prod.yml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
# Файл для продакшена (использует только собранный образ, без локальных volume)
|
||||||
|
# Для разработки используй docker-compose.yml
|
||||||
|
|
||||||
|
services:
|
||||||
|
cadpoint1998:
|
||||||
|
# В продакшене используем заранее собранный образ (не build)
|
||||||
|
image: git.cube2.ru/erjemin/1998-cad-cadpoint:latest
|
||||||
|
|
||||||
|
# Имя контейнера для идентификации
|
||||||
|
container_name: cadpoint1998-site
|
||||||
|
|
||||||
|
# Политика перезагрузки: всегда перезагружаемся при сбое
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
# Метки для Watchtower (авто-обновление)
|
||||||
|
labels:
|
||||||
|
- "com.centurylinklabs.watchtower.scope=cadpoint1998-scope"
|
||||||
|
|
||||||
|
# Переменные окружения
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
|
||||||
|
# Volume для экспорта конфигов из контейнера на хост
|
||||||
|
# Контейнер копирует nginx конфиг при запуске для настройки reverse-proxy на хосте
|
||||||
|
volumes:
|
||||||
|
- ./config/nginx:/tmp/nginx_configs:rw # контейнер пишет сюда конфиги
|
||||||
|
|
||||||
|
# Command: скрипт для копирования конфигов из контейнера на хост при запуске
|
||||||
|
# Встроенный entrypoint nginx:alpine (/docker-entrypoint.sh) запустит это как команду
|
||||||
|
command: >
|
||||||
|
sh -c "
|
||||||
|
echo '📋 Копирование внешнего nginx конфига на хост...' &&
|
||||||
|
cp /tmp/cadpoint1998--external-nginx.conf.source /tmp/nginx_configs/cadpoint1998--external-nginx.conf.sample &&
|
||||||
|
echo '✅ Пример nginx-конфига создан в ./config/nginx/cadpoint1998--external-nginx.conf.sample (свежий из контейнера)' &&
|
||||||
|
if [ ! -f /tmp/nginx_configs/cadpoint1998--external-nginx.conf ]; then
|
||||||
|
cp /tmp/cadpoint1998--external-nginx.conf.source /tmp/nginx_configs/cadpoint1998--external-nginx.conf &&
|
||||||
|
echo '✅ Боевой nginx-конфиг создан в ./config/nginx/cadpoint1998--external-nginx.conf (свежий из контейнера)'
|
||||||
|
else
|
||||||
|
echo '⏭️ Боевой nginx-конфиг оставлен без изменений.'
|
||||||
|
fi &&
|
||||||
|
exec nginx -g 'daemon off;'
|
||||||
|
"
|
||||||
|
|
||||||
|
# В продакшене слушаем на внутреннем адресе (проксируется через внешний nginx)
|
||||||
|
ports:
|
||||||
|
- "127.0.0.1:8030:80"
|
||||||
|
|
||||||
|
# Логирование в JSON-файлы (для сбора логов через docker logs)
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
max-size: "10m" # больше лимит в продакшене для логирования
|
||||||
|
max-file: "1" # храним 1 файл лога
|
||||||
|
|
||||||
|
# Сеть для взаимодействия с другими контейнерами
|
||||||
|
networks:
|
||||||
|
- cadpoint1998-network
|
||||||
|
|
||||||
|
|
||||||
|
# WATCHTOWER ДЛЯ АВТОМАТИЧЕСКОГО ОБНОВЛЕНИЯ ОБРАЗОВ ИЗ РЕЕСТРА
|
||||||
|
watchtower:
|
||||||
|
image: containrrr/watchtower
|
||||||
|
container_name: cadpoint1998-watchtower
|
||||||
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
# Переменные окружения
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
- DOCKER_API_VERSION=1.44
|
||||||
|
# Берем учетные данные из .env файла
|
||||||
|
- REPO_USER=${REPO_USER}
|
||||||
|
- REPO_PASS=${REPO_PASS}
|
||||||
|
# Ограничиваем область видимости только этим проектом
|
||||||
|
- WATCHTOWER_SCOPE=cadpoint1998-scope
|
||||||
|
# Если нужно указать реестр явно (обычно watchtower сам понимает из имени образа)
|
||||||
|
# - WATCHTOWER_REGISTRY_URL=git.cube2.ru
|
||||||
|
command: --interval 1800 --cleanup # Проверять каждые 30 минут
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
max-size: "1m"
|
||||||
|
max-file: "1"
|
||||||
|
networks:
|
||||||
|
- cadpoint1998-network
|
||||||
|
|
||||||
|
# Bridge-сеть для координации сервисов
|
||||||
|
networks:
|
||||||
|
cadpoint1998-network:
|
||||||
|
driver: bridge
|
||||||
43
docker-compose.yml
Normal file
43
docker-compose.yml
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# Файл для dev-окружения и локального тестирования
|
||||||
|
# Для продакшена используй docker-compose.prod.yml
|
||||||
|
|
||||||
|
# Примечание: в новых версиях Docker Compose версия необязательна
|
||||||
|
# (в новых версиях даже рекомендуется её не указывать)
|
||||||
|
# version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
cadpoint1998:
|
||||||
|
# Собираем образ из Dockerfile (одного для dev и prod)
|
||||||
|
# Образ полностью self-contained: конфиг + HTML в образе
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
|
||||||
|
# Имя контейнера для удобства обращения через docker/podman
|
||||||
|
container_name: cadpoint1998-site
|
||||||
|
|
||||||
|
# Порт: слушаем на localhost:8030, проксируем в контейнер на 80
|
||||||
|
# Внешний nginx/reverse-proxy обращается на этот адрес
|
||||||
|
ports:
|
||||||
|
- "127.0.0.1:8030:80"
|
||||||
|
|
||||||
|
# Политика перезагрузки: перезагружаем при сбое, но не при явном останове
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
# Логирование в JSON-файлы (видно через docker logs и анализ)
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
max-size: "5m" # максимум 5МБ на файл лога
|
||||||
|
max-file: "1" # хранить только 1 файл (экономим место)
|
||||||
|
|
||||||
|
# Пользовательская сеть для координации с другими сервисами
|
||||||
|
networks:
|
||||||
|
- cadpoint1998-network
|
||||||
|
|
||||||
|
|
||||||
|
# Определяем пользовательскую bridge-сеть для контейнеров
|
||||||
|
networks:
|
||||||
|
cadpoint1998-network:
|
||||||
|
driver: bridge
|
||||||
|
|
||||||
@@ -1 +1,5 @@
|
|||||||
User-agent: *
|
User-agent: *
|
||||||
|
Allow: /
|
||||||
|
|
||||||
|
# Sitemap для поисковиков
|
||||||
|
Sitemap: https://1998.cadpoint.ru/sitemap.xml
|
||||||
|
|||||||
67
html/sitemap.xml
Normal file
67
html/sitemap.xml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
|
<!-- Главная страница -->
|
||||||
|
<url>
|
||||||
|
<loc>https://1998.cadpoint.ru/</loc>
|
||||||
|
<lastmod>2026-03-28</lastmod>
|
||||||
|
<changefreq>never</changefreq>
|
||||||
|
<priority>1.0</priority>
|
||||||
|
</url>
|
||||||
|
|
||||||
|
<!-- Основные разделы (из фреймовой структуры) -->
|
||||||
|
<url>
|
||||||
|
<loc>https://1998.cadpoint.ru/index1.htm</loc>
|
||||||
|
<lastmod>2026-03-28</lastmod>
|
||||||
|
<changefreq>never</changefreq>
|
||||||
|
<priority>0.9</priority>
|
||||||
|
</url>
|
||||||
|
|
||||||
|
<!-- Раздел: Компании -->
|
||||||
|
<url>
|
||||||
|
<loc>https://1998.cadpoint.ru/_co/</loc>
|
||||||
|
<lastmod>2026-03-28</lastmod>
|
||||||
|
<changefreq>never</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
|
||||||
|
<!-- Раздел: Программные продукты -->
|
||||||
|
<url>
|
||||||
|
<loc>https://1998.cadpoint.ru/_pr/</loc>
|
||||||
|
<lastmod>2026-03-28</lastmod>
|
||||||
|
<changefreq>never</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
|
||||||
|
<!-- Раздел: События и новости -->
|
||||||
|
<url>
|
||||||
|
<loc>https://1998.cadpoint.ru/_ex/</loc>
|
||||||
|
<lastmod>2026-03-28</lastmod>
|
||||||
|
<changefreq>never</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
|
||||||
|
<!-- Раздел: Публикации -->
|
||||||
|
<url>
|
||||||
|
<loc>https://1998.cadpoint.ru/_pb/</loc>
|
||||||
|
<lastmod>2026-03-28</lastmod>
|
||||||
|
<changefreq>never</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
|
||||||
|
<!-- Раздел: Ссылки -->
|
||||||
|
<url>
|
||||||
|
<loc>https://1998.cadpoint.ru/_fr/</loc>
|
||||||
|
<lastmod>2026-03-28</lastmod>
|
||||||
|
<changefreq>never</changefreq>
|
||||||
|
<priority>0.7</priority>
|
||||||
|
</url>
|
||||||
|
|
||||||
|
<!-- Раздел: Поиск -->
|
||||||
|
<url>
|
||||||
|
<loc>https://1998.cadpoint.ru/_sh/</loc>
|
||||||
|
<lastmod>2026-03-28</lastmod>
|
||||||
|
<changefreq>never</changefreq>
|
||||||
|
<priority>0.7</priority>
|
||||||
|
</url>
|
||||||
|
</urlset>
|
||||||
|
|
||||||
Reference in New Issue
Block a user