# Shop — Интернет-магазин Главная страница интернет-магазина на **Go**, **PostgreSQL 17**, **Docker Compose** и **Caddy** (обратный прокси + SSL). Проект настроен для развёртывания на **Ubuntu 22.04 / 24.04**. ## Стек | Компонент | Технология | |-----------|------------| | Backend | Go 1.23, `net/http`, `pgx/v5` | | База данных | PostgreSQL 17 | | Прокси / SSL | Caddy 2 | | ОС | Ubuntu 22.04 / 24.04 | | Контейнеризация | Docker Compose | ## Быстрый старт на Ubuntu ```bash # Клонировать репозиторий git clone https://git.evilfox.cc/test2/shop-go.git /opt/shop cd /opt/shop # 1. Установить Docker (один раз, с sudo) sudo ./scripts/install-ubuntu.sh # Перелогиниться или: newgrp docker # 2. Запустить магазин chmod +x scripts/*.sh ./scripts/deploy.sh ``` Откройте в браузере: - `http://IP_СЕРВЕРА` — магазин - `http://IP_СЕРВЕРА/admin/login` — админка Или через Make: ```bash make install # sudo, установка Docker make deploy # первый запуск make logs # просмотр логов ``` ## Продакшен с доменом и SSL 1. Настройте DNS: A-запись домена → IP сервера Ubuntu 2. Откройте порты 80 и 443 (скрипт `install-ubuntu.sh` настраивает ufw) 3. Включите SSL: ```bash ./scripts/enable-ssl.sh shop.example.com admin@example.com ``` Или: ```bash make ssl DOMAIN=shop.example.com EMAIL=admin@example.com ``` Caddy автоматически получит сертификат Let's Encrypt. Вручную через `.env`: ```env DOMAIN=shop.example.com CADDY_EMAIL=admin@example.com CADDYFILE=./Caddyfile.prod ``` Затем: `docker compose up -d --force-recreate caddy` ## Автозапуск при загрузке Ubuntu ```bash sudo cp systemd/shop.service /etc/systemd/system/ # Отредактируйте WorkingDirectory, если проект не в /opt/shop sudo systemctl daemon-reload sudo systemctl enable --now shop ``` ## Админ Администратор создаётся автоматически при старте из `.env`: ```env ADMIN_EMAIL=admin@shop.local ADMIN_PASSWORD=change_me SESSION_SECRET=your_random_secret_key_here ``` Скрипт `deploy.sh` генерирует пароли автоматически при первом запуске. Вход: `/admin/login` При изменении `ADMIN_PASSWORD` пароль обновится в БД при следующем запуске. ## Сервисы | Сервис | Порт | Описание | |--------|------|----------| | Caddy | 80, 443 | Обратный прокси, SSL | | App | 8080 (внутри) | Go-приложение | | PostgreSQL | 5432 (внутри) | База данных | ## Обновление на сервере ```bash ./scripts/update.sh # или make update ``` ## Локальная разработка (Ubuntu) ```bash # Только PostgreSQL в Docker docker compose up db -d export DB_HOST=localhost DB_USER=shop DB_PASSWORD=shop_secret DB_NAME=shop export ADMIN_EMAIL=admin@shop.local ADMIN_PASSWORD=change_me go mod tidy go run ./cmd/shop # http://localhost:8080 ``` ## Структура проекта ``` shop/ ├── cmd/shop/main.go ├── internal/ ├── migrations/ ├── scripts/ │ ├── install-ubuntu.sh # установка Docker + ufw │ ├── deploy.sh # первый запуск │ ├── enable-ssl.sh # SSL для домена │ └── update.sh # обновление ├── systemd/shop.service # автозапуск ├── Caddyfile # HTTP (IP / localhost) ├── Caddyfile.prod # HTTPS (домен) ├── docker-compose.yml ├── Makefile └── Dockerfile ``` ## API | Метод | Путь | Описание | |-------|------|----------| | GET | `/` | Главная страница | | GET | `/health` | Health check | | GET | `/static/*` | CSS и статика | | GET | `/admin/login` | Страница входа | | POST | `/admin/login` | Авторизация | | GET | `/admin/` | Админ-панель | | POST | `/admin/logout` | Выход | ## Остановка ```bash docker compose down # С удалением данных БД docker compose down -v ``` ## Требования к серверу Ubuntu - 1 CPU, 1 GB RAM (минимум) - Ubuntu 22.04 или 24.04 LTS - Открытые порты 22 (SSH), 80, 443