This commit is contained in:
2026-03-12 12:57:07 +03:00
parent 75180251eb
commit b57162456e
4 changed files with 567 additions and 1 deletions

2
Dockerfile Normal file
View File

@@ -0,0 +1,2 @@
FROM nginx:alpine
COPY . /usr/share/nginx/html

173
README.md
View File

@@ -1,2 +1,173 @@
# My-site
# Сайт-визитка grenu4.ru
Простой сайт-визитка на HTML, работающий в Docker-контейнере.
Сайт проксируется через **Nginx Proxy Manager**, который обеспечивает автоматический SSL-сертификат (Let's Encrypt) и доступ по домену.
## Содержание
- [Технологии](#технологии)
- [Требования](#требования)
- [Быстрый старт](#быстрый-старт)
- [Структура проекта](#структура-проекта)
- [Управление контейнером](#управление-контейнером)
- [Обновление сайта](#обновление-сайта)
- [Интеграция с Nginx Proxy Manager](#интеграция-с-nginx-proxy-manager)
- [Лицензия](#лицензия)
## Технологии
- HTML / CSS / JavaScript (статические файлы)
- Docker + Docker Compose
- Nginx (в качестве веб-сервера внутри контейнера)
- Nginx Proxy Manager (для прокси и SSL)
## Требования
- Сервер с Linux (Ubuntu/Debian рекомендуется)
- Установленные Docker и Docker Compose
- Установленный и настроенный Nginx Proxy Manager (занимает порты 80 и 443)
- Домен, направленный на IP сервера (в примере `grenu4.ru`)
## Быстрый старт
### Клонируйте репозиторий
```bash
git clone https://git.grenu4.ru/y0zhyck/My-Site.git
cd grenu4-site
2. Поместите файлы сайта
В папке проекта уже должен лежать index.html и другие ресурсы (css, js, изображения).
При необходимости замените их своими.
3. Запустите контейнер
Вариант A: через docker-compose (рекомендуется)
bash
docker-compose up -d
Вариант B: через docker run
bash
docker build -t grenu4-site .
docker run -d \
--name site-grenu4 \
-p 5050:80 \
--restart unless-stopped \
grenu4-site
После запуска сайт будет доступен локально на порту 5050:
http://<IP-сервера>:5050
4. Настройте прокси в Nginx Proxy Manager
Откройте веб-интерфейс NPM (обычно http://<IP-сервера>:81)
Добавьте Proxy Host:
Domain: grenu4.ru (и www.grenu4.ru при необходимости)
Scheme: http
Forward Hostname / IP: IP вашего сервера (например, 192.168.1.10)
Если NPM и сайт на одном сервере, можно использовать 127.0.0.1, но убедитесь, что NPM имеет доступ к порту 5050 хоста.
Forward Port: 5050
Во вкладке SSL включите Request a new SSL certificate, укажите email и включите Force SSL.
Через несколько минут сайт станет доступен по https://grenu4.ru
```
### Структура проекта
- Dockerfile # Описание образа на основе nginx:alpine
- docker-compose.yml # (опционально) для управления через compose
- README.md # Этот файл
- index.html # Главная страница
- css/ # Папка со стилями (если есть)
- js/ # Папка со скриптами (если есть)
- img/ # Папка с изображениями (если есть)
### Управление контейнером
```bash
Если используется docker-compose
Управление контейнером
Если используется docker-compose
Запуск / перезапуск после изменений
bash
docker-compose up -d --build
Остановка и удаление контейнера
bash
docker-compose down
Просмотр логов
bash
docker-compose logs -f
Если используется чистый docker
Остановка
bash
docker stop site-grenu4
Удаление
bash
docker rm site-grenu4
Запуск существующего контейнера
bash
docker start site-grenu4
Пересборка и запуск после изменений
bash
docker build -t grenu4-site .
docker rm -f site-grenu4
docker run -d --name site-grenu4 -p 5050:80 --restart unless-stopped grenu4-site
```
### Обновление сайта
```bash
Если вы изменили HTML / CSS / JS, нужно обновить контейнер.
Быстрый способ с docker-compose (пересборка и запуск)
bash
docker-compose up -d --build
Если используется только docker
bash
docker build -t grenu4-site .
docker stop site-grenu4 && docker rm site-grenu4
docker run -d --name site-grenu4 -p 5050:80 --restart unless-stopped grenu4-site
Альтернатива: монтирование папки (для разработки)
Чтобы избежать пересборки при каждом изменении, можно примонтировать локальную папку с файлами внутрь контейнера.
В docker-compose.yml добавьте:
yaml
services:
site:
volumes:
- ./:/usr/share/nginx/html
После этого изменения в файлах будут видны сразу (перезапуск не требуется).
Не используйте это на production без дополнительной оптимизации.
```
### Интеграция с Nginx Proxy Manager
```bash
Ваш контейнер с сайтом не занимает порты 80/443 — они используются NPM.
Вся схема работы:
Пользователь заходит на https://grenu4.ru.
Запрос попадает в NPM (контейнер, слушающий 80/443 на хосте).
NPM по правилу прокси перенаправляет трафик на http://<хост>:5050.
Внутренний контейнер с сайтом отдаёт страницу.
Убедитесь, что порт 5050 на хосте доступен для NPM (обычно NPM и контейнер сайта находятся на одном хосте, поэтому проблем нет).
```
### Лицензия
```bash
Этот проект распространяется под лицензией MIT. Подробнее в файле LICENSE.
Автор: Y0zhyck
Домен: grenu4.ru
Репозиторий: https://git.grenu4.ru/y0zhyck/My-Site.git
```

8
docker-compose.yml Normal file
View File

@@ -0,0 +1,8 @@
version: '3'
services:
site:
build: .
ports:
- "5050:80"
restart: unless-stopped
container_name: site-grenu4

385
index.html Normal file
View File

@@ -0,0 +1,385 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Evgeniy Spirin | DevOps Engineer</title>
<!-- Подключаем шрифт Inter -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,400;14..32,500;14..32,600;14..32,700&display=swap" rel="stylesheet">
<!-- Font Awesome для иконок (бесплатно) -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
<style>
/* Сброс и базовые стили */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Inter', sans-serif;
background-color: #0a0a0a; /* тёмный фон */
color: #f5f5f5;
line-height: 1.6;
padding: 2rem 1rem;
}
.container {
max-width: 1100px;
margin: 0 auto;
background: #111;
border-radius: 24px;
padding: 2.5rem 2rem;
box-shadow: 0 20px 40px rgba(0,0,0,0.6);
}
/* Профиль */
.profile {
display: flex;
flex-wrap: wrap;
gap: 2rem;
align-items: center;
margin-bottom: 3rem;
}
.profile-avatar {
width: 140px;
height: 140px;
border-radius: 50%;
object-fit: cover;
border: 3px solid #3b82f6;
box-shadow: 0 8px 20px rgba(59,130,246,0.3);
}
.profile-info h1 {
font-size: 2.5rem;
font-weight: 700;
letter-spacing: -0.02em;
margin-bottom: 0.25rem;
}
.profile-info .title {
font-size: 1.25rem;
color: #9ca3af;
margin-bottom: 0.5rem;
}
.profile-info .location {
display: flex;
align-items: center;
gap: 0.5rem;
color: #9ca3af;
font-size: 0.95rem;
margin-bottom: 1rem;
}
.profile-info .location i {
color: #3b82f6;
}
.contacts {
display: flex;
flex-wrap: wrap;
gap: 1.5rem;
margin-top: 0.5rem;
}
.contacts a {
color: #f5f5f5;
font-size: 1rem;
text-decoration: none;
display: inline-flex;
align-items: center;
gap: 0.5rem;
transition: color 0.2s;
}
.contacts a:hover {
color: #3b82f6;
}
.contacts i {
font-size: 1.2rem;
}
/* Разделы */
section {
margin-bottom: 2.5rem;
}
h2 {
font-size: 1.8rem;
font-weight: 600;
margin-bottom: 1.5rem;
position: relative;
display: inline-block;
}
h2:after {
content: '';
position: absolute;
left: 0;
bottom: -8px;
width: 60px;
height: 4px;
background: #3b82f6;
border-radius: 2px;
}
/* О себе */
.about p {
font-size: 1.1rem;
color: #d1d5db;
max-width: 800px;
}
/* Навыки (теги) */
.skills-list {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
list-style: none;
}
.skills-list li {
background: #1f2937;
padding: 0.5rem 1.2rem;
border-radius: 40px;
font-size: 0.95rem;
font-weight: 500;
color: #e5e7eb;
border: 1px solid #374151;
transition: 0.2s;
}
.skills-list li:hover {
border-color: #3b82f6;
background: #2d3748;
}
/* Проекты (карточки) */
.projects-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1.5rem;
}
.project-card {
background: #1a1a1a;
border-radius: 16px;
padding: 1.5rem;
border: 1px solid #2a2a2a;
transition: transform 0.2s, border-color 0.2s;
}
.project-card:hover {
transform: translateY(-5px);
border-color: #3b82f6;
}
.project-card h3 {
font-size: 1.25rem;
margin-bottom: 0.75rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.project-card h3 i {
color: #3b82f6;
font-size: 1.4rem;
}
.project-card p {
color: #9ca3af;
font-size: 0.95rem;
margin-bottom: 1rem;
}
.project-tech {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
margin-top: 1rem;
}
.project-tech span {
background: #2d3748;
padding: 0.25rem 0.75rem;
border-radius: 20px;
font-size: 0.8rem;
color: #d1d5db;
}
.project-link {
margin-top: 1.2rem;
display: inline-block;
color: #3b82f6;
text-decoration: none;
font-weight: 500;
}
.project-link i {
transition: transform 0.2s;
}
.project-link:hover i {
transform: translateX(4px);
}
/* Опыт работы */
.experience-item {
display: flex;
flex-wrap: wrap;
gap: 1.5rem;
margin-bottom: 2rem;
padding-bottom: 2rem;
border-bottom: 1px solid #2a2a2a;
}
.experience-item:last-child {
border-bottom: none;
padding-bottom: 0;
}
.exp-date {
min-width: 100px;
font-weight: 600;
color: #3b82f6;
}
.exp-content {
flex: 1;
}
.exp-content h3 {
font-size: 1.3rem;
margin-bottom: 0.25rem;
}
.exp-content .company {
color: #9ca3af;
margin-bottom: 1rem;
display: inline-block;
background: #1f2937;
padding: 0.2rem 1rem;
border-radius: 30px;
font-size: 0.9rem;
}
.exp-duties {
list-style-type: disc;
padding-left: 1.5rem;
color: #d1d5db;
}
.exp-duties li {
margin-bottom: 0.5rem;
}
/* Футер */
.footer-note {
text-align: center;
margin-top: 3rem;
color: #6b7280;
font-size: 0.9rem;
}
/* Адаптация для мобильных */
@media (max-width: 600px) {
.container { padding: 1.5rem; }
.profile { flex-direction: column; text-align: center; }
.profile-info .location { justify-content: center; }
.contacts { justify-content: center; }
h2:after { left: 50%; transform: translateX(-50%); width: 80px; }
.experience-item { flex-direction: column; gap: 0.5rem; }
}
</style>
</head>
<body>
<div class="container">
<!-- Шапка профиля -->
<div class="profile">
<!-- Аватар (замените на своё фото) -->
<img src="https://i.imgur.com/p5kRCHS.jpeg" alt="Avatar" class="profile-avatar">
<div class="profile-info">
<h1>Evgeniy Spirin</h1>
<div class="title">DevOps Engineer</div>
<div class="location">
<i class="fas fa-map-marker-alt"></i> Нижний Новгород, Россия
</div>
<!-- Контакты (замените ссылки) -->
<div class="contacts">
<a href="mailto:oit_vpn@grenu4.ru"><i class="fas fa-envelope"></i> oit_vpn@grenu4.ru</a>
<a href="https://t.me/y0zhyck" target="_blank"><i class="fab fa-telegram"></i> Telegram</a>
<a href="https://git.grenu4.ru/y0zhyck" target="_blank"><i class="fab fa-github"></i> My GIT</a>
</div>
</div>
</div>
<!-- О себе -->
<section class="about">
<h2>О себе</h2>
<p>DevOps Engineer. Увлекаюсь автоматизацией, Kubernetes и Go. Open-source энтузиаст, автор нескольких полезных утилит для мониторинга и оптимизации инфраструктуры. Постоянно изучаю новые технологии и делюсь знаниями с сообществом.</p>
</section>
<!-- Навыки (список можно редактировать) -->
<section>
<h2>Навыки</h2>
<ul class="skills-list">
<li>CI/CD (GitLab CI, GitHub Actions)</li>
<li>Kubernetes</li>
<li>Docker</li>
<li>Terraform</li>
<li>Ansible</li>
<li>Golang</li>
<li>Python</li>
<li>Prometheus / Grafana</li>
<li>Linux</li>
<li>Bash</li>
<li>Helm</li>
<li>Istio</li>
</ul>
</section>
<!-- Проекты (замените на свои) -->
<section>
<h2>Проекты</h2>
<div class="projects-grid">
<!-- Карточка 1 -->
<div class="project-card">
<h3><i class="fas fa-network-wired"></i> Cloud VPN</h3>
<p>Масштабируемый VPN-сервис. Поддержка VLESS, Trojan, Shadowsocks.</p>
<div class="project-tech">
<span>Kubernetes</span>
<span>Xray</span>
<span>Prometheus</span>
</div>
<a href="#" class="project-link">Подробнее <i class="fas fa-arrow-right"></i></a>
</div>
<!-- Карточка 2 -->
<div class="project-card">
<h3><i class="fas fa-coins"></i> K8s Cost Optimizer</h3>
<p>Инструмент для анализа и оптимизации затрат в Kubernetes. Интеграция с AWS, GCP, Azure.</p>
<div class="project-tech">
<span>Golang</span>
<span>Prometheus</span>
<span>Cloud APIs</span>
</div>
<a href="#" class="project-link">Подробнее <i class="fas fa-arrow-right"></i></a>
</div>
<!-- Карточка 3 -->
<div class="project-card">
<h3><i class="fas fa-chart-line"></i> Speedtest Exporter</h3>
<p>Prometheus-экспортер для измерения скорости интернета до множества глобальных точек.</p>
<div class="project-tech">
<span>Golang</span>
<span>Prometheus</span>
<span>Docker</span>
</div>
<a href="#" class="project-link">Подробнее <i class="fas fa-arrow-right"></i></a>
</div>
</div>
</section>
<!-- Опыт работы -->
<section>
<h2>Опыт работы</h2>
<div class="experience-item">
<div class="exp-date">2022 — 2023</div>
<div class="exp-content">
<h3>DevOps Engineer</h3>
<span class="company">Гарда технологии, Москва (гибрид)</span>
<ul class="exp-duties">
<li>Миграция монолитных приложений в Kubernetes, внедрение GitOps (ArgoCD).</li>
<li>Оптимизация CI/CD пайплайнов (сокращение времени сборки на 40%).</li>
<li>Настройка Service Mesh (Istio) для безопасного взаимодействия микросервисов.</li>
<li>Менторство 3 джуниоров, проведение внутренних воркшопов.</li>
</ul>
</div>
</div>
<div class="experience-item">
<div class="exp-date">2023 — настоящее время</div>
<div class="exp-content">
<h3>DevOps Engineer</h3>
<span class="company">Зитех, удалённо</span>
<ul class="exp-duties">
<li>Разработка инфраструктуры на AWS (Terraform, Ansible).</li>
<li>Внедрение мониторинга на базе Prometheus + Grafana, настройка алертов.</li>
<li>Автоматизация резервного копирования баз данных и восстановления.</li>
</ul>
</div>
</div>
</section>
<!-- Небольшой футер -->
<div class="footer-note">
© 2022-2030 Евгений Спирин. Сделано с <i class="fas fa-heart" style="color: #ef4444;"></i> для портфолио.
</div>
</div>
</body>
</html>