diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..e58409d Binary files /dev/null and b/.DS_Store differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7ad8b27 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +venv +*pycache* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..890ccf2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +FROM python:3.10 + +WORKDIR /code + +COPY ./requirements.txt /code/requirements.txt + +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt + +COPY ./app /code/app + +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] \ No newline at end of file diff --git a/app/.DS_Store b/app/.DS_Store new file mode 100644 index 0000000..7d2ad39 Binary files /dev/null and b/app/.DS_Store differ diff --git a/app/main.py b/app/main.py new file mode 100644 index 0000000..ed4693f --- /dev/null +++ b/app/main.py @@ -0,0 +1,105 @@ +from fastapi import FastAPI, Request, HTTPException +from fastapi.responses import HTMLResponse, FileResponse, JSONResponse +from fastapi.staticfiles import StaticFiles +from fastapi.templating import Jinja2Templates +from pydantic import BaseModel, EmailStr +from aiogram import Bot, Dispatcher + +BOT_TOKEN = '7102060229:AAE4SWmgKXkCBC482l8Ble5lKzlCV2YIWnM' +ID = '340394898' + +bot = Bot( # Образ Бота + token=BOT_TOKEN, + ) + +app = FastAPI() + +# Монтирование статических файлов +app.mount("/static", StaticFiles(directory="app/static"), name="static") + +# Инициализация шаблонов +templates = Jinja2Templates(directory="app/templates") + +@app.get("/", response_class=HTMLResponse) +async def read_index(request: Request): + return templates.TemplateResponse("index.html", {"request": request}) + +@app.get("/catalog", response_class=HTMLResponse) +async def read_catalog(request: Request): + return templates.TemplateResponse("catalog.html", {"request": request}) + +@app.get("/about", response_class=HTMLResponse) +async def read_about(request: Request): + return templates.TemplateResponse("about.html", {"request": request}) + +@app.get("/contacts", response_class=HTMLResponse) +async def read_contacts(request: Request): + return templates.TemplateResponse("contacts.html", {"request": request}) + +# Дополнительные маршруты для подразделов каталога +@app.get("/catalog/{filter_type}", response_class=HTMLResponse) +async def read_filter_type(request: Request, filter_type: str): + # Здесь вы можете добавить логику для загрузки конкретных данных о типе фильтра + return templates.TemplateResponse(f"catalog_{filter_type}.html", {"request": request, "filter_type": filter_type}) + +@app.get("/certificates", response_class=HTMLResponse) +async def read_certificates(request: Request): + certificates = [ + { + "title": "Сертификат соответствия", + "description": "Сертификат соответствия", + "image": "/static/img/certificates/сертификат1.png" + }, + { + "title": "Приложение", + "description": "Приложение сертификата соответствия", + "image": "/static/img/certificates/сертификат2.png" + }, + { + "title": "Приложение", + "description": "Приложение сертификата соответствия", + "image": "/static/img/certificates/сертификат3.png" + }, + { + "title": "Приложение", + "description": "Приложение сертификата соответствия", + "image": "/static/img/certificates/сертификат4.png" + }, + # Add more certificates as needed + ] + return templates.TemplateResponse("certificates.html", {"request": request, "certificates": certificates}) + +class ContactForm(BaseModel): + name: str + email: EmailStr + message: str + +@app.post("/submit-form") +async def submit_form(form_data: ContactForm): + try: + # Здесь вы можете добавить логику для сохранения данных в базу данных + # или отправки электронного письма + await send_email(form_data) + return JSONResponse(content={"message": "Form submitted successfully"}, status_code=200) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +async def send_email(form_data: ContactForm): + + body = f""" +Сообщение от wanlanda +Имя: {form_data.name} +Email: {form_data.email} +Сообщение: +{form_data.message} + """ + print(body) + se = await bot.send_message( + ID, + body, + ) + print(se) + +if __name__ == "__main__": + import uvicorn + uvicorn.run(app, host="0.0.0.0", port=8000) \ No newline at end of file diff --git a/app/static/.DS_Store b/app/static/.DS_Store new file mode 100644 index 0000000..d27fe34 Binary files /dev/null and b/app/static/.DS_Store differ diff --git a/app/static/img/.DS_Store b/app/static/img/.DS_Store new file mode 100644 index 0000000..c2ad4e5 Binary files /dev/null and b/app/static/img/.DS_Store differ diff --git a/app/static/img/air-filter.jpg b/app/static/img/air-filter.jpg new file mode 100644 index 0000000..bf7e42f Binary files /dev/null and b/app/static/img/air-filter.jpg differ diff --git a/app/static/img/b1.jpg b/app/static/img/b1.jpg new file mode 100644 index 0000000..ed62dba Binary files /dev/null and b/app/static/img/b1.jpg differ diff --git a/app/static/img/cabin-filter.jpg b/app/static/img/cabin-filter.jpg new file mode 100644 index 0000000..956dc69 Binary files /dev/null and b/app/static/img/cabin-filter.jpg differ diff --git a/app/static/img/certificates/сертификат1.png b/app/static/img/certificates/сертификат1.png new file mode 100644 index 0000000..fc54a9e Binary files /dev/null and b/app/static/img/certificates/сертификат1.png differ diff --git a/app/static/img/certificates/сертификат2.png b/app/static/img/certificates/сертификат2.png new file mode 100644 index 0000000..568e5c0 Binary files /dev/null and b/app/static/img/certificates/сертификат2.png differ diff --git a/app/static/img/certificates/сертификат3.png b/app/static/img/certificates/сертификат3.png new file mode 100644 index 0000000..2391d0f Binary files /dev/null and b/app/static/img/certificates/сертификат3.png differ diff --git a/app/static/img/certificates/сертификат4.png b/app/static/img/certificates/сертификат4.png new file mode 100644 index 0000000..5dc1da9 Binary files /dev/null and b/app/static/img/certificates/сертификат4.png differ diff --git a/app/static/img/fuel-filter.jpg b/app/static/img/fuel-filter.jpg new file mode 100644 index 0000000..607a7b7 Binary files /dev/null and b/app/static/img/fuel-filter.jpg differ diff --git a/app/static/img/oil-filter.jpg b/app/static/img/oil-filter.jpg new file mode 100644 index 0000000..dfe4d33 Binary files /dev/null and b/app/static/img/oil-filter.jpg differ diff --git a/app/static/img/pbanner.jpg b/app/static/img/pbanner.jpg new file mode 100644 index 0000000..e73b473 Binary files /dev/null and b/app/static/img/pbanner.jpg differ diff --git a/app/static/img/salon-filter.jpg b/app/static/img/salon-filter.jpg new file mode 100644 index 0000000..a3dda65 Binary files /dev/null and b/app/static/img/salon-filter.jpg differ diff --git a/app/static/js/main.js b/app/static/js/main.js new file mode 100644 index 0000000..e69de29 diff --git a/app/templates/.DS_Store b/app/templates/.DS_Store new file mode 100644 index 0000000..8067c11 Binary files /dev/null and b/app/templates/.DS_Store differ diff --git a/app/templates/about.html b/app/templates/about.html new file mode 100644 index 0000000..ad0c837 --- /dev/null +++ b/app/templates/about.html @@ -0,0 +1,45 @@ +{% extends "base.html" %} + +{% block title %}О компании - Wanlanda{% endblock %} + + +{% block content %} +

О компании АНТХИЛЛ

+ +
+

Наша компания

+

Компания АНТХИЛЛ является официальным сертифицированным дилером завода-производителя фильтрующих элементов под брендом WANLANDA на территории Сибирского Федерального округа. Применение предлагаемых нами фильтров очень обширное, начиная с легковых/грузовых автомобилей, заканчивая карьерной спецтехникой.

+

Наши фильтры по качеству сравнимы с оригиналами мировых производителей, таких как: Shantui, Shacman, Shaanxi, Howo, KAMA3 и многих других.

+

Склад с большим ассортиментом фильтров в наличии и постоянным торговым запасом. Для заказных позиции осуществляем прямые поставки в кротчайшие сроки.

+

С каждым клиентом мы работаем индивидуально и предлагаем лучшее предложение на рынке!

+
+ +
+

О компании Wanlanda

+

Компания Guanzhou Wanlanda Auto Parts Co. Ltd. была основана в 1989 году. Спустя 35 лет завод является огромным предприятием с передовыми производственными и испытательными мощностями.

+

Wanlanda Filter специализируется на воздушных, салонных, масляных, топливных, фильтрах для всех видов автомобилей и инженерной техники.

+

Для обеспечения высокоэффективной фильтрации и длительного срока службы фильтры Wanlanda производятся строго в соответствии с оригинальными заводскими спецификациями. Все фильтры Wanlanda прошли строгий контроль качества, включая эксперименты по эффективности, испытания на выносливость, испытания на вибрацию и т.д.

+

Компания Wanlanda успешно экспортирует свою продукцию в Южную Америку, на Ближний Восток, Африку, Европу, Центральную и Юго-Восточную Азию, сохраняя оптимальное соотношение конкурентоспособной цены и качества.

+
+ +
+

Наши преимущества

+ +
+ +
+

Надеемся на долговременное и взаимовыгодное сотрудничество!

+
+
+ Получить консультацию +
+{% endblock %} diff --git a/app/templates/base.html b/app/templates/base.html new file mode 100644 index 0000000..93abd45 --- /dev/null +++ b/app/templates/base.html @@ -0,0 +1,105 @@ + + + + + + {% block title %}Wanlanda{% endblock %} + + + + +
+ +
+ +
+ {% block content %}{% endblock %} +
+ + + + + {% block extra_js %}{% endblock %} + + + \ No newline at end of file diff --git a/app/templates/catalog.html b/app/templates/catalog.html new file mode 100644 index 0000000..0fba93b --- /dev/null +++ b/app/templates/catalog.html @@ -0,0 +1,43 @@ +{% extends "base.html" %} + +{% block title %}Каталог - Wanlanda{% endblock %} + +{% block content %} +

Каталог фильтров Wanlanda

+ +
+ +
+

Воздушные фильтры

+ Воздушный фильтр +

Воздушный фильтр является одним из наиболее важных в системе работы тяжелого дизельного двигателя, позволяет двигателю автомобиля «дышать» чистым воздухом. Воздушный фильтр устраняет любой возможный в воздухе сор, включая частицы самой минимальной величины, которые могут навредить двигателю.

+ Подробнее о воздушных фильтрах +
+ + +
+

Масляные фильтры

+ Масляный фильтр +

Двигатель, работающий на грязном масле, проработает недолго. Масляный фильтр задерживает все вредящие двигателю абразивные частицы еще до того, как они могут повлиять на его работу и срок службы. Фильтр должен не просто очищать масло, а делать это эффективно, без создания значительных помех потоку и должен работать продолжительный период времени между заменами масла.

+ Подробнее о масляных фильтрах +
+ + +
+

Топливные фильтры

+ Топливный фильтр +

Топливный фильтр защищает двигатель от попадания в него вместе с топливом грязи, ржавчины и других частиц. При использовании некачественного фильтрующего элемента грязь, влага и ржавчина могут попасть в топливный бак. Топливный фильтр защищает топливную систему от попадания в нее загрязнений и преждевременного вывода из строя инжекторной системы или карбюратора двигателя.

+ Подробнее о топливных фильтрах +
+ + +
+

Салонные фильтры

+ Салонный фильтр +

Салонный фильтр помогает задерживать пыльцу, аллергены, дым, пары и запахи. При регулярной замене салонные фильтры могут помочь уменьшить загрязнение и износ систем отопления, вентиляции и кондиционирования воздуха вашего автомобиля. Таким образом, качественный салонный фильтр в течение всего срока службы транспортного средства будет обеспечивать эффективность работы воздушных систем автомобиля и снижать общие затраты на техническое обслуживание.

+ Подробнее о салонных фильтрах +
+ + +
+{% endblock %} \ No newline at end of file diff --git a/app/templates/catalog_air-filters.html b/app/templates/catalog_air-filters.html new file mode 100644 index 0000000..87166c3 --- /dev/null +++ b/app/templates/catalog_air-filters.html @@ -0,0 +1,28 @@ +{% extends "base.html" %} + +{% block title %}Воздушные фильтры - Wanlanda{% endblock %} + +{% block content %} +

Воздушные фильтры Wanlanda

+ +
+ Воздушный фильтр Wanlanda +

Воздушные фильтры Wanlanda обеспечивают максимальную защиту двигателя от пыли, грязи и других загрязняющих частиц, содержащихся в воздухе. Наши фильтры разработаны с использованием передовых технологий фильтрации, что гарантирует оптимальную производительность и долговечность двигателя.

+

Преимущества воздушных фильтров Wanlanda:

+ +

Применение:

+

Наши воздушные фильтры подходят для широкого спектра автомобилей, грузовиков и промышленной техники. Используйте каталог подбора на нашем сайте, чтобы найти подходящий фильтр для вашего транспортного средства.

+
+ +
+

Нужна помощь в выборе?

+

Наши специалисты готовы помочь вам подобрать оптимальный воздушный фильтр для вашего автомобиля или оборудования.

+ Связаться с нами +
+{% endblock %} \ No newline at end of file diff --git a/app/templates/catalog_cabin-filters.html b/app/templates/catalog_cabin-filters.html new file mode 100644 index 0000000..b632e82 --- /dev/null +++ b/app/templates/catalog_cabin-filters.html @@ -0,0 +1,28 @@ +{% extends "base.html" %} + +{% block title %}Салонные фильтры - Wanlanda{% endblock %} + +{% block content %} +

Салонные фильтры Wanlanda

+ +
+ Салонный фильтр Wanlanda +

Салонные фильтры Wanlanda обеспечивают чистоту и свежесть воздуха в салоне автомобиля. Наши фильтры эффективно удаляют пыль, пыльцу, бактерии и неприятные запахи, создавая комфортную и здоровую атмосферу для водителя и пассажиров.

+

Преимущества салонных фильтров Wanlanda:

+ +

Применение:

+

Салонные фильтры Wanlanda подходят для большинства современных легковых автомобилей и легких коммерческих транспортных средств. Используйте наш онлайн-каталог для подбора фильтра, соответствующего вашей модели автомобиля.

+
+ +
+

Заботитесь о чистоте воздуха в салоне?

+

Наши эксперты помогут вам выбрать оптимальный салонный фильтр для вашего автомобиля и дадут рекомендации по его обслуживанию.

+ Получить консультацию +
+{% endblock %} \ No newline at end of file diff --git a/app/templates/catalog_fuel-filters.html b/app/templates/catalog_fuel-filters.html new file mode 100644 index 0000000..e820075 --- /dev/null +++ b/app/templates/catalog_fuel-filters.html @@ -0,0 +1,28 @@ +{% extends "base.html" %} + +{% block title %}Топливные фильтры - Wanlanda{% endblock %} + +{% block content %} +

Топливные фильтры Wanlanda

+ +
+ Топливный фильтр Wanlanda +

Топливные фильтры Wanlanda обеспечивают высочайший уровень защиты топливной системы от загрязнений и воды. Наши фильтры гарантируют чистоту топлива, поступающего в двигатель, что способствует его оптимальной работе и долговечности.

+

Преимущества топливных фильтров Wanlanda:

+ +

Применение:

+

Топливные фильтры Wanlanda разработаны для использования в легковых и грузовых автомобилях, спецтехнике и промышленном оборудовании. Воспользуйтесь нашим каталогом для подбора фильтра, соответствующего вашему транспортному средству или оборудованию.

+
+ +
+

Нужна помощь в выборе?

+

Наши специалисты готовы помочь вам подобрать оптимальный топливный фильтр для вашего автомобиля или оборудования.

+ Связаться с нами +
+{% endblock %} \ No newline at end of file diff --git a/app/templates/catalog_oil-filters.html b/app/templates/catalog_oil-filters.html new file mode 100644 index 0000000..e7faf89 --- /dev/null +++ b/app/templates/catalog_oil-filters.html @@ -0,0 +1,30 @@ +{% extends "base.html" %} + +{% block title %}Масляные фильтры - Wanlanda{% endblock %} + +{% block content %} +

Масляные фильтры Wanlanda

+ +
+
+ Масляный фильтр Wanlanda +
+

Масляные фильтры Wanlanda разработаны для обеспечения максимальной защиты двигателя от вредных примесей в масле. Наши фильтры эффективно удаляют металлические частицы, сажу и другие загрязнения, поддерживая чистоту масла и продлевая срок службы двигателя.

+

Преимущества масляных фильтров Wanlanda:

+ +

Применение:

+

Масляные фильтры Wanlanda подходят для легковых и грузовых автомобилей, а также промышленного оборудования. Используйте наш онлайн-каталог для подбора фильтра, соответствующего вашему двигателю.

+
+ +
+

Нужна консультация?

+

Наши эксперты готовы ответить на ваши вопросы и помочь с выбором оптимального масляного фильтра.

+ Получить консультацию +
+{% endblock %} \ No newline at end of file diff --git a/app/templates/certificates.html b/app/templates/certificates.html new file mode 100644 index 0000000..4dcfb42 --- /dev/null +++ b/app/templates/certificates.html @@ -0,0 +1,17 @@ +{% extends "base.html" %} +{% block title %}Сертификаты - Wanlanda{% endblock %} +{% block content %} + +

Сертификаты

+ +
+ {% for certificate in certificates %} +
+ {{ certificate.title }} +

{{ certificate.title }}

+ +
+ {% endfor %} +
+ +{% endblock %} \ No newline at end of file diff --git a/app/templates/contacts.html b/app/templates/contacts.html new file mode 100644 index 0000000..a2c0ddb --- /dev/null +++ b/app/templates/contacts.html @@ -0,0 +1,76 @@ +{% extends "base.html" %} + +{% block title %}Контакты - Wanlanda{% endblock %} + +{% block content %} +

Контакты

+ +
+
+

Контактная информация

+

Адрес: г. Новокузнецк, ул. Тольятти, д. 5Б, пом. 10

+

Телефон: +7 (905) 906-84-65

+

Email: anthillsib@gmail.com

+

Часы работы

+

Пн-Пт: 9:00 - 18:00

+ +

Сб, Вс: выходной

+
+ +
+

Напишите нам

+ +
+
+ + +
+
+ + +
+
+ + +
+ +
+ + +
+
+ + +{% endblock %} \ No newline at end of file diff --git a/app/templates/index.html b/app/templates/index.html new file mode 100644 index 0000000..a7e30b2 --- /dev/null +++ b/app/templates/index.html @@ -0,0 +1,172 @@ +{% extends "base.html" %} + +{% block title %}Главная - Wanlanda{% endblock %} + +{% block content %} + +
+
+ Wanlanda фильтры + +
+ +
+ + +
+
+

Наши преимущества

+
+
+ +

Эксклюзивное представительство Wanlanda в Сибири

+
+
+ +

Оперативная доставка по всей Сибири

+
+
+ +

Широкий ассортимент фильтров

+
+
+ +

Гарантия качества на продукцию

+
+
+ +

Собственный склад с большим запасом товаров

+
+
+ +

Ответственная поддержка менеджеров

+
+
+
+
+ + +
+

Типы фильтров Wanlanda

+
+
+ Воздушный фильтр +

Воздушные фильтры

+

Очищают воздух, поступающий в двигатель, от пыли и других загрязнений.

+ Подробнее +
+
+ Масляный фильтр +

Масляные фильтры

+

Очищают масло от абразивных частиц, продлевая срок службы двигателя.

+ Подробнее +
+
+ Топливный фильтр +

Топливные фильтры

+

Защищают двигатель от загрязнений в топливе, обеспечивая его эффективную работу.

+ Подробнее +
+
+ Салонный фильтр +

Салонные фильтры

+

Очищают воздух в салоне от пыльцы, аллергенов и других загрязнений.

+ Подробнее +
+
+
+ Смотреть все фильтры +
+
+ + +
+

О компании

+
+
+

АНТХИЛЛ - официальный дилер Wanlanda в Сибири

+

Компания АНТХИЛЛ является первым официальным сертифицированным дилером завода-производителя фильтрующих элементов под брендом WANLANDA на территории Сибирского Федерального округа.

+

Применение предлагаемых нами фильтров очень обширное, начиная легковых/грузовых автомобилей, заканчивая карьерной спецтехникой. Наши фильтры по качеству сравнимы с оригиналами мировых производителей, таких как: Shantui, Shacman, Shaanxi, Howo, KAMA3 и многих других.

+
+
+

Wanlanda

+

Компания Guanzhou Wanlanda Auto Parts Co. Ltd. была основана в 1989 году. Спустя 35 лет завод является огромным предприятием с передовыми производственными и испытательными мощностями. + Wanlanda Filter специализируется на воздушных, салонных, масляных, топливных, фильтрах для всех видов автомобилей и инженерной техники. +

+

+ Для обеспечения высокоэффективной фильтрации и длительного срока службы фильтры Wanlanda производятся строго в соответствии с оригинальными заводскими спецификациями. +

+
+
+
+ + + + + +
+

Свяжитесь с нами

+
+
+

Контактная информация

+

Адрес: г. Новокузнецк, ул. Тольятти, д. 5Б, пом. 10

+

Телефон: +7 (905) 906-84-65

+

Email: anthillsib@gmail.com

+
+
+

Часы работы

+

Пн-Пт: 9:00 - 18:00

+ +

Сб, Вс: выходной

+
+
+ Получить консультацию +
+ +
+
+{% endblock %} + +{% block extra_js %} + +{% endblock %} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..70b5b09 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,56 @@ +version: '3' +services: + web: + build: . + expose: + - "8000" + # networks: + # - app-network + + nginx: + image: nginx:alpine + ports: + - "80:80" + - "443:443" + volumes: + - ./nginx.conf:/etc/nginx/nginx.conf:ro + - ./certbot/conf:/etc/letsencrypt + - ./certbot/www:/var/www/certbot + depends_on: + - web + # networks: + # - app-network + # command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'" + + certbot: + image: certbot/certbot + volumes: + - ./certbot/conf:/etc/letsencrypt + - ./certbot/www:/var/www/certbot + depends_on: + - nginx + # networks: + # - app-network + # entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew --quiet; sleep 24 & wait $${!}; done;'" + +# networks: +# app-network: +# driver: bridge + + +# version: '3' + +# services: +# web: +# build: . +# ports: +# - "8000:8000" + +# nginx: +# image: nginx:alpine +# ports: +# - "80:80" +# volumes: +# - ./nginx.conf:/etc/nginx/nginx.conf:ro +# depends_on: +# - web \ No newline at end of file diff --git a/init-letsencrypt.sh b/init-letsencrypt.sh new file mode 100755 index 0000000..fd9ffc5 --- /dev/null +++ b/init-letsencrypt.sh @@ -0,0 +1,72 @@ +#!/bin/bash + +domains=(wanlanda.ru www.wanlanda.ru) +rsa_key_size=4096 +data_path="./certbot" +email="ilya_zahvatkin@sybiko.ru" # Adding a valid address is strongly recommended +staging=0 # Set to 1 if you're testing your setup to avoid hitting request limits + +if [ -d "$data_path" ]; then + read -p "Existing data found for $domains. Continue and replace existing certificate? (y/N) " decision + if [ "$decision" != "Y" ] && [ "$decision" != "y" ]; then + exit + fi +fi + +if [ ! -e "$data_path/conf/options-ssl-nginx.conf" ] || [ ! -e "$data_path/conf/ssl-dhparams.pem" ]; then + echo "### Downloading recommended TLS parameters ..." + mkdir -p "$data_path/conf" + curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf > "$data_path/conf/options-ssl-nginx.conf" + curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem > "$data_path/conf/ssl-dhparams.pem" + echo +fi + +echo "### Creating dummy certificate for $domains ..." +path="/etc/letsencrypt/live/$domains" +mkdir -p "$data_path/conf/live/$domains" +docker-compose run --rm --entrypoint "\ + openssl req -x509 -nodes -newkey rsa:$rsa_key_size -days 1\ + -keyout '$path/privkey.pem' \ + -out '$path/fullchain.pem' \ + -subj '/CN=localhost'" certbot +echo + +echo "### Starting nginx ..." +docker-compose up --force-recreate -d nginx +echo + +echo "### Deleting dummy certificate for $domains ..." +docker-compose run --rm --entrypoint "\ + rm -Rf /etc/letsencrypt/live/$domains && \ + rm -Rf /etc/letsencrypt/archive/$domains && \ + rm -Rf /etc/letsencrypt/renewal/$domains.conf" certbot +echo + +echo "### Requesting Let's Encrypt certificate for $domains ..." +#Join $domains to -d args +domain_args="" +for domain in "${domains[@]}"; do + domain_args="$domain_args -d $domain" +done + +# Select appropriate email arg +case "$email" in + "") email_arg="--register-unsafely-without-email" ;; + *) email_arg="--email $email" ;; +esac + +# Enable staging mode if needed +if [ $staging != "0" ]; then staging_arg="--staging"; fi + +docker-compose run --rm --entrypoint "\ + certbot certonly --webroot -w /var/www/certbot \ + $staging_arg \ + $email_arg \ + $domain_args \ + --rsa-key-size $rsa_key_size \ + --agree-tos \ + --force-renewal" certbot +echo + +echo "### Reloading nginx ..." +docker-compose exec nginx nginx -s reload \ No newline at end of file diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..b00e9d2 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,56 @@ +events { + worker_connections 1024; +} + +http { + server { + listen 80; + server_name wanlanda.ru www.wanlanda.ru; + + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location / { + return 301 https://$host$request_uri; + } + } + + server { + listen 443 ssl; + server_name wanlanda.ru www.wanlanda.ru; + + ssl_certificate /etc/letsencrypt/live/wanlanda.ru/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/wanlanda.ru/privkey.pem; + + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + location / { + proxy_pass http://web:8000; + 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; + } + } +} + +# events { +# worker_connections 1024; +# } + +# http { +# server { +# listen 80; +# server_name localhost; + +# location / { +# proxy_pass http://web:8000; +# 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; +# } +# } +# } \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a1f4700 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,108 @@ +aiofiles==23.2.1 +aiogram==3.10.0 +aiohttp==3.9.5 +aioredis==2.0.1 +aiosignal==1.3.1 +aiosqlite==0.17.0 +annotated-types==0.7.0 +anyio==4.4.0 +appnope==0.1.4 +asttokens==2.4.1 +async-timeout==4.0.3 +attrs==23.2.0 +Babel==2.15.0 +bcrypt==4.1.3 +beautifulsoup4==4.12.3 +bs4==0.0.2 +certifi==2024.7.4 +cffi==1.16.0 +charset-normalizer==3.3.2 +click==8.1.7 +comm==0.2.2 +cryptography==43.0.0 +databases==0.9.0 +debugpy==1.8.2 +decorator==5.1.1 +dnspython==2.6.1 +ecdsa==0.19.0 +email_validator==2.2.0 +exceptiongroup==1.2.2 +executing==2.0.1 +fastapi==0.111.1 +fastapi-admin==1.0.4 +fastapi-cli==0.0.4 +frozenlist==1.4.1 +greenlet==3.0.3 +h11==0.14.0 +httpcore==1.0.5 +httptools==0.6.1 +httpx==0.27.0 +idna==3.7 +ipykernel==6.29.5 +ipython==8.26.0 +iso8601==1.1.0 +itsdangerous==2.2.0 +jedi==0.19.1 +Jinja2==3.1.4 +jupyter_client==8.6.2 +jupyter_core==5.7.2 +magic-filter==1.0.12 +markdown-it-py==3.0.0 +MarkupSafe==2.1.5 +matplotlib-inline==0.1.7 +mdurl==0.1.2 +multidict==6.0.5 +nest-asyncio==1.6.0 +numpy==2.0.1 +orjson==3.10.6 +packaging==24.1 +pandas==2.2.2 +parso==0.8.4 +passlib==1.7.4 +pendulum==3.0.0 +pexpect==4.9.0 +platformdirs==4.2.2 +prompt_toolkit==3.0.47 +psutil==6.0.0 +ptyprocess==0.7.0 +pure_eval==0.2.3 +pyasn1==0.6.0 +pycparser==2.22 +pydantic==2.8.2 +pydantic-extra-types==2.9.0 +pydantic-settings==2.3.4 +pydantic_core==2.20.1 +Pygments==2.18.0 +pypika-tortoise==0.1.6 +python-dateutil==2.9.0.post0 +python-dotenv==1.0.1 +python-jose==3.3.0 +python-multipart==0.0.9 +pytz==2024.1 +PyYAML==6.0.1 +pyzmq==26.0.3 +requests==2.32.3 +rich==13.7.1 +rsa==4.9 +shellingham==1.5.4 +six==1.16.0 +sniffio==1.3.1 +soupsieve==2.5 +SQLAlchemy==2.0.31 +stack-data==0.6.3 +starlette==0.37.2 +time-machine==2.14.2 +tornado==6.4.1 +tortoise-orm==0.21.5 +traitlets==5.14.3 +typer==0.12.3 +typing_extensions==4.12.2 +tzdata==2024.1 +ujson==5.10.0 +urllib3==2.2.2 +uvicorn==0.30.3 +uvloop==0.19.0 +watchfiles==0.22.0 +wcwidth==0.2.13 +websockets==12.0 +yarl==1.9.4 diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..e69de29