# Настройка нового сервера с нуля

Пошаговая инструкция для развёртывания проекта на чистом Ubuntu 22.04 сервере.

## Требования

- Ubuntu 22.04 LTS (минимум 2 GB RAM, 20 GB диск)
- Root-доступ по SSH
- Домен с DNS (A-записи на IP сервера). Текущая конфигурация без Cloudflare.
- Локальная копия проекта: `C:\Users\papus\OneDrive\Desktop\TR`

## Шаг 1: Подключение к серверу

```bash
ssh root@<IP_СЕРВЕРА>
```

Или через Python (paramiko) / deploy-скрипт.

## Шаг 2: Обновление системы

```bash
apt-get update -qq
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y -qq
```

## Шаг 3: Установка Node.js 20

```bash
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt-get install -y nodejs
node --version   # v20.x.x
npm --version    # 10.x.x
```

## Шаг 4: Установка PM2

```bash
npm install -g pm2
pm2 --version
```

## Шаг 5: Установка Nginx

```bash
apt-get install -y nginx
systemctl enable nginx
systemctl start nginx
```

## Шаг 6: Установка SQLite3 и утилит

```bash
apt-get install -y sqlite3 certbot python3-certbot-nginx build-essential python3
```

## Шаг 7: Настройка firewall

```bash
apt-get install -y ufw
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 8080/tcp
echo 'y' | ufw enable
```

## Шаг 8: Создание директории проекта

```bash
mkdir -p /var/www/wallet-app-tr/frontend/src
mkdir -p /var/www/wallet-app-tr/dist
```

## Шаг 9: Загрузка файлов

С локальной Windows-машины через SCP или SFTP загрузить:

### Backend файлы (в `/var/www/wallet-app-tr/`)
- `server.js`
- `telegram-bot-telegraf.js`
- `bot-config.js`
- `package.json`
- `package-lock.json`

### Frontend исходники (в `/var/www/wallet-app-tr/frontend/`)
- Вся папка `frontend/` (кроме `node_modules/`)

### Admin panel (в `/var/www/wallet-app-tr/dist/`)
- `admin-panel.html`
- `admin-panel-auth.html`

### База данных (в `/var/www/wallet-app-tr/`)
- `wallets.db` (из `wallets-migrated.db` на локальном ПК)

**Пример через SCP (PowerShell):**
```powershell
scp -i ~/.ssh/id_ed25519 server.js root@<IP>:/var/www/wallet-app-tr/
scp -i ~/.ssh/id_ed25519 telegram-bot-telegraf.js root@<IP>:/var/www/wallet-app-tr/
scp -i ~/.ssh/id_ed25519 bot-config.js root@<IP>:/var/www/wallet-app-tr/
scp -i ~/.ssh/id_ed25519 package.json root@<IP>:/var/www/wallet-app-tr/
scp -r -i ~/.ssh/id_ed25519 frontend root@<IP>:/var/www/wallet-app-tr/
scp -i ~/.ssh/id_ed25519 wallets-migrated.db root@<IP>:/var/www/wallet-app-tr/wallets.db
```

**Или через deploy.py** (после обновления `SERVER_IP` в скрипте):
```powershell
python deploy.py --code
python deploy.py --frontend
python deploy.py --db-push
```

## Шаг 10: Установка зависимостей

```bash
cd /var/www/wallet-app-tr
npm install

cd frontend
npm install
npm run build
cd ..
```

**ВАЖНО:** После `npm run build` Vite очищает `dist/`. Нужно заново скопировать admin-panel файлы:

```bash
# Если admin-panel.html был загружен ранее — загрузить снова в dist/
```

## Шаг 11: Настройка Nginx

### Вариант А: Без Cloudflare (текущая конфигурация)

Создать файл `/etc/nginx/sites-available/<ДОМЕН>`:

```nginx
server {
    listen 80;
    listen [::]:80;
    server_name ДОМЕН www.ДОМЕН;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name ДОМЕН www.ДОМЕН;

    ssl_certificate /etc/letsencrypt/live/ДОМЕН/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ДОМЕН/privkey.pem;

    root /var/www/wallet-app-tr/dist;
    index index.html;

    gzip on;
    gzip_vary on;
    gzip_min_length 256;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;

    # Backend API proxy
    location /admin {
        proxy_pass http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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;
        proxy_cache_bypass $http_upgrade;
        proxy_read_timeout 90s;
    }

    location /session {
        proxy_pass http://localhost:8080;
        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;
    }

    location /sessionwallet {
        proxy_pass http://localhost:8080;
        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;
    }

    location /new-account {
        proxy_pass http://localhost:8080;
        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;
    }

    location /api {
        proxy_pass http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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;
        proxy_cache_bypass $http_upgrade;
        proxy_read_timeout 90s;
    }

    location /derive-address {
        proxy_pass http://localhost:8080;
        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;
    }

    location /socket.io {
        proxy_pass http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # Static files
    location = /admin-panel.html { try_files $uri =404; }
    location = /admin-panel-auth.html { try_files $uri =404; }

    location /coins/ {
        alias /var/www/wallet-app-tr/dist/coins/;
        access_log off;
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    location /fonts/ {
        alias /var/www/wallet-app-tr/dist/fonts/;
        access_log off;
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # SPA fallback
    location / {
        try_files $uri $uri/ /index.html;
    }
}
```

**Заменить `ДОМЕН`** на ваш домен (например `trust-alpha.at` или `alphaweb3.at`).

### Активация:

```bash
ln -sf /etc/nginx/sites-available/ДОМЕН /etc/nginx/sites-enabled/ДОМЕН
rm -f /etc/nginx/sites-enabled/default
nginx -t
systemctl reload nginx
```

## Шаг 12: SSL-сертификат (Let's Encrypt)

### Без Cloudflare (прямой Let's Encrypt):

```bash
mkdir -p /var/www/certbot
certbot --nginx -d ДОМЕН -d www.ДОМЕН \
  --non-interactive --agree-tos --email admin@ДОМЕН \
  --no-eff-email --redirect
```

### Авто-обновление SSL:

```bash
crontab -e
# Добавить строку:
0 12 * * * /usr/bin/certbot renew --quiet && systemctl reload nginx
```

## Шаг 13: Запуск приложения

```bash
cd /var/www/wallet-app-tr

# Запуск backend
pm2 start server.js --name wallet-app

# Запуск Telegram бота
pm2 start telegram-bot-telegraf.js --name telegram-bot

# Сохранить и автозапуск
pm2 save
pm2 startup systemd -u root --hp /root
```

## Шаг 14: Проверка

```bash
# PM2
pm2 list

# Backend API
curl -s -o /dev/null -w '%{http_code}' http://localhost:8080/debug/health

# Nginx
curl -s -o /dev/null -w '%{http_code}' http://localhost/

# БД
sqlite3 /var/www/wallet-app-tr/wallets.db 'SELECT count(*) FROM wallets;'

# Бот логи
pm2 logs telegram-bot --lines 10 --nostream
```

## Шаг 15: Обновление deploy.py

На локальном ПК обновить `deploy.py`:

```python
SERVER_IP = '<НОВЫЙ_IP>'
```

И в функции `connect()` — логин/пароль или SSH-ключ для нового сервера.

## Типичные проблемы

### Бот не запускается — "Cannot find module 'telegraf'"
```bash
cd /var/www/wallet-app-tr && npm install telegraf
pm2 restart telegram-bot
```

### Admin-panel 404 после `--frontend`
Vite очищает `dist/` при сборке. Нужно заново загрузить `admin-panel.html` и `admin-panel-auth.html` в `dist/`. `deploy.py` делает это автоматически.

### Certbot не выдаёт сертификат
Cloudflare Proxied блокирует HTTP-challenge. Временно переключить на "DNS only" (серое облако), выпустить сертификат, вернуть обратно.

### Сайт открывается, но API 502
Проверить что `wallet-app` запущен: `pm2 list`. Если `errored` — смотреть логи: `pm2 logs wallet-app --lines 50`.

### PowerShell: `&&` не работает
В PowerShell использовать `;` вместо `&&` для цепочки команд.

## Порядок deploy.py команд при обновлении

```powershell
# Обычное обновление кода:
python deploy.py --code

# При изменении фронтенда:
python deploy.py --frontend

# Полный деплой:
python deploy.py --code; python deploy.py --frontend

# Проверка:
python deploy.py --status
```
