main
This commit is contained in:
2
Dockerfile
Normal file
2
Dockerfile
Normal file
@@ -0,0 +1,2 @@
|
||||
FROM nginx:alpine
|
||||
COPY . /usr/share/nginx/html
|
||||
173
README.md
173
README.md
@@ -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
8
docker-compose.yml
Normal 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
385
index.html
Normal 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>
|
||||
Reference in New Issue
Block a user