Merge branch 'dev' into ui

This commit is contained in:
Jordan Blasenhauer 2023-12-19 17:21:09 +01:00
commit 0945f2052e
86 changed files with 1752 additions and 569 deletions

View file

@ -35,12 +35,12 @@ jobs:
python -m pip install --no-cache-dir --require-hashes -r src/common/db/requirements.txt
echo "CODEQL_PYTHON=$(which python)" >> $GITHUB_ENV
- name: Initialize CodeQL
uses: github/codeql-action/init@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8
uses: github/codeql-action/init@305f6546310b9203e892c28c1484e82977f4f63d # v2.22.10
with:
languages: ${{ matrix.language }}
config-file: ./.github/codeql.yml
setup-python-dependencies: false
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8
uses: github/codeql-action/analyze@305f6546310b9203e892c28c1484e82977f4f63d # v2.22.10
with:
category: "/language:${{matrix.language}}"

View file

@ -23,7 +23,7 @@ jobs:
with:
name: BunkerWeb_documentation_v${{ inputs.VERSION }}.pdf
# Create tag
- uses: rickstaa/action-create-tag@861755f3fcbce1b21a65c17bad10e7d35c27b6d9 # v1.7.1
- uses: rickstaa/action-create-tag@a1c7777fcb2fee4f19b0f283ba888afa11678b72 # v1.7.2
name: Create tag
if: inputs.VERSION != 'testing'
with:
@ -31,7 +31,7 @@ jobs:
message: "v${{ inputs.VERSION }}"
force_push_tag: true
# Create tag
- uses: rickstaa/action-create-tag@861755f3fcbce1b21a65c17bad10e7d35c27b6d9 # v1.7.1
- uses: rickstaa/action-create-tag@a1c7777fcb2fee4f19b0f283ba888afa11678b72 # v1.7.2
name: Create tag
if: inputs.VERSION == 'testing'
with:

View file

@ -42,7 +42,7 @@ jobs:
- name: Check out repository code
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Install ruby
uses: ruby/setup-ruby@8575951200e472d5f2d95c625da0c7bec8217c42 # v1.161.0
uses: ruby/setup-ruby@af848b40be8bb463a751551a1180d74782ba8a72 # v1.162.0
with:
ruby-version: "3.0"
- name: Install packagecloud

View file

@ -25,6 +25,6 @@ jobs:
results_format: sarif
publish_results: true
- name: "Upload SARIF results to code scanning"
uses: github/codeql-action/upload-sarif@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8
uses: github/codeql-action/upload-sarif@305f6546310b9203e892c28c1484e82977f4f63d # v2.22.10
with:
sarif_file: results.sarif

1
.gitignore vendored
View file

@ -6,3 +6,4 @@ env
node_modules
/src/ui/*.txt
.mypy_cache
.cache/

View file

@ -2,8 +2,10 @@
## v1.5.5 - YYYY/MM/DD
- [BUGFIX] Fix issues with the database when upgrading from version 1.5.3 and 1.5.4 to the most recent version
- [FEATURE] Add Anonymous reporting feature
- [MISC] Updated ModSecurity to v3.0.11
- [FEATURE] Add support for fallback Referrer-Policies
- [DEPS] Updated ModSecurity to v3.0.11
## v1.5.4 - 2023/12/04

239
README.md
View file

@ -1,5 +1,5 @@
<p align="center">
<img alt="BunkerWeb logo" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.3/misc/logo.png" />
<img alt="BunkerWeb logo" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.4/misc/logo.png" />
</p>
<p align="center">
@ -18,39 +18,23 @@
</p>
<p align="center">
<<<<<<< Updated upstream
🌐 <a href="https://www.bunkerweb.io">Website</a>
🌐 <a href="https://www.bunkerweb.io/?utm_campaign=self&utm_source=github">Website</a>
&#124;
📓 <a href="https://docs.bunkerweb.io">Documentation</a>
🤝 <a href="https://panel.bunkerweb.io/?utm_campaign=self&utm_source=github">Panel</a>
&#124;
👨‍💻 <a href="https://demo.bunkerweb.io">Demo</a>
📓 <a href="https://docs.bunkerweb.io/?utm_campaign=self&utm_source=github">Documentation</a>
&#124;
🛡️ <a href="https://github.com/bunkerity/bunkerweb/raw/v1.5.3/examples">Examples</a>
=======
🌐 <a href="https://www.bunkerweb.io?utm_campaign=self&utm_source=github">Website</a>
&#124;
📓 <a href="https://docs.bunkerweb.io?utm_campaign=self&utm_source=github">Documentation</a>
&#124;
👨‍💻 <a href="https://demo.bunkerweb.io?utm_campaign=self&utm_source=github">Demo</a>
&#124;
🤝 <a href="https://panel.bunkerweb.io?utm_campaign=self&utm_source=github">Panel</a>
👨‍💻 <a href="https://demo.bunkerweb.io/?utm_campaign=self&utm_source=github">Demo</a>
&#124;
🛡️ <a href="https://github.com/bunkerity/bunkerweb/raw/v1.5.4/examples">Examples</a>
>>>>>>> Stashed changes
&#124;
💬 <a href="https://discord.com/invite/fTf46FmtyD">Chat</a>
&#124;
📝 <a href="https://github.com/bunkerity/bunkerweb/discussions">Forum</a>
<br/>
<<<<<<< Updated upstream
⚙️ <a href="https://config.bunkerweb.io">Configurator</a>
⚙️ <a href="https://config.bunkerweb.io/?utm_campaign=self&utm_source=github">Configurator</a>
&#124;
🗺️ <a href="https://threatmap.bunkerweb.io">Threatmap</a>
=======
⚙️ <a href="https://config.bunkerweb.io?utm_campaign=self&utm_source=github">Configurator</a>
&#124;
🗺️ <a href="https://threatmap.bunkerweb.io?utm_campaign=self&utm_source=github">Threatmap</a>
>>>>>>> Stashed changes
🗺️ <a href="https://threatmap.bunkerweb.io/?utm_campaign=self&utm_source=github">Threatmap</a>
</p>
> 🛡️ Make security by default great again !
@ -58,28 +42,14 @@
# BunkerWeb
<p align="center">
<img alt="Overview banner" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.3/docs/assets/img/intro-overview.svg" />
<img alt="Overview banner" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.4/docs/assets/img/intro-overview.svg" />
</p>
BunkerWeb is a next-generation and open-source Web Application Firewall (WAF).
<<<<<<< Updated upstream
Being a full-featured web server (based on [NGINX](https://nginx.org/) under the hood), it will protect your web services to make them "secure by default". BunkerWeb integrates seamlessly into your existing environments ([Linux](https://docs.bunkerweb.io/1.5.3/integrations/#linux), [Docker](https://docs.bunkerweb.io/1.5.3/integrations/#docker), [Swarm](https://docs.bunkerweb.io/1.5.3/integrations/#swarm), [Kubernetes](https://docs.bunkerweb.io/1.5.3/integrations/#kubernetes), …) and is fully configurable (don't panic, there is an [awesome web UI](https://docs.bunkerweb.io/1.5.3/web-ui/) if you don't like the CLI) to meet your own use-cases . In other words, cybersecurity is no more a hassle.
Being a full-featured web server (based on [NGINX](https://nginx.org/) under the hood), it will protect your web services to make them "secure by default". BunkerWeb integrates seamlessly into your existing environments ([Linux](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#linux), [Docker](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#docker), [Swarm](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#swarm), [Kubernetes](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#kubernetes), …) and is fully configurable (don't panic, there is an [awesome web UI](https://docs.bunkerweb.io/1.5.4/web-ui/?utm_campaign=self&utm_source=github) if you don't like the CLI) to meet your own use-cases . In other words, cybersecurity is no more a hassle.
BunkerWeb contains primary [security features](https://docs.bunkerweb.io/1.5.3/security-tuning/) as part of the core but can be easily extended with additional ones thanks to a [plugin system](https://docs.bunkerweb.io/1.5.3/plugins/).
## Why BunkerWeb ?
- **Easy integration into existing environments** : support for Linux, Docker, Swarm, Kubernetes, Ansible, Vagrant, ...
- **Highly customizable** : enable, disable and configure features easily to meet your use case
- **Secure by default** : offers out-of-the-box and hassle-free minimal security for your web services
- **Awesome web UI** : keep control of everything more efficiently without the need of the CLI
- **Plugin system** : extend BunkerWeb to meet your own use-cases
- **Free as in "freedom"** : licensed under the free [AGPLv3 license](https://www.gnu.org/licenses/agpl-3.0.en.html)
=======
Being a full-featured web server (based on [NGINX](https://nginx.org/) under the hood), it will protect your web services to make them "secure by default". BunkerWeb integrates seamlessly into your existing environments ([Linux](https://docs.bunkerweb.io/1.5.4/integrations/#linux?utm_campaign=self&utm_source=github), [Docker](https://docs.bunkerweb.io/1.5.4/integrations/#docker?utm_campaign=self&utm_source=github), [Swarm](https://docs.bunkerweb.io/1.5.4/integrations/#swarm?utm_campaign=self&utm_source=github), [Kubernetes](https://docs.bunkerweb.io/1.5.4/integrations/#kubernetes?utm_campaign=self&utm_source=github), …) and is fully configurable (don't panic, there is an [awesome web UI](https://docs.bunkerweb.io/1.5.4/web-ui?utm_campaign=self&utm_source=github) if you don't like the CLI) to meet your own use-cases . In other words, cybersecurity is no more a hassle.
BunkerWeb contains primary [security features](https://docs.bunkerweb.io/1.5.4/security-tuning?utm_campaign=self&utm_source=github) as part of the core but can be easily extended with additional ones thanks to a [plugin system](https://docs.bunkerweb.io/1.5.4/plugins?utm_campaign=self&utm_source=github).
BunkerWeb contains primary [security features](https://docs.bunkerweb.io/1.5.4/security-tuning/?utm_campaign=self&utm_source=github) as part of the core but can be easily extended with additional ones thanks to a [plugin system](https://docs.bunkerweb.io/1.5.4/plugins/?utm_campaign=self&utm_source=github).
## Why BunkerWeb ?
@ -89,8 +59,7 @@ BunkerWeb contains primary [security features](https://docs.bunkerweb.io/1.5.4/s
- **Awesome web UI** : Take control of BunkerWeb more efficiently with the exceptional web user interface (UI). Navigate settings and configurations effortlessly through a user-friendly graphical interface, eliminating the need for the command-line interface (CLI).
- **Plugin system** : Extend the capabilities of BunkerWeb to meet your own use cases. Seamlessly integrate additional security measures and customize the functionality of BunkerWeb according to your specific requirements.
- **Free as in "freedom"** : BunkerWeb is licensed under the free [AGPLv3 license](https://www.gnu.org/licenses/agpl-3.0.en.html), embracing the principles of freedom and openness. Enjoy the freedom to use, modify, and distribute the software, backed by a supportive community.
- **Professional services** : Get technical support, tailored consulting and custom development directly from the maintainers of BunkerWeb. Visit the [Bunker Panel](https://panel.bunkerweb.io?utm_campaign=self&utm_source=github) for more information.
>>>>>>> Stashed changes
- **Professional services** : Get technical support, tailored consulting and custom development directly from the maintainers of BunkerWeb. Visit the [Bunker Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=github) for more information.
## Security features
@ -105,11 +74,7 @@ A non-exhaustive list of security features :
- **Block known bad IPs** with external blacklists and DNSBL
- And much more ...
<<<<<<< Updated upstream
Learn more about the core security features in the [security tuning](https://docs.bunkerweb.io/1.5.3/security-tuning/) section of the documentation.
=======
Learn more about the core security features in the [security tuning](https://docs.bunkerweb.io/1.5.4/security-tuning?utm_campaign=self&utm_source=github) section of the documentation.
>>>>>>> Stashed changes
Learn more about the core security features in the [security tuning](https://docs.bunkerweb.io/1.5.4/security-tuning/?utm_campaign=self&utm_source=github) section of the documentation.
## Demo
@ -117,30 +82,41 @@ Learn more about the core security features in the [security tuning](https://doc
<a href="https://www.youtube.com/watch?v=ZhYV-QELzA4" target="_blank"><img alt="BunkerWeb demo" src="https://img.youtube.com/vi/ZhYV-QELzA4/0.jpg" /></a>
</p>
A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io?utm_campaign=self&utm_source=github). Feel free to visit it and perform some security tests.
A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io/?utm_campaign=self&utm_source=github). Feel free to visit it and perform some security tests.
<<<<<<< Updated upstream
=======
## Professional services
Get the most of BunkerWeb by getting professional services directly from the maintainers of the project. From technical support to tailored consulting and development, we are here to assist you in the security of your web services.
Maximize your BunkerWeb experience by getting professional services directly from the maintainers of the project. Whether you require technical support, personalized consulting, or development services, we stand ready to assist you in fortifying the security of your web services.
You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io?utm_campaign=self&utm_source=github), our dedicated platform for professional services.
You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=github), our dedicated platform for professional services.
Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=github) if you have any question, we will be more than happy to respond to your needs.
>>>>>>> Stashed changes
## Ecosystem, community and resources
Official websites, tools and resources about BunkerWeb :
- [**Website**](https://www.bunkerweb.io/?utm_campaign=self&utm_source=github) : get more information, news and articles about BunkerWeb
- [**Panel**](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=github) : dedicated platform to order and manage professional services (e.g. technical support) around BunkerWeb
- [**Documentation**](https://docs.bunkerweb.io/?utm_campaign=self&utm_source=github) : technical documentation of the BunkerWeb solution
- [**Demo**](https://demo.bunkerweb.io/?utm_campaign=self&utm_source=github) : demonstration website of BunkerWeb, don't hesitate to attempt attacks to test the robustness of the solution
- [**Configurator**](https://config.bunkerweb.io/?utm_campaign=self&utm_source=github) : user-friendly tool to help you configure BunkerWeb
- [**Threatmap**](https://threatmap.bunkerweb.io/?utm_campaign=self&utm_source=github) : live cyber attack blocked by BunkerWeb instances all around the world
Community and social networks :
- [**Discord**](https://discord.com/invite/fTf46FmtyD)
- [**LinkedIn**](https://www.linkedin.com/company/bunkerity/)
- [**Twitter**](https://twitter.com/bunkerity)
- [**Reddit**](https://www.reddit.com/r/BunkerWeb/)
# Concepts
<p align="center">
<img alt="Concepts banner" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.3/docs/assets/img/concepts.svg" />
<img alt="Concepts banner" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.4/docs/assets/img/concepts.svg" />
</p>
<<<<<<< Updated upstream
You will find more information about the key concepts of BunkerWeb in the [documentation](https://docs.bunkerweb.io/1.5.3/concepts).
=======
You will find more information about the key concepts of BunkerWeb in the [documentation](https://docs.bunkerweb.io/1.5.4/concepts?utm_campaign=self&utm_source=github).
>>>>>>> Stashed changes
You will find more information about the key concepts of BunkerWeb in the [documentation](https://docs.bunkerweb.io/1.5.4/concepts/?utm_campaign=self&utm_source=github).
## Integrations
@ -148,23 +124,13 @@ The first concept is the integration of BunkerWeb into the target environment. W
The following integrations are officially supported :
<<<<<<< Updated upstream
- [Docker](https://docs.bunkerweb.io/1.5.3/integrations/#docker)
- [Docker autoconf](https://docs.bunkerweb.io/1.5.3/integrations/#docker-autoconf)
- [Swarm](https://docs.bunkerweb.io/1.5.3/integrations/#swarm)
- [Kubernetes](https://docs.bunkerweb.io/1.5.3/integrations/#kubernetes)
- [Linux](https://docs.bunkerweb.io/1.5.3/integrations/#linux)
- [Ansible](https://docs.bunkerweb.io/1.5.3/integrations/#ansible)
- [Vagrant](https://docs.bunkerweb.io/1.5.3/integrations/#vagrant)
=======
- [Docker](https://docs.bunkerweb.io/1.5.4/integrations/#docker?utm_campaign=self&utm_source=github)
- [Docker autoconf](https://docs.bunkerweb.io/1.5.4/integrations/#docker-autoconf?utm_campaign=self&utm_source=github)
- [Swarm](https://docs.bunkerweb.io/1.5.4/integrations/#swarm?utm_campaign=self&utm_source=github)
- [Kubernetes](https://docs.bunkerweb.io/1.5.4/integrations/#kubernetes?utm_campaign=self&utm_source=github)
- [Linux](https://docs.bunkerweb.io/1.5.4/integrations/#linux?utm_campaign=self&utm_source=github)
- [Ansible](https://docs.bunkerweb.io/1.5.4/integrations/#ansible?utm_campaign=self&utm_source=github)
- [Vagrant](https://docs.bunkerweb.io/1.5.4/integrations/#vagrant?utm_campaign=self&utm_source=github)
>>>>>>> Stashed changes
- [Docker](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#docker)
- [Docker autoconf](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#docker-autoconf)
- [Swarm](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#swarm)
- [Kubernetes](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#kubernetes)
- [Linux](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#linux)
- [Ansible](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#ansible)
- [Vagrant](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#vagrant)
## Settings
@ -184,7 +150,7 @@ USE_GZIP=yes
USE_BROTLI=no
```
You will find an easy to use settings generator at [config.bunkerweb.io](https://config.bunkerweb.io?utm_campaign=self&utm_source=github).
You will find an easy to use settings generator at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=github).
## Multisite mode
@ -196,11 +162,7 @@ When multisite mode is enabled, BunkerWeb will serve and protect multiple web ap
## Custom configurations
<<<<<<< Updated upstream
Because meeting all the use cases only using the settings is not an option (even with [external plugins](https://docs.bunkerweb.io/1.5.3/plugins)), you can use custom configurations to solve your specific challenges.
=======
Because meeting all the use cases only using the settings is not an option (even with [external plugins](https://docs.bunkerweb.io/1.5.4/plugins?utm_campaign=self&utm_source=github)), you can use custom configurations to solve your specific challenges.
>>>>>>> Stashed changes
Because meeting all the use cases only using the settings is not an option (even with [external plugins](https://docs.bunkerweb.io/1.5.4/plugins/?utm_campaign=self&utm_source=github)), you can use custom configurations to solve your specific challenges.
Under the hood, BunkerWeb uses the notorious NGINX web server, that's why you can leverage its configuration system for your specific needs. Custom NGINX configurations can be included in different [contexts](https://docs.nginx.com/nginx/admin-guide/basic-functionality/managing-configuration-files/#contexts) like HTTP or server (all servers and/or specific server block).
@ -234,7 +196,7 @@ In other words, the scheduler is the brain of BunkerWeb.
## Docker
<p align="center">
<img alt="Docker banner" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.3/docs/assets/img/integration-docker.svg" />
<img alt="Docker banner" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.4/docs/assets/img/integration-docker.svg" />
</p>
We provide ready to use prebuilt images for x64, x86, armv7 and arm64 platforms on [Docker Hub](https://hub.docker.com/u/bunkerity).
@ -245,64 +207,46 @@ Docker integration key concepts are :
- **Scheduler** container to store configuration and execute jobs
- **Networks** to expose ports for clients and connect to upstream web services
<<<<<<< Updated upstream
You will find more information in the [Docker integration section](https://docs.bunkerweb.io/1.5.3/integrations/#docker) of the documentation.
=======
You will find more information in the [Docker integration section](https://docs.bunkerweb.io/1.5.4/integrations/#docker?utm_campaign=self&utm_source=github) of the documentation.
>>>>>>> Stashed changes
You will find more information in the [Docker integration section](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#docker) of the documentation.
## Docker autoconf
<p align="center">
<img alt="Docker autoconf banner" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.3/docs/assets/img/integration-autoconf.svg" />
<img alt="Docker autoconf banner" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.4/docs/assets/img/integration-autoconf.svg" />
</p>
The downside of using environment variables is that the container needs to be recreated each time there is an update which is not very convenient. To counter that issue, you can use another image called **autoconf** which will listen for Docker events and automatically reconfigure BunkerWeb in real-time without recreating the container.
Instead of defining environment variables for the BunkerWeb container, you simply add **labels** to your web applications containers and the **autoconf** will "automagically" take care of the rest.
<<<<<<< Updated upstream
You will find more information in the [Docker autoconf section](https://docs.bunkerweb.io/1.5.3/integrations/#docker-autoconf) of the documentation.
=======
You will find more information in the [Docker autoconf section](https://docs.bunkerweb.io/1.5.4/integrations/#docker-autoconf?utm_campaign=self&utm_source=github) of the documentation.
>>>>>>> Stashed changes
You will find more information in the [Docker autoconf section](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#docker-autoconf) of the documentation.
## Swarm
<p align="center">
<img alt="Swarm banner" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.3/docs/assets/img/integration-swarm.svg" />
<img alt="Swarm banner" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.4/docs/assets/img/integration-swarm.svg" />
</p>
To automatically configure BunkerWeb instances, a special service, called **autoconf** will listen for Docker Swarm events like service creation or deletion and automatically configure the **BunkerWeb instances** in real-time without downtime.
<<<<<<< Updated upstream
Like the [Docker autoconf integration](https://docs.bunkerweb.io/1.5.3/integrations/#docker-autoconf), configuration for web services is defined using labels starting with the special **bunkerweb.** prefix.
Like the [Docker autoconf integration](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#docker-autoconf), configuration for web services is defined using labels starting with the special **bunkerweb.** prefix.
You will find more information in the [Swarm section](https://docs.bunkerweb.io/1.5.3/integrations/#swarm) of the documentation.
=======
Like the [Docker autoconf integration](https://docs.bunkerweb.io/1.5.4/integrations/#docker-autoconf?utm_campaign=self&utm_source=github), configuration for web services is defined using labels starting with the special **bunkerweb.** prefix.
You will find more information in the [Swarm section](https://docs.bunkerweb.io/1.5.4/integrations/#swarm?utm_campaign=self&utm_source=github) of the documentation.
>>>>>>> Stashed changes
You will find more information in the [Swarm section](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#swarm) of the documentation.
## Kubernetes
<p align="center">
<img alt="Kubernetes banner" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.3/docs/assets/img/integration-kubernetes.svg" />
<img alt="Kubernetes banner" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.4/docs/assets/img/integration-kubernetes.svg" />
</p>
The autoconf acts as an [Ingress controller](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/) and will configure the BunkerWeb instances according to the [Ingress resources](https://kubernetes.io/docs/concepts/services-networking/ingress/). It also monitors other Kubernetes objects like [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) for custom configurations.
<<<<<<< Updated upstream
You will find more information in the [Kubernetes section](https://docs.bunkerweb.io/1.5.3/integrations/#kubernetes) of the documentation.
=======
You will find more information in the [Kubernetes section](https://docs.bunkerweb.io/1.5.4/integrations/#kubernetes?utm_campaign=self&utm_source=github) of the documentation.
>>>>>>> Stashed changes
You will find more information in the [Kubernetes section](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#kubernetes) of the documentation.
## Linux
<p align="center">
<img alt="Linux banner" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.3/docs/assets/img/integration-linux.svg" />
<img alt="Linux banner" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.4/docs/assets/img/integration-linux.svg" />
</p>
List of supported Linux distros :
@ -314,16 +258,12 @@ List of supported Linux distros :
Repositories of Linux packages for BunkerWeb are available on [PackageCloud](https://packagecloud.io/bunkerity/bunkerweb), they provide a bash script to automatically add and trust the repository (but you can also follow the [manual installation](https://packagecloud.io/bunkerity/bunkerweb/install) instructions if you prefer).
<<<<<<< Updated upstream
You will find more information in the [Linux section](https://docs.bunkerweb.io/1.5.3/integrations/#linux) of the documentation.
=======
You will find more information in the [Linux section](https://docs.bunkerweb.io/1.5.4/integrations/#linux?utm_campaign=self&utm_source=github) of the documentation.
>>>>>>> Stashed changes
You will find more information in the [Linux section](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#linux) of the documentation.
## Ansible
<p align="center">
<img alt="Ansible banner" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.3/docs/assets/img/integration-ansible.svg" />
<img alt="Ansible banner" src="https://github.com/bunkerity/bunkerweb/raw/v1.5.4/docs/assets/img/integration-ansible.svg" />
</p>
List of supported Linux distros :
@ -337,11 +277,7 @@ List of supported Linux distros :
A specific BunkerWeb Ansible role is available on [Ansible Galaxy](https://galaxy.ansible.com/bunkerity/bunkerweb) (source code is available [here](https://github.com/bunkerity/bunkerweb-ansible)).
<<<<<<< Updated upstream
You will find more information in the [Ansible section](https://docs.bunkerweb.io/1.5.3/integrations/#ansible) of the documentation.
=======
You will find more information in the [Ansible section](https://docs.bunkerweb.io/1.5.4/integrations/#ansible?utm_campaign=self&utm_source=github) of the documentation.
>>>>>>> Stashed changes
You will find more information in the [Ansible section](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#ansible) of the documentation.
## Vagrant
@ -350,19 +286,11 @@ We maintain ready to use Vagrant boxes hosted on Vagrant cloud for the following
- virtualbox
- libvirt
<<<<<<< Updated upstream
You will find more information in the [Vagrant section](https://docs.bunkerweb.io/1.5.3/integrations/#vagrant) of the documentation.
You will find more information in the [Vagrant section](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#vagrant) of the documentation.
# Quickstart guide
Once you have setup BunkerWeb with the integration of your choice, you can follow the [quickstart guide](https://docs.bunkerweb.io/1.5.3/quickstart-guide/) that will cover the following common use cases :
=======
You will find more information in the [Vagrant section](https://docs.bunkerweb.io/1.5.4/integrations/#vagrant?utm_campaign=self&utm_source=github) of the documentation.
# Quickstart guide
Once you have setup BunkerWeb with the integration of your choice, you can follow the [quickstart guide](https://docs.bunkerweb.io/1.5.4/quickstart-guide?utm_campaign=self&utm_source=github) that will cover the following common use cases :
>>>>>>> Stashed changes
Once you have setup BunkerWeb with the integration of your choice, you can follow the [quickstart guide](https://docs.bunkerweb.io/1.5.4/quickstart-guide/?utm_campaign=self&utm_source=github) that will cover the following common use cases :
- Protecting a single HTTP application
- Protecting multiple HTTP application
@ -373,35 +301,25 @@ Once you have setup BunkerWeb with the integration of your choice, you can follo
# Security tuning
<<<<<<< Updated upstream
BunkerWeb offers many security features that you can configure with [settings](https://docs.bunkerweb.io/1.5.3/settings). Even if the default values of settings ensure a minimal "security by default", we strongly recommend you to tune them. By doing so you will be able to ensure a security level of your choice but also manage false positives.
BunkerWeb offers many security features that you can configure with [settings](https://docs.bunkerweb.io/1.5.4/settings/?utm_campaign=self&utm_source=github). Even if the default values of settings ensure a minimal "security by default", we strongly recommend you to tune them. By doing so you will be able to ensure a security level of your choice but also manage false positives.
You will find more information in the [security tuning section](https://docs.bunkerweb.io/1.5.3/security-tuning) of the documentation.
=======
BunkerWeb offers many security features that you can configure with [settings](https://docs.bunkerweb.io/1.5.4/settings?utm_campaign=self&utm_source=github). Even if the default values of settings ensure a minimal "security by default", we strongly recommend you to tune them. By doing so you will be able to ensure a security level of your choice but also manage false positives.
You will find more information in the [security tuning section](https://docs.bunkerweb.io/1.5.4/security-tuning?utm_campaign=self&utm_source=github) of the documentation.
>>>>>>> Stashed changes
You will find more information in the [security tuning section](https://docs.bunkerweb.io/1.5.4/security-tuning/?utm_campaign=self&utm_source=github) of the documentation.
# Settings
To help you tuning BunkerWeb we have made an easy to use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io?utm_campaign=self&utm_source=github).
To help you tuning BunkerWeb we have made an easy to use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=github).
As a general rule when multisite mode is enabled, if you want to apply settings with multisite context to a specific server you will need to add the primary (first) server name as a prefix like `www.example.com_USE_ANTIBOT=captcha` or `myapp.example.com_USE_GZIP=yes` for example.
When settings are considered as "multiple", it means that you can have multiple groups of settings for the same feature by adding numbers as suffix like `REVERSE_PROXY_URL_1=/subdir`, `REVERSE_PROXY_HOST_1=http://myhost1`, `REVERSE_PROXY_URL_2=/anotherdir`, `REVERSE_PROXY_HOST_2=http://myhost2`, ... for example.
<<<<<<< Updated upstream
Check the [settings section](https://docs.bunkerweb.io/1.5.3/settings) of the documentation to get the full list.
=======
Check the [settings section](https://docs.bunkerweb.io/1.5.4/settings?utm_campaign=self&utm_source=github) of the documentation to get the full list.
>>>>>>> Stashed changes
Check the [settings section](https://docs.bunkerweb.io/1.5.4/settings/?utm_campaign=self&utm_source=github) of the documentation to get the full list.
# Web UI
<p align="center">
<a href="https://www.youtube.com/watch?v=Ao20SfvQyr4">
<img src="https://github.com/bunkerity/bunkerweb/raw/v1.5.3/docs/assets/img/user_interface_demo.png" height="300" />
<img src="https://github.com/bunkerity/bunkerweb/raw/v1.5.4/docs/assets/img/user_interface_demo.png" height="300" />
</a>
</p>
@ -415,17 +333,13 @@ The "Web UI" is a web application that helps you manage your BunkerWeb instance
- Monitor jobs execution
- View the logs and search pattern
<<<<<<< Updated upstream
You will find more information in the [Web UI section](https://docs.bunkerweb.io/1.5.3/web-ui) of the documentation.
=======
You will find more information in the [Web UI section](https://docs.bunkerweb.io/1.5.4/web-ui?utm_campaign=self&utm_source=github) of the documentation.
>>>>>>> Stashed changes
You will find more information in the [Web UI section](https://docs.bunkerweb.io/1.5.4/web-ui/?utm_campaign=self&utm_source=github) of the documentation.
# Plugins
BunkerWeb comes with a plugin system to make it possible to easily add new features. Once a plugin is installed, you can manage it using additional settings defined by the plugin.
Here is the list of "official" plugins that we maintain (see the [bunkerweb-plugins](https://github.com/bunkerity/bunkerweb-plugins?utm_campaign=self&utm_source=github) repository for more information) :
Here is the list of "official" plugins that we maintain (see the [bunkerweb-plugins](https://github.com/bunkerity/bunkerweb-plugins/?utm_campaign=self&utm_source=github) repository for more information) :
| Name | Version | Description | Link |
| :------------: | :-----: | :------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------: |
@ -437,24 +351,15 @@ Here is the list of "official" plugins that we maintain (see the [bunkerweb-plug
| **VirusTotal** | 1.2 | Automatically scans uploaded files with the VirusTotal API and denies the request when a file is detected as malicious. | [bunkerweb-plugins/virustotal](https://github.com/bunkerity/bunkerweb-plugins/tree/main/virustotal) |
| **WebHook** | 1.2 | Send security notifications to a custom HTTP endpoint using a Webhook. | [bunkerweb-plugins/slack](https://github.com/bunkerity/bunkerweb-plugins/tree/main/webhook) |
<<<<<<< Updated upstream
You will find more information in the [plugins section](https://docs.bunkerweb.io/1.5.3/plugins) of the documentation.
=======
You will find more information in the [plugins section](https://docs.bunkerweb.io/1.5.4/plugins?utm_campaign=self&utm_source=github) of the documentation.
>>>>>>> Stashed changes
You will find more information in the [plugins section](https://docs.bunkerweb.io/1.5.4/plugins/?utm_campaign=self&utm_source=github) of the documentation.
# Support
## Professional
We offer professional services related to BunkerWeb like :
Get technical support directly from the BunkerWeb maintainers. You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=github), our dedicated platform for professional services.
- Consulting
- Support
- Custom development
- Partnership
Please contact us at [contact@bunkerity.com](mailto:contact@bunkerity.com) if you are interested.
Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=github) if you have any question, we will be more than happy to respond to your needs.
## Community
@ -469,15 +374,15 @@ Please don't use [GitHub issues](https://github.com/bunkerity/bunkerweb/issues)
# License
This project is licensed under the terms of the [GNU Affero General Public License (AGPL) version 3](https://github.com/bunkerity/bunkerweb/raw/v1.5.3/LICENSE.md).
This project is licensed under the terms of the [GNU Affero General Public License (AGPL) version 3](https://github.com/bunkerity/bunkerweb/raw/v1.5.4/LICENSE.md).
# Contribute
If you would like to contribute to the plugins you can read the [contributing guidelines](https://github.com/bunkerity/bunkerweb/raw/v1.5.3/CONTRIBUTING.md) to get started.
If you would like to contribute to the plugins you can read the [contributing guidelines](https://github.com/bunkerity/bunkerweb/raw/v1.5.4/CONTRIBUTING.md) to get started.
# Security policy
We take security bugs as serious issues and encourage responsible disclosure, see our [security policy](https://github.com/bunkerity/bunkerweb/raw/v1.5.3/SECURITY.md) for more information.
We take security bugs as serious issues and encourage responsible disclosure, see our [security policy](https://github.com/bunkerity/bunkerweb/raw/v1.5.4/SECURITY.md) for more information.
# Stargazers over time

View file

@ -1,78 +0,0 @@
version: "3.5"
services:
bunkerweb:
image: bunkerity/bunkerweb:1.5.4
ports:
- 80:8080
- 443:8443
labels:
- "bunkerweb.INSTANCE=yes"
environment:
- SERVER_NAME=
- MULTISITE=yes
- API_WHITELIST_IP=127.0.0.0/8 10.20.30.0/24
- UI_HOST=http://bw-ui:7000 # Change it if needed
networks:
- bw-universe
- bw-services
bw-scheduler:
image: bunkerity/bunkerweb-scheduler:1.5.4
depends_on:
- bunkerweb
- bw-docker
environment:
- DATABASE_URI=mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db # Remember to set a stronger password for the database
- DOCKER_HOST=tcp://bw-docker:2375
networks:
- bw-universe
- bw-docker
bw-docker:
image: tecnativa/docker-socket-proxy:nightly
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- CONTAINERS=1
- LOG_LEVEL=warning
networks:
- bw-docker
bw-ui:
image: bunkerity/bunkerweb-ui:1.5.4
depends_on:
- bw-docker
environment:
- DATABASE_URI=mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db # Remember to set a stronger password for the database
- DOCKER_HOST=tcp://bw-docker:2375
networks:
- bw-universe
- bw-docker
bw-db:
image: mariadb:10.10
environment:
- MYSQL_RANDOM_ROOT_PASSWORD=yes
- MYSQL_DATABASE=db
- MYSQL_USER=bunkerweb
- MYSQL_PASSWORD=changeme # Remember to set a stronger password for the database
volumes:
- bw-data:/var/lib/mysql
networks:
- bw-docker
volumes:
bw-data:
networks:
bw-universe:
name: bw-universe
ipam:
driver: default
config:
- subnet: 10.20.30.0/24
bw-services:
name: bw-services
bw-docker:
name: bw-docker

View file

@ -2,7 +2,7 @@
## Who maintains BunkerWeb ?
BunkerWeb is maintained by [Bunkerity](https://www.bunkerity.com?utm_campaign=self&utm_source=doc), a French 🇫🇷 company specialized in Cybersecurity 🛡️.
BunkerWeb is maintained by [Bunkerity](https://www.bunkerity.com/?utm_campaign=self&utm_source=doc), a French 🇫🇷 company specialized in Cybersecurity 🛡️.
## Do you offer professional services ?
@ -13,7 +13,9 @@ Yes, we offer professional services related to BunkerWeb such as :
- Custom development
- Partnership
Please contact us at [contact@bunkerity.com](mailto:contact@bunkerity.com) if you are interested.
**We have a [dedicated panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) to centralise all professional requests.**
You can also contact use at [contact@bunkerity.com](mailto:contact@bunkerity.com) if you are interested.
## Where to get community support ?

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View file

@ -48,7 +48,7 @@ USE_BROTLI=no
!!! info "Settings generator tool"
To help you tune BunkerWeb, we offer an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io?utm_campaign=self&utm_source=doc).
To help you tune BunkerWeb, we offer an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=doc).
## Multisite mode

View file

@ -54,10 +54,10 @@ To delve deeper into the core security features, we invite you to explore the [s
## Demo
<p align="center">
<iframe style="display: block;" width="560" height="315" src="https://www.youtube-nocookie.com/embed/ZhYV-QELzA4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<iframe style="display: block;" width="560" height="315" src="https://www.youtube-nocookie.com/embed/ZhYV-QELzA4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</p>
A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io?utm_campaign=self&utm_source=doc). Feel free to visit it and perform some security tests.
A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io/?utm_campaign=self&utm_source=doc). Feel free to visit it and perform some security tests.
## Professional services
@ -66,3 +66,21 @@ Get the most of BunkerWeb by getting professional services directly from the mai
You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc), our dedicated platform for professional services.
Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=doc) if you have any question, we will be more than happy to respond to your needs.
## Ecosystem, community and resources
Official websites, tools and resources about BunkerWeb :
- [**Website**](https://www.bunkerweb.io/?utm_campaign=self&utm_source=doc) : get more information, news and articles about BunkerWeb
- [**Panel**](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) : dedicated platform to order and manage professional services (e.g. technical support) around BunkerWeb
- [**Documentation**](https://docs.bunkerweb.io) : technical documentation of the BunkerWeb solution
- [**Demo**](https://demo.bunkerweb.io/?utm_campaign=self&utm_source=doc) : demonstration website of BunkerWeb, don't hesitate to attempt attacks to test the robustness of the solution
- [**Configurator**](https://config.bunkerweb.io/?utm_campaign=self&utm_source=doc) : user-friendly tool to help you configure BunkerWeb
- [**Threatmap**](https://threatmap.bunkerweb.io/?utm_campaign=self&utm_source=doc) : live cyber attack blocked by BunkerWeb instances all around the world
Community and social networks :
- [**Discord**](https://discord.com/invite/fTf46FmtyD)
- [**LinkedIn**](https://www.linkedin.com/company/bunkerity/)
- [**Twitter**](https://twitter.com/bunkerity)
- [**Reddit**](https://www.reddit.com/r/BunkerWeb/)

View file

@ -654,7 +654,7 @@ metadata:
name: cr-bunkerweb
rules:
- apiGroups: [""]
resources: ["services", "pods", "configmaps"]
resources: ["services", "pods", "configmaps", "secrets"]
verbs: ["get", "watch", "list"]
- apiGroups: ["networking.k8s.io"]
resources: ["ingresses"]

View file

@ -39,7 +39,7 @@ doc = StringIO()
print("# Settings\n", file=doc)
print(
'!!! info "Settings generator tool"\n\n To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io?utm_campaign=self&utm_source=doc).\n',
'!!! info "Settings generator tool"\n\n To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=doc).\n',
file=doc,
)
print(

View file

@ -8,7 +8,7 @@ But dedicating time to a specific technology may not be easy depending on your b
Getting professional services in addition to the open-source solution is the ideal solution to cover your business needs. You can focus on your top priorities and rely on a trusted partner when it comes to web security.
Please note that professionnal services are directly offered by [Bunkerity](https://www.bunkerity.com?utm_campaign=self&utm_source=doc), the company maintaining the BunkerWeb project, through our [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) online platform.
Please note that professionnal services are directly offered by [Bunkerity](https://www.bunkerity.com/?utm_campaign=self&utm_source=doc), the company maintaining the BunkerWeb project, through our [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) online platform.
## Which professional services do you offer ?

View file

@ -1,5 +1,5 @@
mike==2.0.0
mkdocs==1.5.3
mkdocs-material==9.4.14
mkdocs-material[imaging]==9.5.2
mkdocs-print-site-plugin==2.3.6
pytablewriter==1.2.0

View file

@ -4,14 +4,76 @@
#
# pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in
#
babel==2.13.1 \
--hash=sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900 \
--hash=sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed
babel==2.14.0 \
--hash=sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363 \
--hash=sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287
# via mkdocs-material
cairocffi==1.6.1 \
--hash=sha256:78e6bbe47357640c453d0be929fa49cd05cce2e1286f3d2a1ca9cbda7efdb8b7 \
--hash=sha256:aa78ee52b9069d7475eeac457389b6275aa92111895d78fbaa2202a52dac112e
# via cairosvg
cairosvg==2.7.1 \
--hash=sha256:432531d72347291b9a9ebfb6777026b607563fd8719c46ee742db0aef7271ba0 \
--hash=sha256:8a5222d4e6c3f86f1f7046b63246877a63b49923a1cd202184c3a634ef546b3b
# via mkdocs-material
certifi==2023.11.17 \
--hash=sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1 \
--hash=sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474
# via requests
cffi==1.16.0 \
--hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \
--hash=sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a \
--hash=sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 \
--hash=sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab \
--hash=sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520 \
--hash=sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36 \
--hash=sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743 \
--hash=sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8 \
--hash=sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed \
--hash=sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684 \
--hash=sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56 \
--hash=sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324 \
--hash=sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d \
--hash=sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235 \
--hash=sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e \
--hash=sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088 \
--hash=sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000 \
--hash=sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7 \
--hash=sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e \
--hash=sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673 \
--hash=sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c \
--hash=sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe \
--hash=sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2 \
--hash=sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098 \
--hash=sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8 \
--hash=sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a \
--hash=sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0 \
--hash=sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b \
--hash=sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896 \
--hash=sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e \
--hash=sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9 \
--hash=sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2 \
--hash=sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b \
--hash=sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6 \
--hash=sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 \
--hash=sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f \
--hash=sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0 \
--hash=sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4 \
--hash=sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc \
--hash=sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936 \
--hash=sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba \
--hash=sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872 \
--hash=sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb \
--hash=sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614 \
--hash=sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1 \
--hash=sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d \
--hash=sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969 \
--hash=sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b \
--hash=sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4 \
--hash=sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627 \
--hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \
--hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357
# via cairocffi
chardet==5.2.0 \
--hash=sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7 \
--hash=sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970
@ -116,12 +178,20 @@ colorama==0.4.6 \
--hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \
--hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6
# via mkdocs-material
cssselect2==0.7.0 \
--hash=sha256:1ccd984dab89fc68955043aca4e1b03e0cf29cad9880f6e28e3ba7a74b14aa5a \
--hash=sha256:fd23a65bfd444595913f02fc71f6b286c29261e354c41d722ca7a261a49b5969
# via cairosvg
dataproperty==1.0.1 \
--hash=sha256:0b8b07d4fb6453fcf975b53d35dea41f3cfd69c9d79b5010c3cf224ff0407a7a \
--hash=sha256:723e5729fa6e885e127a771a983ee1e0e34bb141aca4ffe1f0bfa7cde34650a4
# via
# pytablewriter
# tabledata
defusedxml==0.7.1 \
--hash=sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69 \
--hash=sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61
# via cairosvg
ghp-import==2.1.0 \
--hash=sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619 \
--hash=sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343
@ -241,9 +311,9 @@ mkdocs==1.5.3 \
# -r requirements.in
# mike
# mkdocs-material
mkdocs-material==9.4.14 \
--hash=sha256:a511d3ff48fa8718b033e7e37d17abd9cc1de0fdf0244a625ca2ae2387e2416d \
--hash=sha256:dbc78a4fea97b74319a6aa9a2f0be575a6028be6958f813ba367188f7b8428f6
mkdocs-material==9.5.2 \
--hash=sha256:6ed0fbf4682491766f0ec1acc955db6901c2fd424c7ab343964ef51b819741f5 \
--hash=sha256:ca8b9cd2b3be53e858e5a1a45ac9668bd78d95d77a30288bb5ebc1a31db6184c
# via
# -r requirements.in
# mkdocs-print-site-plugin
@ -264,18 +334,92 @@ packaging==23.2 \
paginate==0.5.6 \
--hash=sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d
# via mkdocs-material
pathspec==0.11.2 \
--hash=sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20 \
--hash=sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3
pathspec==0.12.1 \
--hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \
--hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712
# via mkdocs
pathvalidate==3.2.0 \
--hash=sha256:5e8378cf6712bff67fbe7a8307d99fa8c1a0cb28aa477056f8fc374f0dff24ad \
--hash=sha256:cc593caa6299b22b37f228148257997e2fa850eea2daf7e4cc9205cef6908dee
# via pytablewriter
pillow==9.5.0 \
--hash=sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1 \
--hash=sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba \
--hash=sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a \
--hash=sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799 \
--hash=sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51 \
--hash=sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb \
--hash=sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5 \
--hash=sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270 \
--hash=sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6 \
--hash=sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47 \
--hash=sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf \
--hash=sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e \
--hash=sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b \
--hash=sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66 \
--hash=sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865 \
--hash=sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec \
--hash=sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c \
--hash=sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1 \
--hash=sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38 \
--hash=sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906 \
--hash=sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705 \
--hash=sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef \
--hash=sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc \
--hash=sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f \
--hash=sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf \
--hash=sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392 \
--hash=sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d \
--hash=sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe \
--hash=sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32 \
--hash=sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5 \
--hash=sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7 \
--hash=sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44 \
--hash=sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d \
--hash=sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3 \
--hash=sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625 \
--hash=sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e \
--hash=sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829 \
--hash=sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089 \
--hash=sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3 \
--hash=sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78 \
--hash=sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96 \
--hash=sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964 \
--hash=sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597 \
--hash=sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99 \
--hash=sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a \
--hash=sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140 \
--hash=sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7 \
--hash=sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16 \
--hash=sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903 \
--hash=sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1 \
--hash=sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296 \
--hash=sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572 \
--hash=sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115 \
--hash=sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a \
--hash=sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd \
--hash=sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4 \
--hash=sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1 \
--hash=sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb \
--hash=sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa \
--hash=sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a \
--hash=sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569 \
--hash=sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c \
--hash=sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf \
--hash=sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082 \
--hash=sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062 \
--hash=sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579
# via
# cairosvg
# mkdocs-material
platformdirs==4.1.0 \
--hash=sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380 \
--hash=sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420
# via mkdocs
pycparser==2.21 \
--hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \
--hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206
# via cffi
pygments==2.17.2 \
--hash=sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c \
--hash=sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367
@ -455,14 +599,6 @@ regex==2023.10.3 \
requests==2.31.0 \
--hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \
--hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1
# via
# importlib-metadata
# importlib-resources
# The following packages are considered to be unsafe in a requirements file:
setuptools==69.0.2 \
--hash=sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2 \
--hash=sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6
# via mkdocs-material
six==1.16.0 \
--hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \
@ -476,6 +612,12 @@ tcolorpy==0.1.4 \
--hash=sha256:d0926480aa5012f34877d69fc3b670f207dc165674e68ad07458fa6ee5b12724 \
--hash=sha256:f0dceb1cb95e554cee63024b3cd2fd8d4628c568773de2d1e6b4f0478461901c
# via pytablewriter
tinycss2==1.2.1 \
--hash=sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847 \
--hash=sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627
# via
# cairosvg
# cssselect2
typepy==1.3.2 \
--hash=sha256:b69fd48b9f50cdb3809906eef36b855b3134ff66c8893a4f8580abddb0b39517 \
--hash=sha256:d5d1022a424132622993800f1d2cd16cfdb691ac4e3b9c325f0fcb37799db1ae
@ -483,7 +625,6 @@ typepy==1.3.2 \
# dataproperty
# pytablewriter
# tabledata
# typepy
urllib3==2.1.0 \
--hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 \
--hash=sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54
@ -521,7 +662,21 @@ watchdog==3.0.0 \
--hash=sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44 \
--hash=sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33
# via mkdocs
webencodings==0.5.1 \
--hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \
--hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923
# via
# cssselect2
# tinycss2
zipp==3.17.0 \
--hash=sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 \
--hash=sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0
# via
# importlib-metadata
# importlib-resources
# The following packages are considered to be unsafe in a requirements file:
setuptools==69.0.2 \
--hash=sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2 \
--hash=sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6
# via pytablewriter

View file

@ -2,7 +2,7 @@
!!! info "Settings generator tool"
To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io?utm_campaign=self&utm_source=doc).
To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=doc).
This section contains the full list of settings supported by BunkerWeb. If you are not yet familiar with BunkerWeb, you should first read the [concepts](concepts.md) section of the documentation. Please follow the instructions for your own [integration](integrations.md) on how to apply the settings.
@ -363,6 +363,7 @@ Miscellaneous settings.
|`OPEN_FILE_CACHE_VALID` |`30s` |multisite|no |Open file cache valid time |
|`EXTERNAL_PLUGIN_URLS` | |global |no |List of external plugins URLs (direct download to .zip or .tar file) to download and install (URLs are separated with space).|
|`DENY_HTTP_STATUS` |`403` |global |no |HTTP status code to send when the request is denied (403 or 444). When using 444, BunkerWeb will close the connection. |
|`SEND_ANONYMOUS_REPORT` |`yes` |global |no |Send anonymous report to BunkerWeb maintainers. |
### ModSecurity

View file

@ -1,5 +1,8 @@
# Troubleshooting
!!! info "BunkerWeb Panel"
If you are unable to resolve your problems, you can [contact us directly via our panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc). This centralises all requests relating to the BunkerWeb solution.
## Logs
When troubleshooting, logs are your best friends. We try our best to provide user-friendly logs to help you understand what's happening.

View file

@ -0,0 +1,30 @@
-----BEGIN CERTIFICATE-----
MIIFOTCCAyGgAwIBAgIUDBbkHicmx8nqUQNnkDvx32hqmiswDQYJKoZIhvcNAQEL
BQAwLDEqMCgGA1UEAwwhYXBwMS5leGFtcGxlLmNvbSxhcHAyLmV4YW1wbGUuY29t
MB4XDTIzMTIxNzExMjg0NFoXDTMzMTIxNDExMjg0NFowLDEqMCgGA1UEAwwhYXBw
MS5leGFtcGxlLmNvbSxhcHAyLmV4YW1wbGUuY29tMIICIjANBgkqhkiG9w0BAQEF
AAOCAg8AMIICCgKCAgEA0PE86OpiyWSgQlm30SF737CM7+NIsUn0jo7RZUoB/rmM
jryWruQ/IZOH7TjKyPBemX+90q56ExIPthuGK6QTZBGpwNdGLRG7ghvKeJSWTkZv
8lYWx/ROSQZ5xRbJFMDyZAwjbhJhLlV2vV19vbC5NkgbBowSpMzwd9Ymy7ULazIQ
cQ7frZu4BNhLQ3aTuNktxT11tuvI4zOK6Ma0aoBWEMgyI/lYq/U61zLc0MOWVta1
9Llo5AO90MN5+5pM0xZPgvVNsrwCyWga+cl/oykkimmzxRMA67t01ew8MheK6fFC
5sLqQPqSmelgkB/Ff3eaoxYhGgWYVx6jOg89zuW65wVbOVokq0pmlLWe48Ea6oTe
AC/+Xq2TWnzm/3RI10YSFTdzcslqO8H2e4Pa3oyj2kNk7JE8GHewCA9WL+SIP18t
GtbTAXonSHaseWu1Stelm43V/N2AViILv7aBNFHJ8iGWsOqSjJCVqymtOsmosZYZ
zosLSItNrTGtRTqj5v5gsynQrnEj2hM9nFVOsVSTHltMOj39nfrkcG70Vsn1Z7dB
mhm1hIDi0fZSPiLw1o/PsKdNOcfnmPX4ol4vW48HilBDINVaQAJMU016JgSOeBls
tGdCZWFceOdEwVy+12ATPolSaY8Ro6NtHW5r6ONcIkZi9Nccxjl5ETz9WalfyIEC
AwEAAaNTMFEwHQYDVR0OBBYEFHiUEzaEK6Iv6zQMopthSOfZpK5JMB8GA1UdIwQY
MBaAFHiUEzaEK6Iv6zQMopthSOfZpK5JMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
hvcNAQELBQADggIBAAtXURD4HT3kMSscVByqUM4inJc3p8dGEAxAQRNBxN3VOkwA
melyRQ3SeBUJKnElGTtgMIW7JmEPdZdAcQiUZ2UEI7AKhMWACGg6LBGRNXATp1sA
GAzPgVqNVs+x2Iyif5kE9xWss+VE3PH17LMJMhqlpKcjkrrFwtmtRC2a1fGnDLtK
UoewUIjC/9qEKySQs3eyCCbjnJWDpvJaUrBpIUvjFHHus/UOYmCu7UBxSa31kku/
cVpJVi0fODyA5VH606AS4fR9XQBDF80FYH7dr+jkXcMmh9FAl5AsvPeP7nhcX/nM
fwlEHT6/TOX0xw8c5P+sKmJASBt/Lvc+pFWxNRLlF9SWcskXT3wf5hoz8qRS89ip
567cPDquOHmG4qg2c0f8I2mNomxVl4TW4fjSqtvsoIQDDTzyXBBG1pMMhQMNcjGI
twpusIdIQHTkR6heBfmSjGSkh6c4bXw44QWl1kq0+uouKF2aFajAUmRq3MC+r6iP
yg1zBpPkNMICfCyekhY1N3THfU9bhEBtvbIqobuTGp2OyekBShOkpXfeLp1hDIPh
10RQU3lzE4/fipja+t/IiBxAJ20MSsHOFvPRpX2Q6/7584eguA5hAsflQw1PIXj5
wOi4cm6tx3xVWzhuRHa6oUBtSS/IjRX55lcWFE8xYXqulpHM2rP/KAsCKu3N
-----END CERTIFICATE-----

View file

@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDQ8Tzo6mLJZKBC
WbfRIXvfsIzv40ixSfSOjtFlSgH+uYyOvJau5D8hk4ftOMrI8F6Zf73SrnoTEg+2
G4YrpBNkEanA10YtEbuCG8p4lJZORm/yVhbH9E5JBnnFFskUwPJkDCNuEmEuVXa9
XX29sLk2SBsGjBKkzPB31ibLtQtrMhBxDt+tm7gE2EtDdpO42S3FPXW268jjM4ro
xrRqgFYQyDIj+Vir9TrXMtzQw5ZW1rX0uWjkA73Qw3n7mkzTFk+C9U2yvALJaBr5
yX+jKSSKabPFEwDru3TV7DwyF4rp8ULmwupA+pKZ6WCQH8V/d5qjFiEaBZhXHqM6
Dz3O5brnBVs5WiSrSmaUtZ7jwRrqhN4AL/5erZNafOb/dEjXRhIVN3NyyWo7wfZ7
g9rejKPaQ2TskTwYd7AID1Yv5Ig/Xy0a1tMBeidIdqx5a7VK16WbjdX83YBWIgu/
toE0UcnyIZaw6pKMkJWrKa06yaixlhnOiwtIi02tMa1FOqPm/mCzKdCucSPaEz2c
VU6xVJMeW0w6Pf2d+uRwbvRWyfVnt0GaGbWEgOLR9lI+IvDWj8+wp005x+eY9fii
Xi9bjweKUEMg1VpAAkxTTXomBI54GWy0Z0JlYVx450TBXL7XYBM+iVJpjxGjo20d
bmvo41wiRmL01xzGOXkRPP1ZqV/IgQIDAQABAoICAQCtnhcnz0Ng532HRLfKThF5
sWGbH/hSYQqWvrPef52ixRm3rZtkHgMbalTDWLKgP6PL1uqruxFy8Uoe30Yg00jN
mSO+OuN0JczycxdOFOHEjyEMdF6frjCy22+pxqI13ZJMcg2qtBkOgDOXbK1ERynP
oiDa0t/XEvgqC8fW80xWuZYR6/MPdlp1pCj+GPTs34H56HT9F3Wo3TZq8FoQOS3K
6h9H5zS4RqCrGveDfVJaPDWb8cjn1vgOFbAx0mhN6rcNMbprb3C9XQU1VCr8L/7O
CME5W+4i83RFIfRvB0MF29TknUg70DqrK9JyUAQzQ/Y51/SPg+CvW6T0ZJ/OYPRo
7HfNGk1+yhou2wvZnC9OqI98tZBniO5fEdcUCguaZZWW7jwMpONk0cI8sm6NoWpy
uiIb2W5jNlOpXqBx/0veejfDtfso7MvkPY/hwppw++DY331au2rsLsDbXUx96SOJ
d7PyflXNjrrzSTO5X6UyQiYNl1/EaBQjQN/R9YxyC2uS+UsM5UesB5Tg++jER6HL
mT6cccE5YLjbdTfT9TDvgNIgB2tS1mnBvI4nObaMX/JuASyMYUEoQQsiNPtuElqC
U7DXkgMKHd6qlrsVMxrIyih3UNjtyQZBQcokP4UcW5hIzTLyrNPyBSzh6QUbs4Kn
lL9PyYYcDEXlMP30i+M3AQKCAQEA7ccgjMYIYq2qv8X/G15ZmWdw5+Hz16S58KzE
n0mVF4Ht16mBDfrQve0h5nn6/h33bffpgxKigmM0b+vEzgPtPSlNhaLCE4Kt7SZn
NuRVHJ74nHXsTi+Z0ZSkgeKwBRmji5TN7PBEoVdaExhM/qGnwG7x5CQNLQ0O1w2J
5b6ywGnghjlhHRI5uGdmHy2n6N5Rj37OFrLVOLdEexy351ogZY74673BXGVjLNe2
UMM6CazE00gDwKv0rOniZv732O8MVaOMR6CYG3z7TgfVGESWS1mEGTrkbLgGbT4X
naGhUH90+AKZwD2LmMJPbQR5PhwcmaCx/xgPj1RWRl4zemDjsQKCAQEA4PRl41Wd
Yiirgc41oXC3hk/cMtCsz+Cz8WL7pCRJL3hvX/Z+7Pp6eMeiHBnaObjZNUY/eC+s
I1i4tCShMnqSddm/YnvgiS1UsDF2N4Xm0oR0PfK0jcQDq/IYyxCJmp56ZJ8y1c5W
v9wvJ+7U/AELjuqkGiZ0w0wDGtdNdFVbUSjyf385Dmq0D19rrl3Y9OmoDaECYVdS
L7/8hjIgmT09+Yrf05+IlEo/f6aPjM1xi6WYC3+aQOp3yjW6oSPEZZuc2WfVyhss
AiDSwbqu1nxS5WswOTGKmirl3btACafOK8x/czeoqM8Wjju8HAG1btlUT4BzLNVk
GZR14iJcFxZ10QKCAQBri6czRNbCGx6hwqIR9Oi9s8Wje9VYcc8QBnSgPx3KFiBH
bQlME2ean8i3f/CAQ3mIKZtah3EtXEV5YcAQFkKVaTsA+I6jWHXmT3pbn4bHfTeh
PMz2yBzgaETH4ooOpHwOQ+2n/zxrZSD+hf09JkzDguqxb4TuHXva1OrMGSasVLcS
vp0oEvg8abgM3g+WCggFySrZpWU/U9ULgf/ECkWg6bu4lIkCi3EB9Ucm3EZB3fzg
OzBHUv9FvjuCrkvXuLdxfJmURBTISg04S96cLVl1FzXiW3q5mbp+apkv2M0npZ54
FmUISE39d9WIz38vEnP1IHOhl3ZiM5kaFr1d2rjhAoIBAGOtB0R/GBh5at0+cNcS
6c7yreA6RIhryW/I6zWk+mS1WaxMvZrltcS0uGj5L4/qDxyi/taTURPsaRMxM9f5
JdJgZIQP3cMKuf7EO9yIUWmwVQ1p8ITseLAEuuWnc0F2vUa+n7jLD/c9aguosOjk
0alG4OXRamVq1elbwy8r7yV8Hk9OIQr5TsWNA1qkrNCAg/1d/X8CQSF1UUBpD7a2
wzJCTcEobE1AxPgb5nl+QrSc8E0QAlqHSgLoYcSq44geNpbCgqFl/s8GmjxLKtNR
DS4om5qMEB0Vqvrf0JU2rI0NtN9ppyr9b8IgR86lFy6Bz/DWOrJ/7zXCaaWEkgeM
5TECggEAKSvloR9pVm0nzvN3e4Xtjj01rVUZOU667lUT3TAeDycTTLK4tXsYR47V
olDmKwIN7YL/U6WAm1ClE+DGMnt27hKeIBctKJXiiIqK7hlAAOmk6nCWUXU7yCgb
RkV9DTXHQ4gEtzgU0kx0r9pTydc19rMAanl7fgiNUNc+RcHeNSH9hoWPTGpOb5Om
R4LuAJSewMdtnYFa7Xu3P7QjT7b0d7ARGnF1OrjKA9Nqm65D3bh8hlikANrGkM+k
pPM2BJiTnh6vLYMh5TBMSFNLJPUKItyTaIz2CVFdWE5ipV3UPjj8beYsFDt24XmC
FI88g7aCJHlP2wvuyZiPnOtCdGVVKw==
-----END PRIVATE KEY-----

View file

@ -0,0 +1,30 @@
-----BEGIN CERTIFICATE-----
MIIFFzCCAv+gAwIBAgIUETXxobflxWhnHIL/u7KBRE/y4eswDQYJKoZIhvcNAQEL
BQAwGzEZMBcGA1UEAwwQYXBwMy5leGFtcGxlLmNvbTAeFw0yMzEyMTcxMTMwMTda
Fw0zMzEyMTQxMTMwMTdaMBsxGTAXBgNVBAMMEGFwcDMuZXhhbXBsZS5jb20wggIi
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDEq6OCSCs3Uyswq4sH8FWfd4oR
ssX/qIzu5FwTjpvFKOa/d+b6rnWC2SR6RKKmR47bwGBx2jvQIOZ118ta0rKtws0F
AHYXgwxTpuljz3vESrybXxUA7Pmjiog2zvGkKIKHAOZdjwRbDQBvceocurChKn3V
t8CjKSGecq6qN4dh0xPwEIWAsIpIsnrMSI3JbjCDlUe7SKEcWYKcFZfgm71KBYnD
gwTTFaRnzrVWLyvqJ/wfQldCzmbGJ5cR6CsF9Keu/KQelJxQA9SEqqxLzU04dHOB
wYJVyBWL6m2udh6qWRRP3FwAdX6QB9cT0ql/JwxirS/+kBmHAKS8K+iTxl7JzaDw
hxwfjJkTNiw3mMnvah6L7SHAKVd53UXt1lc6vsz02/4cIiNxCA/k9TKWwYb6ogl0
MenPPjfmSDp2zEHX9FP/xbJgnO9wPdzO1nQrVKFRynrC5tlnmzU9DKpn+dflKvmQ
/hqFwu//ZUnCfyApdrtF7ICj+mngJkD8M6aJ4ALDhXpOjPzIMxLe/b+vArPhOVIj
CEUSUg6u3eDuksKKS+0fBZgrrYhHpBNNiLXzD7rAXoAKOWorAgshdSlsLbWcEfm7
RhiwXIfqK/Ykk0YOQRLlowRJuHU17w+8nfnGz80GL9ZN06AE3o7uCLem4FS0WK22
3I8WKJWY3opjD6FdyQIDAQABo1MwUTAdBgNVHQ4EFgQUnyUyfZmtc1z0AtSo8AS2
SHklcV4wHwYDVR0jBBgwFoAUnyUyfZmtc1z0AtSo8AS2SHklcV4wDwYDVR0TAQH/
BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAn4OP9GNeUl42T1mPewQa8x1jbFj/
klALcY1onrUFbpLHceFljyOLkDL+XufXGZ842h1/g4PVFQZlCku6qUaSNc9pz6JX
48olhJODV4+HZXh3KUpCDBXNxywnnKw+dF60imDPp7TdL2wdCSZAyH7pkbFlXsPU
B9SWLemyr/aX+/z3qD7OC6q1sHH9h7asRXbXycowROZozDCSVQKITC8P4avzbLJ9
yrUgjHyj2ymxMUOGs65fnKr1/xrMLjYyjN8v9OMVEh02+qO4pOhz4WCEEur1zIC1
X24YUhnX4QNJ4Qi1qwidAbBIZrXt4PW2i4Mw2eQO1RU1w81pz8vY725l2GygFG3N
DhEkAdILJ99KUN0YlU7BAPsCU5pe+uA40uBe5Oti9PAlEnvH4i49p34JKjZ4q30e
FIy5VjuCkmVlSzUfRQhZ8QRz2hdK/hJY6Pwo63UP7Mb1tup8hmEcfZATotMjUK4U
d+BYe6OFw50s2s6uMiVuu2Wb2sWsP5gOk9SkaCKbvQa4Miu/kWKbvT9Pb81u544t
XoqVO2d83uOm5FTM+gFgMDtJDK/poqIXho6MDnUES1SoUZgY2XRHLOBvCAms9SIW
HCzbrzSqs8P6UxaiV59Ht3toL/xQmR/skfrn/QUYdsSh9dtOStkHUOzzepkTroj0
MZUb2FnSikWBzcI=
-----END CERTIFICATE-----

View file

@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDEq6OCSCs3Uysw
q4sH8FWfd4oRssX/qIzu5FwTjpvFKOa/d+b6rnWC2SR6RKKmR47bwGBx2jvQIOZ1
18ta0rKtws0FAHYXgwxTpuljz3vESrybXxUA7Pmjiog2zvGkKIKHAOZdjwRbDQBv
ceocurChKn3Vt8CjKSGecq6qN4dh0xPwEIWAsIpIsnrMSI3JbjCDlUe7SKEcWYKc
FZfgm71KBYnDgwTTFaRnzrVWLyvqJ/wfQldCzmbGJ5cR6CsF9Keu/KQelJxQA9SE
qqxLzU04dHOBwYJVyBWL6m2udh6qWRRP3FwAdX6QB9cT0ql/JwxirS/+kBmHAKS8
K+iTxl7JzaDwhxwfjJkTNiw3mMnvah6L7SHAKVd53UXt1lc6vsz02/4cIiNxCA/k
9TKWwYb6ogl0MenPPjfmSDp2zEHX9FP/xbJgnO9wPdzO1nQrVKFRynrC5tlnmzU9
DKpn+dflKvmQ/hqFwu//ZUnCfyApdrtF7ICj+mngJkD8M6aJ4ALDhXpOjPzIMxLe
/b+vArPhOVIjCEUSUg6u3eDuksKKS+0fBZgrrYhHpBNNiLXzD7rAXoAKOWorAgsh
dSlsLbWcEfm7RhiwXIfqK/Ykk0YOQRLlowRJuHU17w+8nfnGz80GL9ZN06AE3o7u
CLem4FS0WK223I8WKJWY3opjD6FdyQIDAQABAoICABxlA4htzv9/3H58ZehRhKsv
YRnJC9krhp1/DuQr9MV0cEw4jXqn8YNgwml8u1bygeesUMBfV79m4J8m9s84GGAJ
/fu441PlscPqF0w3ypC+kZiFE808aZZ5C82N90lSJ/ZB5QChA2n56JQuiDR5p8K9
Fcnja8aiy53KxPkCZ2NyTDCe0geQdYalbiFMYFwysoJs7RxXEhu7uKW8YF8nXR7w
ycEWi33GZCQwrfGxgc+e0kHZHCwjDKeTU7ZcJMoJVqRnCXL41dCfnPFCivmuvHVo
Kr0TKTQlXScEQ62qlCbYEZyuHgJa9FjrKNxNz/bxtlIQ2xsPxv+80gvw8vVS8KBF
KKZQ5R7SuCT1tGveHk3MEO8yUXj+LNB4H4xNK5LHcBc5ZFH5mcop5kkk4rnR+1pK
LFH1jpy1vdNEAeHNKbJAxrec1Z4NKs4Lwv6n5/b4EsoFwNlFM9IJ6dNqijMJXlsC
It9byyjKpcY/8w89EgN00aae4xPSBJTQU/gFgnUJmP+YD6i7B3/WCsZfnFeuj7qM
2T8Qxhf5R4/aNOqf0mCyV14HmglFygAzTin/e5fiEA1Pk8bc3+CHWmmfNIURq2kr
gQOg5k6R46P/93zLs6kZyLD4UL/7kn2rOIIlQqrbityaIppUNka7kxcD7h0R+yJW
lKLTMoEHPinkaM2X125ZAoIBAQD1ZZ7eeTsIdW5AcG+U1J690SGu03MHQAyZ+a0L
WOhVJn21lEuCTCu0dKcNSXET5ZLkzUmXt0UKJ20IZL1Az7cDekNvtNoTFDYrl1e7
uH52TuoUxxiANkDlTm5dSqA44flzNtG1rPcjNBbW6IRWAUQGSzOWPzJHAO2H4Wa4
m1m0YzwFz8PC5A1/NX8/BHsTYiIFsmf3o1I6M3HnrqHkftZmIVKataRZadDLpbTp
426kpY8WnnV9udXMPHmvBZ+P3kKjKc99oY/u4mtnPReBj0LIz+3Smc6cUpkdq/EI
VK2xCvFm/uJN93iLPyx2HJUf+bu/f+GvH8Fz8KCe/0PpKCv7AoIBAQDNKwu0jlaI
Y0mtrJZvXUPWtK3ZNUQ24BuVcCvi99R391f++oZ+g8ib1SqqLGNmY3DJ4WsbLtpi
9toPDLT4mgZAUEhjRLY+S0IeXTVxdN/JOZ6eMamyM3x75efWPILhxLk4AeibGIha
L5Ln2CWlDjc7mGZNjUn0HbXvdwEtDnlhoAnFDpKCOxEFt+r2cke3D0StpnFdcDfp
jL8NHmsSPBz2TFtMhtczkFB/1pc5Grf+3LemHQmKpOCfFQcS+VCI1UU5gfhkr6IS
ycCvvdioSwmolqhaBzug9yCx1pUL9s2FaiWIMzvvsy63lZkEC9009Zy5rGo0RWN8
Hr5HllKXs04LAoIBAQDPHyV3W1VzL0KOSxgywz70sZY/bCNThEDemTjwMetvK1zB
LNiKsmXVGvyAn3M8uvFAAvFRh5NTHbHOetCt6mPrIH/YwgmqPs31/vhC7lZ23uZ+
AQlx9djScl9+iGUxfbHBCAz6zXGOmgGJBJnlyY2zzjdNYiu6eFMD9EByIlUVhwh7
U0BEt52Yt/udodeLpbFXo5xTDNtzWkaSqPfl1xR5ATkqcZO1EDX2HPfUzWxutXpP
OhGqu3Zzurtt+U4S7SLLepexzvKgSyUh7xNu/A7/VVjC/6S+loy72YtIX8h2fOkB
6LHz4qMwzHJngnpvkaZg3LwMxr3OcNPxPzz/hzOPAoIBAQCQ6s3KzBtdHNyG+vgL
U1I+jsKZQOGc7TEundux5qHB1wjlxmlHZahGQgxvxQi04pphToLL4Y1KB9jAdpZB
XvH5bXuj+n3LhHcAYZAFQqtrQ/LBBI07nNhZ32uhTH6aH81APUDihDKTmTTn5Cm6
606iHqRsNNc+wdmnemRvQeEEzvj3orJjoHsGkgE58ECtkfBNw9ohSMmFgu/TwV+Z
srI2WnrGlBvfhRkHIzkPkcrTD238vFfoAUvTshOcGFQFQrcxxpb/73rIUI900uD9
BnudBEWHycIZkVUbqFkA6WQDz5URHjdAuUzPSbCaRhMKfE4mbB1cLIL3wfNfN1PB
aVo/AoIBAFISVR5sVewY2uBu9a4eb64p/30g+BaOmvhVt2gLfm65sCCLzYH4GjcW
ZI1IPvf7NtTfKa/RvNEGcGs2GYyWhUu4GlC5t3oKDyZo66oHSeM005nDbsMszaeQ
m1c0eGj8NsSf+3GHxTwVAtxwOlEkznxLE+dZADD49DJSG9B/FnG/0g6LGfOxSWRk
J3iQAUTriVRKcIxBmYe/BUxtyfkwEv3Wjc7W5LMRzT87pljd2i4jy1fxSqXCH9Wy
tButCdI31UcQdZ9jrPydCy5eJng087pHSMvsVHv/CDP3aka5HQU/tCMERsaFJKiS
l2qeGi6z5g40o9wd3s0sBaPePtZ7dUY=
-----END PRIVATE KEY-----

View file

@ -0,0 +1,164 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
spec:
tls:
- hosts:
- app1.example.com
- app2.example.com
secretName: secret-tls-app1app2
- hosts:
- app3.example.com
secretName: secret-tls-app3
rules:
- host: app1.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc-app1
port:
number: 80
- host: app2.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc-app2
port:
number: 80
- host: app3.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc-app3
port:
number: 80
---
apiVersion: v1
kind: Secret
metadata:
name: secret-tls-app1app2
data:
tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZPVENDQXlHZ0F3SUJBZ0lVREJia0hpY214OG5xVVFObmtEdngzMmhxbWlzd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERXFNQ2dHQTFVRUF3d2hZWEJ3TVM1bGVHRnRjR3hsTG1OdmJTeGhjSEF5TG1WNFlXMXdiR1V1WTI5dApNQjRYRFRJek1USXhOekV4TWpnME5Gb1hEVE16TVRJeE5ERXhNamcwTkZvd0xERXFNQ2dHQTFVRUF3d2hZWEJ3Ck1TNWxlR0Z0Y0d4bExtTnZiU3hoY0hBeUxtVjRZVzF3YkdVdVkyOXRNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FnOEFNSUlDQ2dLQ0FnRUEwUEU4Nk9waXlXU2dRbG0zMFNGNzM3Q003K05Jc1VuMGpvN1JaVW9CL3JtTQpqcnlXcnVRL0laT0g3VGpLeVBCZW1YKzkwcTU2RXhJUHRodUdLNlFUWkJHcHdOZEdMUkc3Z2h2S2VKU1dUa1p2CjhsWVd4L1JPU1FaNXhSYkpGTUR5WkF3amJoSmhMbFYydlYxOXZiQzVOa2diQm93U3BNendkOVlteTdVTGF6SVEKY1E3ZnJadTRCTmhMUTNhVHVOa3R4VDExdHV2STR6T0s2TWEwYW9CV0VNZ3lJL2xZcS9VNjF6TGMwTU9XVnRhMQo5TGxvNUFPOTBNTjUrNXBNMHhaUGd2Vk5zcndDeVdnYStjbC9veWtraW1tenhSTUE2N3QwMWV3OE1oZUs2ZkZDCjVzTHFRUHFTbWVsZ2tCL0ZmM2Vhb3hZaEdnV1lWeDZqT2c4OXp1VzY1d1ZiT1Zva3EwcG1sTFdlNDhFYTZvVGUKQUMvK1hxMlRXbnptLzNSSTEwWVNGVGR6Y3NscU84SDJlNFBhM295ajJrTms3SkU4R0hld0NBOVdMK1NJUDE4dApHdGJUQVhvblNIYXNlV3UxU3RlbG00M1YvTjJBVmlJTHY3YUJORkhKOGlHV3NPcVNqSkNWcXltdE9zbW9zWllaCnpvc0xTSXROclRHdFJUcWo1djVnc3luUXJuRWoyaE05bkZWT3NWU1RIbHRNT2ozOW5mcmtjRzcwVnNuMVo3ZEIKbWhtMWhJRGkwZlpTUGlMdzFvL1BzS2ROT2Nmbm1QWDRvbDR2VzQ4SGlsQkRJTlZhUUFKTVUwMTZKZ1NPZUJscwp0R2RDWldGY2VPZEV3VnkrMTJBVFBvbFNhWThSbzZOdEhXNXI2T05jSWtaaTlOY2N4amw1RVR6OVdhbGZ5SUVDCkF3RUFBYU5UTUZFd0hRWURWUjBPQkJZRUZIaVVFemFFSzZJdjZ6UU1vcHRoU09mWnBLNUpNQjhHQTFVZEl3UVkKTUJhQUZIaVVFemFFSzZJdjZ6UU1vcHRoU09mWnBLNUpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSQpodmNOQVFFTEJRQURnZ0lCQUF0WFVSRDRIVDNrTVNzY1ZCeXFVTTRpbkpjM3A4ZEdFQXhBUVJOQnhOM1ZPa3dBCm1lbHlSUTNTZUJVSktuRWxHVHRnTUlXN0ptRVBkWmRBY1FpVVoyVUVJN0FLaE1XQUNHZzZMQkdSTlhBVHAxc0EKR0F6UGdWcU5Wcyt4Mkl5aWY1a0U5eFdzcytWRTNQSDE3TE1KTWhxbHBLY2prcnJGd3RtdFJDMmExZkduREx0SwpVb2V3VUlqQy85cUVLeVNRczNleUNDYmpuSldEcHZKYVVyQnBJVXZqRkhIdXMvVU9ZbUN1N1VCeFNhMzFra3UvCmNWcEpWaTBmT0R5QTVWSDYwNkFTNGZSOVhRQkRGODBGWUg3ZHIramtYY01taDlGQWw1QXN2UGVQN25oY1gvbk0KZndsRUhUNi9UT1gweHc4YzVQK3NLbUpBU0J0L0x2YytwRld4TlJMbEY5U1djc2tYVDN3ZjVob3o4cVJTODlpcAo1NjdjUERxdU9IbUc0cWcyYzBmOEkybU5vbXhWbDRUVzRmalNxdHZzb0lRRERUenlYQkJHMXBNTWhRTU5jakdJCnR3cHVzSWRJUUhUa1I2aGVCZm1TakdTa2g2YzRiWHc0NFFXbDFrcTArdW91S0YyYUZhakFVbVJxM01DK3I2aVAKeWcxekJwUGtOTUlDZkN5ZWtoWTFOM1RIZlU5YmhFQnR2Yklxb2J1VEdwMk95ZWtCU2hPa3BYZmVMcDFoRElQaAoxMFJRVTNsekU0L2ZpcGphK3QvSWlCeEFKMjBNU3NIT0Z2UFJwWDJRNi83NTg0ZWd1QTVoQXNmbFF3MVBJWGo1CndPaTRjbTZ0eDN4Vld6aHVSSGE2b1VCdFNTL0lqUlg1NWxjV0ZFOHhZWHF1bHBITTJyUC9LQXNDS3UzTgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRZ0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1N3d2dna29BZ0VBQW9JQ0FRRFE4VHpvNm1MSlpLQkMKV2JmUklYdmZzSXp2NDBpeFNmU09qdEZsU2dIK3VZeU92SmF1NUQ4aGs0ZnRPTXJJOEY2WmY3M1Nybm9URWcrMgpHNFlycEJOa0VhbkExMFl0RWJ1Q0c4cDRsSlpPUm0veVZoYkg5RTVKQm5uRkZza1V3UEprRENOdUVtRXVWWGE5ClhYMjlzTGsyU0JzR2pCS2t6UEIzMWliTHRRdHJNaEJ4RHQrdG03Z0UyRXREZHBPNDJTM0ZQWFcyNjhqak00cm8KeHJScWdGWVF5RElqK1ZpcjlUclhNdHpRdzVaVzFyWDB1V2prQTczUXczbjdta3pURmsrQzlVMnl2QUxKYUJyNQp5WCtqS1NTS2FiUEZFd0RydTNUVjdEd3lGNHJwOFVMbXd1cEErcEtaNldDUUg4Vi9kNXFqRmlFYUJaaFhIcU02CkR6M081YnJuQlZzNVdpU3JTbWFVdFo3andScnFoTjRBTC81ZXJaTmFmT2IvZEVqWFJoSVZOM055eVdvN3dmWjcKZzlyZWpLUGFRMlRza1R3WWQ3QUlEMVl2NUlnL1h5MGExdE1CZWlkSWRxeDVhN1ZLMTZXYmpkWDgzWUJXSWd1Lwp0b0UwVWNueUlaYXc2cEtNa0pXckthMDZ5YWl4bGhuT2l3dElpMDJ0TWExRk9xUG0vbUN6S2RDdWNTUGFFejJjClZVNnhWSk1lVzB3NlBmMmQrdVJ3YnZSV3lmVm50MEdhR2JXRWdPTFI5bEkrSXZEV2o4K3dwMDA1eCtlWTlmaWkKWGk5Ymp3ZUtVRU1nMVZwQUFreFRUWG9tQkk1NEdXeTBaMEpsWVZ4NDUwVEJYTDdYWUJNK2lWSnBqeEdqbzIwZApibXZvNDF3aVJtTDAxeHpHT1hrUlBQMVpxVi9JZ1FJREFRQUJBb0lDQVFDdG5oY256ME5nNTMySFJMZktUaEY1CnNXR2JIL2hTWVFxV3ZyUGVmNTJpeFJtM3JadGtIZ01iYWxURFdMS2dQNlBMMXVxcnV4Rnk4VW9lMzBZZzAwak4KbVNPK091TjBKY3p5Y3hkT0ZPSEVqeUVNZEY2ZnJqQ3kyMitweHFJMTNaSk1jZzJxdEJrT2dET1hiSzFFUnluUApvaURhMHQvWEV2Z3FDOGZXODB4V3VaWVI2L01QZGxwMXBDaitHUFRzMzRINTZIVDlGM1dvM1RacThGb1FPUzNLCjZoOUg1elM0UnFDckd2ZURmVkphUERXYjhjam4xdmdPRmJBeDBtaE42cmNOTWJwcmIzQzlYUVUxVkNyOEwvN08KQ01FNVcrNGk4M1JGSWZSdkIwTUYyOVRrblVnNzBEcXJLOUp5VUFRelEvWTUxL1NQZytDdlc2VDBaSi9PWVBSbwo3SGZOR2sxK3lob3Uyd3ZabkM5T3FJOTh0WkJuaU81ZkVkY1VDZ3VhWlpXVzdqd01wT05rMGNJOHNtNk5vV3B5CnVpSWIyVzVqTmxPcFhxQngvMHZlZWpmRHRmc283TXZrUFkvaHdwcHcrK0RZMzMxYXUycnNMc0RiWFV4OTZTT0oKZDdQeWZsWE5qcnJ6U1RPNVg2VXlRaVlObDEvRWFCUWpRTi9SOVl4eUMydVMrVXNNNVVlc0I1VGcrK2pFUjZITAptVDZjY2NFNVlMamJkVGZUOVREdmdOSWdCMnRTMW1uQnZJNG5PYmFNWC9KdUFTeU1ZVUVvUVFzaU5QdHVFbHFDClU3RFhrZ01LSGQ2cWxyc1ZNeHJJeWloM1VOanR5UVpCUWNva1A0VWNXNWhJelRMeXJOUHlCU3poNlFVYnM0S24KbEw5UHlZWWNERVhsTVAzMGkrTTNBUUtDQVFFQTdjY2dqTVlJWXEycXY4WC9HMTVabVdkdzUrSHoxNlM1OEt6RQpuMG1WRjRIdDE2bUJEZnJRdmUwaDVubjYvaDMzYmZmcGd4S2lnbU0wYit2RXpnUHRQU2xOaGFMQ0U0S3Q3U1puCk51UlZISjc0bkhYc1RpK1owWlNrZ2VLd0JSbWppNVRON1BCRW9WZGFFeGhNL3FHbndHN3g1Q1FOTFEwTzF3MkoKNWI2eXdHbmdoamxoSFJJNXVHZG1IeTJuNk41UmozN09GckxWT0xkRWV4eTM1MW9nWlk3NDY3M0JYR1ZqTE5lMgpVTU02Q2F6RTAwZ0R3S3Ywck9uaVp2NzMyTzhNVmFPTVI2Q1lHM3o3VGdmVkdFU1dTMW1FR1Rya2JMZ0diVDRYCm5hR2hVSDkwK0FLWndEMkxtTUpQYlFSNVBod2NtYUN4L3hnUGoxUldSbDR6ZW1EanNRS0NBUUVBNFBSbDQxV2QKWWlpcmdjNDFvWEMzaGsvY010Q3N6K0N6OFdMN3BDUkpMM2h2WC9aKzdQcDZlTWVpSEJuYU9ialpOVVkvZUMrcwpJMWk0dENTaE1ucVNkZG0vWW52Z2lTMVVzREYyTjRYbTBvUjBQZkswamNRRHEvSVl5eENKbXA1NlpKOHkxYzVXCnY5d3ZKKzdVL0FFTGp1cWtHaVowdzB3REd0ZE5kRlZiVVNqeWYzODVEbXEwRDE5cnJsM1k5T21vRGFFQ1lWZFMKTDcvOGhqSWdtVDA5K1lyZjA1K0lsRW8vZjZhUGpNMXhpNldZQzMrYVFPcDN5alc2b1NQRVpadWMyV2ZWeWhzcwpBaURTd2JxdTFueFM1V3N3T1RHS21pcmwzYnRBQ2FmT0s4eC9jemVvcU04V2pqdThIQUcxYnRsVVQ0QnpMTlZrCkdaUjE0aUpjRnhaMTBRS0NBUUJyaTZjelJOYkNHeDZod3FJUjlPaTlzOFdqZTlWWWNjOFFCblNnUHgzS0ZpQkgKYlFsTUUyZWFuOGkzZi9DQVEzbUlLWnRhaDNFdFhFVjVZY0FRRmtLVmFUc0ErSTZqV0hYbVQzcGJuNGJIZlRlaApQTXoyeUJ6Z2FFVEg0b29PcEh3T1ErMm4venhyWlNEK2hmMDlKa3pEZ3VxeGI0VHVIWHZhMU9yTUdTYXNWTGNTCnZwMG9Fdmc4YWJnTTNnK1dDZ2dGeVNyWnBXVS9VOVVMZ2YvRUNrV2c2YnU0bElrQ2kzRUI5VWNtM0VaQjNmemcKT3pCSFV2OUZ2anVDcmt2WHVMZHhmSm1VUkJUSVNnMDRTOTZjTFZsMUZ6WGlXM3E1bWJwK2Fwa3YyTTBucFo1NApGbVVJU0UzOWQ5V0l6Mzh2RW5QMUlIT2hsM1ppTTVrYUZyMWQycmpoQW9JQkFHT3RCMFIvR0JoNWF0MCtjTmNTCjZjN3lyZUE2UklocnlXL0k2eldrK21TMVdheE12WnJsdGNTMHVHajVMNC9xRHh5aS90YVRVUlBzYVJNeE05ZjUKSmRKZ1pJUVAzY01LdWY3RU85eUlVV213VlExcDhJVHNlTEFFdXVXbmMwRjJ2VWErbjdqTEQvYzlhZ3Vvc09qawowYWxHNE9YUmFtVnExZWxid3k4cjd5VjhIazlPSVFyNVRzV05BMXFrck5DQWcvMWQvWDhDUVNGMVVVQnBEN2EyCnd6SkNUY0VvYkUxQXhQZ2I1bmwrUXJTYzhFMFFBbHFIU2dMb1ljU3E0NGdlTnBiQ2dxRmwvczhHbWp4TEt0TlIKRFM0b201cU1FQjBWcXZyZjBKVTJySTBOdE45cHB5cjliOElnUjg2bEZ5NkJ6L0RXT3JKLzd6WENhYVdFa2dlTQo1VEVDZ2dFQUtTdmxvUjlwVm0wbnp2TjNlNFh0amowMXJWVVpPVTY2N2xVVDNUQWVEeWNUVExLNHRYc1lSNDdWCm9sRG1Ld0lON1lML1U2V0FtMUNsRStER01udDI3aEtlSUJjdEtKWGlpSXFLN2hsQUFPbWs2bkNXVVhVN3lDZ2IKUmtWOURUWEhRNGdFdHpnVTBreDByOXBUeWRjMTlyTUFhbmw3ZmdpTlVOYytSY0hlTlNIOWhvV1BUR3BPYjVPbQpSNEx1QUpTZXdNZHRuWUZhN1h1M1A3UWpUN2IwZDdBUkduRjFPcmpLQTlOcW02NUQzYmg4aGxpa0FOckdrTStrCnBQTTJCSmlUbmg2dkxZTWg1VEJNU0ZOTEpQVUtJdHlUYUl6MkNWRmRXRTVpcFYzVVBqajhiZVlzRkR0MjRYbUMKRkk4OGc3YUNKSGxQMnd2dXlaaVBuT3RDZEdWVkt3PT0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=
type: kubernetes.io/tls
---
apiVersion: v1
kind: Secret
metadata:
name: secret-tls-app3
data:
tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZGekNDQXYrZ0F3SUJBZ0lVRVRYeG9iZmx4V2huSElML3U3S0JSRS95NGVzd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0d6RVpNQmNHQTFVRUF3d1FZWEJ3TXk1bGVHRnRjR3hsTG1OdmJUQWVGdzB5TXpFeU1UY3hNVE13TVRkYQpGdzB6TXpFeU1UUXhNVE13TVRkYU1Cc3hHVEFYQmdOVkJBTU1FR0Z3Y0RNdVpYaGhiWEJzWlM1amIyMHdnZ0lpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREVxNk9DU0NzM1V5c3dxNHNIOEZXZmQ0b1IKc3NYL3FJenU1RndUanB2RktPYS9kK2I2cm5XQzJTUjZSS0ttUjQ3YndHQngyanZRSU9aMTE4dGEwckt0d3MwRgpBSFlYZ3d4VHB1bGp6M3ZFU3J5Ylh4VUE3UG1qaW9nMnp2R2tLSUtIQU9aZGp3UmJEUUJ2Y2VvY3VyQ2hLbjNWCnQ4Q2pLU0dlY3E2cU40ZGgweFB3RUlXQXNJcElzbnJNU0kzSmJqQ0RsVWU3U0tFY1dZS2NGWmZnbTcxS0JZbkQKZ3dUVEZhUm56clZXTHl2cUovd2ZRbGRDem1iR0o1Y1I2Q3NGOUtldS9LUWVsSnhRQTlTRXFxeEx6VTA0ZEhPQgp3WUpWeUJXTDZtMnVkaDZxV1JSUDNGd0FkWDZRQjljVDBxbC9Kd3hpclMvK2tCbUhBS1M4SytpVHhsN0p6YUR3Cmh4d2ZqSmtUTml3M21NbnZhaDZMN1NIQUtWZDUzVVh0MWxjNnZzejAyLzRjSWlOeENBL2s5VEtXd1liNm9nbDAKTWVuUFBqZm1TRHAyekVIWDlGUC94Ykpnbk85d1Bkek8xblFyVktGUnluckM1dGxubXpVOURLcG4rZGZsS3ZtUQovaHFGd3UvL1pVbkNmeUFwZHJ0RjdJQ2orbW5nSmtEOE02YUo0QUxEaFhwT2pQeklNeExlL2IrdkFyUGhPVklqCkNFVVNVZzZ1M2VEdWtzS0tTKzBmQlpncnJZaEhwQk5OaUxYekQ3ckFYb0FLT1dvckFnc2hkU2xzTGJXY0VmbTcKUmhpd1hJZnFLL1lrazBZT1FSTGxvd1JKdUhVMTd3KzhuZm5HejgwR0w5Wk4wNkFFM283dUNMZW00RlMwV0syMgozSThXS0pXWTNvcGpENkZkeVFJREFRQUJvMU13VVRBZEJnTlZIUTRFRmdRVW55VXlmWm10YzF6MEF0U284QVMyClNIa2xjVjR3SHdZRFZSMGpCQmd3Rm9BVW55VXlmWm10YzF6MEF0U284QVMyU0hrbGNWNHdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBbjRPUDlHTmVVbDQyVDFtUGV3UWE4eDFqYkZqLwprbEFMY1kxb25yVUZicExIY2VGbGp5T0xrREwrWHVmWEdaODQyaDEvZzRQVkZRWmxDa3U2cVVhU05jOXB6NkpYCjQ4b2xoSk9EVjQrSFpYaDNLVXBDREJYTnh5d25uS3crZEY2MGltRFBwN1RkTDJ3ZENTWkF5SDdwa2JGbFhzUFUKQjlTV0xlbXlyL2FYKy96M3FEN09DNnExc0hIOWg3YXNSWGJYeWNvd1JPWm96RENTVlFLSVRDOFA0YXZ6YkxKOQp5clVnakh5ajJ5bXhNVU9HczY1Zm5LcjEveHJNTGpZeWpOOHY5T01WRWgwMitxTzRwT2h6NFdDRUV1cjF6SUMxClgyNFlVaG5YNFFOSjRRaTFxd2lkQWJCSVpyWHQ0UFcyaTRNdzJlUU8xUlUxdzgxcHo4dlk3MjVsMkd5Z0ZHM04KRGhFa0FkSUxKOTlLVU4wWWxVN0JBUHNDVTVwZSt1QTQwdUJlNU90aTlQQWxFbnZINGk0OXAzNEpLalo0cTMwZQpGSXk1Vmp1Q2ttVmxTelVmUlFoWjhRUnoyaGRLL2hKWTZQd282M1VQN01iMXR1cDhobUVjZlpBVG90TWpVSzRVCmQrQlllNk9GdzUwczJzNnVNaVZ1dTJXYjJzV3NQNWdPazlTa2FDS2J2UWE0TWl1L2tXS2J2VDlQYjgxdTU0NHQKWG9xVk8yZDgzdU9tNUZUTStnRmdNRHRKREsvcG9xSVhobzZNRG5VRVMxU29VWmdZMlhSSExPQnZDQW1zOVNJVwpIQ3picnpTcXM4UDZVeGFpVjU5SHQzdG9ML3hRbVIvc2tmcm4vUVVZZHNTaDlkdE9TdGtIVU96emVwa1Ryb2owCk1aVWIyRm5TaWtXQnpjST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRREVxNk9DU0NzM1V5c3cKcTRzSDhGV2ZkNG9Sc3NYL3FJenU1RndUanB2RktPYS9kK2I2cm5XQzJTUjZSS0ttUjQ3YndHQngyanZRSU9aMQoxOHRhMHJLdHdzMEZBSFlYZ3d4VHB1bGp6M3ZFU3J5Ylh4VUE3UG1qaW9nMnp2R2tLSUtIQU9aZGp3UmJEUUJ2CmNlb2N1ckNoS24zVnQ4Q2pLU0dlY3E2cU40ZGgweFB3RUlXQXNJcElzbnJNU0kzSmJqQ0RsVWU3U0tFY1dZS2MKRlpmZ203MUtCWW5EZ3dUVEZhUm56clZXTHl2cUovd2ZRbGRDem1iR0o1Y1I2Q3NGOUtldS9LUWVsSnhRQTlTRQpxcXhMelUwNGRIT0J3WUpWeUJXTDZtMnVkaDZxV1JSUDNGd0FkWDZRQjljVDBxbC9Kd3hpclMvK2tCbUhBS1M4CksraVR4bDdKemFEd2h4d2ZqSmtUTml3M21NbnZhaDZMN1NIQUtWZDUzVVh0MWxjNnZzejAyLzRjSWlOeENBL2sKOVRLV3dZYjZvZ2wwTWVuUFBqZm1TRHAyekVIWDlGUC94Ykpnbk85d1Bkek8xblFyVktGUnluckM1dGxubXpVOQpES3BuK2RmbEt2bVEvaHFGd3UvL1pVbkNmeUFwZHJ0RjdJQ2orbW5nSmtEOE02YUo0QUxEaFhwT2pQeklNeExlCi9iK3ZBclBoT1ZJakNFVVNVZzZ1M2VEdWtzS0tTKzBmQlpncnJZaEhwQk5OaUxYekQ3ckFYb0FLT1dvckFnc2gKZFNsc0xiV2NFZm03Umhpd1hJZnFLL1lrazBZT1FSTGxvd1JKdUhVMTd3KzhuZm5HejgwR0w5Wk4wNkFFM283dQpDTGVtNEZTMFdLMjIzSThXS0pXWTNvcGpENkZkeVFJREFRQUJBb0lDQUJ4bEE0aHR6djkvM0g1OFplaFJoS3N2CllSbkpDOWtyaHAxL0R1UXI5TVYwY0V3NGpYcW44WU5nd21sOHUxYnlnZWVzVU1CZlY3OW00SjhtOXM4NEdHQUoKL2Z1NDQxUGxzY1BxRjB3M3lwQytrWmlGRTgwOGFaWjVDODJOOTBsU0ovWkI1UUNoQTJuNTZKUXVpRFI1cDhLOQpGY25qYThhaXk1M0t4UGtDWjJOeVREQ2UwZ2VRZFlhbGJpRk1ZRnd5c29KczdSeFhFaHU3dUtXOFlGOG5YUjd3CnljRVdpMzNHWkNRd3JmR3hnYytlMGtIWkhDd2pES2VUVTdaY0pNb0pWcVJuQ1hMNDFkQ2ZuUEZDaXZtdXZIVm8KS3IwVEtUUWxYU2NFUTYycWxDYllFWnl1SGdKYTlGanJLTnhOei9ieHRsSVEyeHNQeHYrODBndnc4dlZTOEtCRgpLS1pRNVI3U3VDVDF0R3ZlSGszTUVPOHlVWGorTE5CNEg0eE5LNUxIY0JjNVpGSDVtY29wNWtrazRyblIrMXBLCkxGSDFqcHkxdmRORUFlSE5LYkpBeHJlYzFaNE5LczRMd3Y2bjUvYjRFc29Gd05sRk05SUo2ZE5xaWpNSlhsc0MKSXQ5Ynl5aktwY1kvOHc4OUVnTjAwYWFlNHhQU0JKVFFVL2dGZ25VSm1QK1lENmk3QjMvV0NzWmZuRmV1ajdxTQoyVDhReGhmNVI0L2FOT3FmMG1DeVYxNEhtZ2xGeWdBelRpbi9lNWZpRUExUGs4YmMzK0NIV21tZk5JVVJxMmtyCmdRT2c1azZSNDZQLzkzekxzNmtaeUxENFVMLzdrbjJyT0lJbFFxcmJpdHlhSXBwVU5rYTdreGNEN2gwUit5SlcKbEtMVE1vRUhQaW5rYU0yWDEyNVpBb0lCQVFEMVpaN2VlVHNJZFc1QWNHK1UxSjY5MFNHdTAzTUhRQXlaK2EwTApXT2hWSm4yMWxFdUNUQ3UwZEtjTlNYRVQ1WkxrelVtWHQwVUtKMjBJWkwxQXo3Y0Rla052dE5vVEZEWXJsMWU3CnVINTJUdW9VeHhpQU5rRGxUbTVkU3FBNDRmbHpOdEcxclBjak5CYlc2SVJXQVVRR1N6T1dQekpIQU8ySDRXYTQKbTFtMFl6d0Z6OFBDNUExL05YOC9CSHNUWWlJRnNtZjNvMUk2TTNIbnJxSGtmdFptSVZLYXRhUlphZERMcGJUcAo0MjZrcFk4V25uVjl1ZFhNUEhtdkJaK1Aza0tqS2M5OW9ZL3U0bXRuUFJlQmowTEl6KzNTbWM2Y1Vwa2RxL0VJClZLMnhDdkZtL3VKTjkzaUxQeXgySEpVZitidS9mK0d2SDhGejhLQ2UvMFBwS0N2N0FvSUJBUUROS3d1MGpsYUkKWTBtdHJKWnZYVVBXdEszWk5VUTI0QnVWY0N2aTk5UjM5MWYrK29aK2c4aWIxU3FxTEdObVkzREo0V3NiTHRwaQo5dG9QRExUNG1nWkFVRWhqUkxZK1MwSWVYVFZ4ZE4vSk9aNmVNYW15TTN4NzVlZldQSUxoeExrNEFlaWJHSWhhCkw1TG4yQ1dsRGpjN21HWk5qVW4wSGJYdmR3RXREbmxob0FuRkRwS0NPeEVGdCtyMmNrZTNEMFN0cG5GZGNEZnAKakw4Tkhtc1NQQnoyVEZ0TWh0Y3prRkIvMXBjNUdyZiszTGVtSFFtS3BPQ2ZGUWNTK1ZDSTFVVTVnZmhrcjZJUwp5Y0N2dmRpb1N3bW9scWhhQnp1Zzl5Q3gxcFVMOXMyRmFpV0lNenZ2c3k2M2xaa0VDOTAwOVp5NXJHbzBSV044CkhyNUhsbEtYczA0TEFvSUJBUURQSHlWM1cxVnpMMEtPU3hneXd6NzBzWlkvYkNOVGhFRGVtVGp3TWV0dksxekIKTE5pS3NtWFZHdnlBbjNNOHV2RkFBdkZSaDVOVEhiSE9ldEN0Nm1QcklIL1l3Z21xUHMzMS92aEM3bFoyM3VaKwpBUWx4OWRqU2NsOStpR1V4ZmJIQkNBejZ6WEdPbWdHSkJKbmx5WTJ6empkTllpdTZlRk1EOUVCeUlsVVZod2g3ClUwQkV0NTJZdC91ZG9kZUxwYkZYbzV4VEROdHpXa2FTcVBmbDF4UjVBVGtxY1pPMUVEWDJIUGZVeld4dXRYcFAKT2hHcXUzWnp1cnR0K1U0UzdTTExlcGV4enZLZ1N5VWg3eE51L0E3L1ZWakMvNlMrbG95NzJZdElYOGgyZk9rQgo2TEh6NHFNd3pISm5nbnB2a2FaZzNMd014cjNPY05QeFB6ei9oek9QQW9JQkFRQ1E2czNLekJ0ZEhOeUcrdmdMClUxSStqc0taUU9HYzdURXVuZHV4NXFIQjF3amx4bWxIWmFoR1FneHZ4UWkwNHBwaFRvTEw0WTFLQjlqQWRwWkIKWHZINWJYdWorbjNMaEhjQVlaQUZRcXRyUS9MQkJJMDduTmhaMzJ1aFRINmFIODFBUFVEaWhES1RtVFRuNUNtNgo2MDZpSHFSc05OYyt3ZG1uZW1SdlFlRUV6dmozb3JKam9Ic0drZ0U1OEVDdGtmQk53OW9oU01tRmd1L1R3VitaCnNySTJXbnJHbEJ2ZmhSa0hJemtQa2NyVEQyMzh2RmZvQVV2VHNoT2NHRlFGUXJjeHhwYi83M3JJVUk5MDB1RDkKQm51ZEJFV0h5Y0laa1ZVYnFGa0E2V1FEejVVUkhqZEF1VXpQU2JDYVJoTUtmRTRtYkIxY0xJTDN3Zk5mTjFQQgphVm8vQW9JQkFGSVNWUjVzVmV3WTJ1QnU5YTRlYjY0cC8zMGcrQmFPbXZoVnQyZ0xmbTY1c0NDTHpZSDRHamNXClpJMUlQdmY3TnRUZkthL1J2TkVHY0dzMkdZeVdoVXU0R2xDNXQzb0tEeVpvNjZvSFNlTTAwNW5EYnNNc3phZVEKbTFjMGVHajhOc1NmKzNHSHhUd1ZBdHh3T2xFa3pueExFK2RaQURENDlESlNHOUIvRm5HLzBnNkxHZk94U1dSawpKM2lRQVVUcmlWUktjSXhCbVllL0JVeHR5Zmt3RXYzV2pjN1c1TE1SelQ4N3BsamQyaTRqeTFmeFNxWENIOVd5CnRCdXRDZEkzMVVjUWRaOWpyUHlkQ3k1ZUpuZzA4N3BIU012c1ZIdi9DRFAzYWthNUhRVS90Q01FUnNhRkpLaVMKbDJxZUdpNno1ZzQwbzl3ZDNzMHNCYVBlUHRaN2RVWT0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=
type: kubernetes.io/tls
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app1
labels:
app: app1
spec:
replicas: 1
selector:
matchLabels:
app: app1
template:
metadata:
labels:
app: app1
spec:
containers:
- name: app1
image: tutum/hello-world
ports:
- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app2
labels:
app: app2
spec:
replicas: 1
selector:
matchLabels:
app: app2
template:
metadata:
labels:
app: app2
spec:
containers:
- name: app2
image: tutum/hello-world
ports:
- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app3
labels:
app: app3
spec:
replicas: 1
selector:
matchLabels:
app: app3
template:
metadata:
labels:
app: app3
spec:
containers:
- name: app3
image: tutum/hello-world
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: svc-app1
spec:
selector:
app: app1
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: svc-app2
spec:
selector:
app: app2
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: svc-app3
spec:
selector:
app: app3
ports:
- protocol: TCP
port: 80
targetPort: 80

View file

@ -0,0 +1,26 @@
{
"name": "kubernetes-ingress",
"kinds": ["kubernetes"],
"timeout": 60,
"delay": 60,
"tests": [
{
"type": "string",
"url": "https://app1.example.com",
"string": "hello",
"tls": "app1.example.com,app2.example.com"
},
{
"type": "string",
"url": "https://app2.example.com",
"string": "hello",
"tls": "app1.example.com,app2.example.com"
},
{
"type": "string",
"url": "https://app3.example.com",
"string": "hello",
"tls": "app3.example.com"
}
]
}

View file

@ -4,7 +4,7 @@ metadata:
name: cr-bunkerweb
rules:
- apiGroups: [""]
resources: ["services", "pods", "configmaps"]
resources: ["services", "pods", "configmaps", "secrets"]
verbs: ["get", "watch", "list"]
- apiGroups: ["networking.k8s.io"]
resources: ["ingresses"]

View file

@ -4,7 +4,7 @@ metadata:
name: cr-bunkerweb
rules:
- apiGroups: [""]
resources: ["services", "pods", "configmaps"]
resources: ["services", "pods", "configmaps", "secrets"]
verbs: ["get", "watch", "list"]
- apiGroups: ["networking.k8s.io"]
resources: ["ingresses"]

View file

@ -4,7 +4,7 @@ metadata:
name: cr-bunkerweb
rules:
- apiGroups: [""]
resources: ["services", "pods", "configmaps"]
resources: ["services", "pods", "configmaps", "secrets"]
verbs: ["get", "watch", "list"]
- apiGroups: ["networking.k8s.io"]
resources: ["ingresses"]

View file

@ -4,7 +4,7 @@ metadata:
name: cr-bunkerweb
rules:
- apiGroups: [""]
resources: ["services", "pods", "configmaps"]
resources: ["services", "pods", "configmaps", "secrets"]
verbs: ["get", "watch", "list"]
- apiGroups: ["networking.k8s.io"]
resources: ["ingresses"]

View file

@ -4,7 +4,7 @@ metadata:
name: cr-bunkerweb
rules:
- apiGroups: [""]
resources: ["services", "pods", "configmaps"]
resources: ["services", "pods", "configmaps", "secrets"]
verbs: ["get", "watch", "list"]
- apiGroups: ["networking.k8s.io"]
resources: ["ingresses"]

View file

@ -4,7 +4,7 @@ metadata:
name: cr-bunkerweb
rules:
- apiGroups: [""]
resources: ["services", "pods", "configmaps"]
resources: ["services", "pods", "configmaps", "secrets"]
verbs: ["get", "watch", "list"]
- apiGroups: ["networking.k8s.io"]
resources: ["ingresses"]

View file

@ -1,12 +1,12 @@
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View file

@ -8,9 +8,9 @@ ansible==8.6.1 \
--hash=sha256:18b397580c1f05ce5de1fe238508dd81218d278667956d2f7709320176c3ed4a \
--hash=sha256:222735c32d2d2749f207e55ef740638bb97c7aaaa8b63bb7c7592d447da47584
# via -r requirements-ansible.in
ansible-core==2.15.7 \
--hash=sha256:8a7988b8fbd1f4bb5799becae120b828de6248ba9056d83f427235533d655e2b \
--hash=sha256:bc51d011bdb67538d1ee043e0f8072b3a849b78897caf15b6f294160c5c7c6ba
ansible-core==2.15.8 \
--hash=sha256:55e6f4350fb98ac5441620ba981b1d9f7b90aa5f320885965af996e149bd3caa \
--hash=sha256:8aa49cb1ddbf33d88c2bb4bf09ecd4b0dd8b788e174adca8b88dda6e6bdbf59b
# via ansible
cffi==1.16.0 \
--hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \

View file

@ -1,7 +1,7 @@
site_name: BunkerWeb
site_name: BunkerWeb documentation
site_url: https://docs.bunkerweb.io/
repo_url: https://github.com/bunkerity/bunkerweb
site_description: Make your web services secure by default.
site_description: Documentation of BunkerWeb, the open source and next generation WAF.
copyright: Copyright &copy; <script>document.write(new Date().getFullYear())</script> Bunkerity
#remote_branch: ?
#remote_name: ?
@ -69,5 +69,9 @@ extra:
plugins:
- search
- print-site
- social:
cards_layout_options:
background_color: "#0b5577"
color: "white"
- mike:
canonical_version: latest

View file

@ -1,4 +1,4 @@
FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 AS builder
FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 AS builder
# Copy python requirements
COPY src/deps/requirements.txt /tmp/requirements-deps.txt
@ -34,7 +34,7 @@ COPY src/common/helpers helpers
COPY src/common/settings.json settings.json
COPY src/common/utils utils
FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8
FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8
# Set default umask to prevent huge recursive chmod increasing the final image size
RUN umask 027

View file

@ -121,10 +121,6 @@ class IngressController(Controller):
location += 1
services.append(service)
# parse tls
if controller_service.spec.tls: # TODO: support tls
self._logger.warning("Ignoring unsupported tls.")
# parse annotations
if controller_service.metadata.annotations:
for service in services:
@ -142,6 +138,36 @@ class IngressController(Controller):
variable = variable.replace(f"{server_name}_", "", 1)
if self._is_setting_context(variable, "multisite"):
service[variable] = value
# parse tls
if controller_service.spec.tls:
for tls in controller_service.spec.tls:
if tls.hosts and tls.secret_name:
for host in tls.hosts:
for service in services:
if host in service["SERVER_NAME"].split(" "):
secret_tls = self.__corev1.list_secret_for_all_namespaces(
watch=False,
field_selector=f"metadata.name={tls.secret_name},metadata.namespace={namespace}",
).items
if not secret_tls:
self._logger.warning(
f"Ignoring tls setting for {host} : secret {tls.secret_name} not found.",
)
break
if not secret_tls.data:
self._logger.warning(
f"Ignoring tls setting for {host} : secret {tls.secret_name} contains no data.",
)
break
if "tls.crt" not in secret_tls.data or "tls.key" not in secret_tls.data:
self._logger.warning(
f"Ignoring tls setting for {host} : secret {tls.secret_name} is missing tls data.",
)
break
service["USE_CUSTOM_SSL"] = "yes"
service["CUSTOM_SSL_CERT_DATA"] = secret_tls.data["tls.crt"]
service["CUSTOM_SSL_KEY_DATA"] = secret_tls.data["tls.key"]
return services
def _get_static_services(self) -> List[dict]:

View file

@ -13,6 +13,7 @@ function plugin:initialize(id, ctx)
local current_phase = ngx.get_phase()
for _, check_phase in ipairs {
"set",
"ssl_certificate",
"access",
"content",
"header_filter",

View file

@ -680,6 +680,7 @@ utils.get_phases = function()
"init_worker",
"set",
"access",
"ssl_certificate",
"header",
"log",
"preread",
@ -692,6 +693,7 @@ utils.is_cosocket_available = function()
local phases = {
"timer",
"access",
"ssl_certificate",
"preread",
}
local current_phase = ngx.get_phase()

View file

@ -23,7 +23,9 @@ server {
# include LUA files
include {{ NGINX_PREFIX }}set-lua.conf;
include {{ NGINX_PREFIX }}ssl-certificate-lua.conf;
include {{ NGINX_PREFIX }}access-lua.conf;
include {{ NGINX_PREFIX }}header-lua.conf;
include {{ NGINX_PREFIX }}log-lua.conf;
# include config files

View file

@ -0,0 +1,94 @@
ssl_certificate_by_lua_block {
local class = require "middleclass"
local clogger = require "bunkerweb.logger"
local helpers = require "bunkerweb.helpers"
local utils = require "bunkerweb.utils"
local cdatastore = require "bunkerweb.datastore"
local cclusterstore = require "bunkerweb.clusterstore"
local cjson = require "cjson"
local ssl = require "ngx.ssl"
-- Don't process internal requests
local logger = clogger:new("SSL-CERTIFICATE")
if ngx.req.is_internal() then
logger:log(ngx.INFO, "skipped ssl_certificate phase because request is internal")
return true
end
-- Start access phase
local datastore = cdatastore:new()
logger:log(ngx.INFO, "ssl_certificate phase started")
-- Fill ctx
logger:log(ngx.INFO, "filling ngx.ctx ...")
local ok, ret, errors, ctx = helpers.fill_ctx()
if not ok then
logger:log(ngx.ERR, "fill_ctx() failed : " .. ret)
elseif errors then
for i, error in ipairs(errors) do
logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error)
end
end
logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")")
-- Get plugins order
local order, err = datastore:get("plugins_order", true)
if not order then
logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err)
return
end
-- Call ssl_certificate() methods
logger:log(ngx.INFO, "calling ssl_certificate() methods of plugins ...")
for i, plugin_id in ipairs(order.ssl_certificate) do
-- Require call
local plugin_lua, err = helpers.require_plugin(plugin_id)
if plugin_lua == false then
logger:log(ngx.ERR, err)
elseif plugin_lua == nil then
logger:log(ngx.INFO, err)
else
-- Check if plugin has access method
if plugin_lua.ssl_certificate ~= nil then
-- New call
local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx)
if not ok then
logger:log(ngx.ERR, plugin_obj)
else
local ok, ret = helpers.call_plugin(plugin_obj, "ssl_certificate")
if not ok then
logger:log(ngx.ERR, ret)
elseif not ret.ret then
logger:log(ngx.ERR, plugin_id .. ":ssl_certificate() call failed : " .. ret.msg)
else
logger:log(ngx.INFO, plugin_id .. ":ssl_certificate() call successful : " .. ret.msg)
if ret.status then
logger:log(ngx.INFO, plugin_id .. " is setting certificate/key : " .. ret.msg)
local ok, err = ssl.set_cert(ret.status[1])
if not ok then
logger:log(ngx.ERR, "error while setting certificate : " .. err)
else
local ok, err = ssl.set_priv_key(ret.status[2])
if not ok then
logger:log(ngx.ERR, "error while setting private key : " .. err)
else
return true
end
end
end
end
end
else
logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method ssl_certificate() is not defined")
end
end
end
logger:log(ngx.INFO, "called ssl_certificate() methods of plugins")
-- Save ctx
ngx.ctx = ctx
logger:log(ngx.INFO, "ssl_certificate phase ended")
return true
}

View file

@ -1,7 +1,6 @@
{% set os_path = import("os.path") %}
{% if USE_CUSTOM_SSL == "yes" %}
{% if os_path.isfile("/var/cache/bunkerweb/customcert/cert.pem") and os_path.isfile("/var/cache/bunkerweb/customcert/key.pem") or os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/cert.pem") and os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/key.pem") +%}
# listen on HTTPS PORT
listen 0.0.0.0:{{ HTTPS_PORT }} ssl {% if HTTP2 == "yes" %}http2{% endif %} {% if USE_PROXY_PROTOCOL == "yes" %}proxy_protocol{% endif %};
@ -10,16 +9,18 @@ listen [::]:{{ HTTPS_PORT }} ssl {% if HTTP2 == "yes" %}http2{% endif %} {% if U
{% endif %}
# TLS config
{% if os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/cert.pem") %}
ssl_certificate /var/cache/bunkerweb/customcert/{{ SERVER_NAME.split(" ")[0] }}/cert.pem;
{% else %}
ssl_certificate /var/cache/bunkerweb/customcert/cert.pem;
{% endif %}
{% if os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/key.pem") %}
ssl_certificate_key /var/cache/bunkerweb/customcert/{{ SERVER_NAME.split(" ")[0] }}/key.pem;
{% else %}
ssl_certificate_key /var/cache/bunkerweb/customcert/key.pem;
{% endif %}
ssl_certificate /var/cache/bunkerweb/default-server-cert/cert.pem;
ssl_certificate_key /var/cache/bunkerweb/default-server-cert/cert.key;
# {% if os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/cert.pem") %}
# ssl_certificate /var/cache/bunkerweb/customcert/{{ SERVER_NAME.split(" ")[0] }}/cert.pem;
# {% else %}
# ssl_certificate /var/cache/bunkerweb/customcert/cert.pem;
# {% endif %}
# {% if os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/key.pem") %}
# ssl_certificate_key /var/cache/bunkerweb/customcert/{{ SERVER_NAME.split(" ")[0] }}/key.pem;
# {% else %}
# ssl_certificate_key /var/cache/bunkerweb/customcert/key.pem;
# {% endif %}
ssl_protocols {{ SSL_PROTOCOLS }};
ssl_prefer_server_ciphers on;
ssl_session_tickets off;
@ -30,5 +31,4 @@ ssl_dhparam /etc/nginx/dhparam;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
{% endif %}
{% endif %}
{% endif %}
{% endif %}

View file

@ -0,0 +1,132 @@
local class = require "middleclass"
local plugin = require "bunkerweb.plugin"
local utils = require "bunkerweb.utils"
local ssl = require "ngx.ssl"
local customcert = class("customcert", plugin)
function customcert:initialize(ctx)
-- Call parent initialize
plugin.initialize(self, "customcert", ctx)
end
function customcert:init()
local ok, err = true, "success"
if utils.has_variable("USE_CUSTOM_SSL", "yes") then
local multisite, err = utils.get_variable("MULTISITE")
if not multisite then
return self:ret(false, "can't get MULTISITE variable : " .. err)
end
if multisite == "yes" then
local vars, err = utils.get_multiple_variables({"USE_CUSTOM_SSL"})
if not vars then
return self:ret(false, "can't get USE_CUSTOM_SSL variables : " .. err)
end
if vars["global"]["USE_CUSTOM_SSL"] == "yes" then
local check, data = self:read_files()
if not check then
self.logger:log(ngx.ERR, "error while reading files : " .. err)
ok = false
err = "error reading files"
else
local check, err = self:load_data(data)
if not check then
self.logger:log(ngx.ERR, "error while loading data : " .. err)
ok = false
err = "error loading data"
end
end
end
for server_name, multisite_vars in pairs(vars) do
if multisite_vars["USE_CUSTOM_SSL"] == "yes" then
local check, data = self:read_files(server_name)
if not check then
self.logger:log(ngx.ERR, "error while reading files : " .. err)
ok = false
err = "error reading files"
else
local check, err = self:load_data(data, server_name)
if not check then
self.logger:log(ngx.ERR, "error while loading data : " .. err)
ok = false
err = "error loading data"
end
end
end
end
else
local check, data = self:read_files()
if not check then
self.logger:log(ngx.ERR, "error while reading files : " .. err)
ok = false
err = "error reading files"
else
local check, err = self:load_data(data)
if not check then
self.logger:log(ngx.ERR, "error while loading data : " .. err)
ok = false
err = "error loading data"
end
end
end
else
err = "custom ssl is not used"
end
return self:ret(ok, err)
end
function customcert:ssl_certificate()
if self.variables["USE_CUSTOM_SSL"] == "yes" then
local global_data, err = self.datastore:get("plugin_customcert_global", true)
if not global_data and err ~= "not found" then
return self:ret(false, "error while getting plugin_customcert_global from datastore : " .. err)
end
local site_data, err = self.datastore:get("plugin_customcert_" .. self.ctx.bw.server_name, true)
if not site_data and err ~= "not found" then
return self:ret(false, "error while getting plugin_customcert_" .. self.ctx.bw.server_name .. " from datastore : " .. err)
end
if not global_data and not site_data then
return self:ret(false, "both global and site cert are not present in datastore")
end
return self:ret(true, "certificate/key data found", site_data or global_data)
end
return self:ret(true, "custom certificate is not used")
end
function customcert:read_files(server_name)
local files = {
"/var/cache/bunkerweb/customcert/" .. (server_name or "") .. "/cert.pem",
"/var/cache/bunkerweb/customcert/" .. (server_name or "") .. "/key.pem"
}
local data = {}
for i, file in ipairs(files) do
local f, err = io.open(file, "r")
if not f then
return false, file .. " = " .. err
end
table.insert(data, f:read("*a"))
f:close()
end
return true, data
end
function customcert:load_data(data, server_name)
-- Load certificate
local cert_chain, err = ssl.parse_pem_cert(data[1])
if not cert_chain then
return false, "error while parsing pem cert : " .. err
end
-- Load key
local priv_key, err = ssl.parse_priv_key(data[2])
if not priv_key then
return false, "error while parsing pem priv key : " .. err
end
local cache_key = "plugin_customcert_" .. (server_name or "global")
local ok, err = self.datastore:set(cache_key, {cert_chain, priv_key}, nil, true)
if not ok then
return false, "error while setting data into datastore : " .. err
end
return true
end
return customcert

View file

@ -6,6 +6,7 @@ from pathlib import Path
from sys import exit as sys_exit, path as sys_path
from traceback import format_exc
from typing import Optional
from base64 import b64decode
for deps_path in [
join(sep, "usr", "share", "bunkerweb", *paths)
@ -99,6 +100,28 @@ try:
cert_path = getenv("CUSTOM_SSL_CERT", "")
key_path = getenv("CUSTOM_SSL_KEY", "")
cert_data = b64decode(getenv("CUSTOM_SSL_CERT_DATA", ""))
key_data = b64decode(getenv("CUSTOM_SSL_KEY_DATA", ""))
for file, data in [("cert.pem", cert_data), ("key.pem", key_data)]:
if data != b"":
file_path = Path(
sep,
"var",
"tmp",
"bunkerweb",
"customcert",
file
)
file_path.parent.mkdir(parents=True, exist_ok=True)
file_path.write_bytes(data)
if file == "cert.pem":
cert_path = str(file_path)
else:
key_path = str(file_path)
if cert_data != b"":
with open()
if cert_path and key_path:
logger.info(f"Checking certificate {cert_path} ...")
need_reload = check_cert(cert_path, key_path)
@ -124,6 +147,26 @@ try:
cert_path = getenv(f"{first_server}_CUSTOM_SSL_CERT", "")
key_path = getenv(f"{first_server}_CUSTOM_SSL_KEY", "")
cert_data = b64decode(getenv(f"{first_server}_CUSTOM_SSL_CERT_DATA", ""))
key_data = b64decode(getenv(f"{first_server}_CUSTOM_SSL_KEY_DATA", ""))
for file, data in [("cert.pem", cert_data), ("key.pem", key_data)]:
if data != b"":
file_path = Path(
sep,
"var",
"tmp",
"bunkerweb",
"customcert",
server_name,
file
)
file_path.parent.mkdir(parents=True, exist_ok=True)
file_path.write_bytes(data)
if file == "cert.pem":
cert_path = str(file_path)
else:
key_path = str(file_path)
if cert_path and key_path:
logger.info(
f"Checking certificate {cert_path} ...",

View file

@ -31,6 +31,24 @@
"label": "Key path",
"regex": "^(/[\\w. \\-]+)*/?$",
"type": "text"
},
"CUSTOM_SSL_CERT_DATA": {
"context": "multisite",
"default": "",
"help": "Certificate data encoded in base64.",
"id": "custom-https-cert-data",
"label": "Certificate data (base64)",
"regex": "^.*$",
"type": "text"
},
"CUSTOM_SSL_KEY_DATA": {
"context": "multisite",
"default": "",
"help": "Key data encoded in base64.",
"id": "custom-https-key-data",
"label": "Key data (base64)",
"regex": "^.*$",
"type": "text"
}
},
"jobs": [

View file

@ -85,19 +85,8 @@
"help": "Value for the Referrer-Policy header.",
"id": "referrer-policy",
"label": "Referrer-Policy",
"regex": "^(no-referrer|no-referrer-when-downgrade|origin|origin-when-cross-origin|same-origin|strict-origin|strict-origin-when-cross-origin|unsafe-url)?$",
"type": "select",
"select": [
"",
"no-referrer",
"no-referrer-when-downgrade",
"origin",
"origin-when-cross-origin",
"same-origin",
"strict-origin",
"strict-origin-when-cross-origin",
"unsafe-url"
]
"regex": "^(?!^(,| ))((, )?(no-referrer-when-downgrade|no-referrer|origin-when-cross-origin|same-origin|strict-origin-when-cross-origin|strict-origin|origin|unsafe-url)(?!\\b.*, \\4\\b))*$",
"type": "text"
},
"PERMISSIONS_POLICY": {
"context": "multisite",

View file

@ -13,8 +13,10 @@ listen [::]:{{ HTTPS_PORT }} ssl {% if HTTP2 == "yes" %}http2{% endif %} {% if U
{% endif %}
# TLS config
ssl_certificate /var/cache/bunkerweb/letsencrypt/etc/live/{{ SERVER_NAME.split(" ")[0] }}/fullchain.pem;
ssl_certificate_key /var/cache/bunkerweb/letsencrypt/etc/live/{{ SERVER_NAME.split(" ")[0] }}/privkey.pem;
ssl_certificate /var/cache/bunkerweb/default-server-cert/cert.pem;
ssl_certificate_key /var/cache/bunkerweb/default-server-cert/cert.key;
#ssl_certificate /var/cache/bunkerweb/letsencrypt/etc/live/{{ SERVER_NAME.split(" ")[0] }}/fullchain.pem;
#ssl_certificate_key /var/cache/bunkerweb/letsencrypt/etc/live/{{ SERVER_NAME.split(" ")[0] }}/privkey.pem;
ssl_protocols {{ SSL_PROTOCOLS }};
ssl_prefer_server_ciphers on;
ssl_session_tickets off;

View file

@ -1,6 +1,8 @@
local cjson = require "cjson"
local class = require "middleclass"
local plugin = require "bunkerweb.plugin"
local utils = require "bunkerweb.utils"
local ssl = require "ngx.ssl"
local letsencrypt = class("letsencrypt", plugin)
@ -9,6 +11,107 @@ function letsencrypt:initialize(ctx)
plugin.initialize(self, "letsencrypt", ctx)
end
function letsencrypt:init()
local ok, err = true, "success"
if utils.has_variable("AUTO_LETS_ENCRYPT", "yes") then
local multisite, err = utils.get_variable("MULTISITE")
if not multisite then
return self:ret(false, "can't get MULTISITE variable : " .. err)
end
if multisite == "yes" then
local vars, err = utils.get_multiple_variables({"AUTO_LETS_ENCRYPT"})
if not vars then
return self:ret(false, "can't get AUTO_LETS_ENCRYPT variables : " .. err)
end
for server_name, multisite_vars in pairs(vars) do
if multisite_vars["AUTO_LETS_ENCRYPT"] == "yes" then
local check, data = self:read_files(server_name)
if not check then
self.logger:log(ngx.ERR, "error while reading files : " .. err)
ok = false
err = "error reading files"
else
local check, err = self:load_data(data, server_name)
if not check then
self.logger:log(ngx.ERR, "error while loading data : " .. err)
ok = false
err = "error loading data"
end
end
end
end
else
local server_name, err = utils.get_variable("SERVER_NAME")
if not server_name then
return self:ret(false, "can't get SERVER_NAME variable : " .. err)
end
local check, data = self:read_files(server_name:gmatch("%S+")[1])
if not check then
self.logger:log(ngx.ERR, "error while reading files : " .. err)
ok = false
err = "error reading files"
else
local check, err = self:load_data(data)
if not check then
self.logger:log(ngx.ERR, "error while loading data : " .. err)
ok = false
err = "error loading data"
end
end
end
else
err = "let's encrypt is not used"
end
return self:ret(ok, err)
end
function letsencrypt:ssl_certificate()
if self.variables["AUTO_LETS_ENCRYPT"] == "yes" then
local data, err = self.datastore:get("plugin_letsencrypt_" .. self.ctx.bw.server_name, true)
if not data then
return self:ret(false, "error while getting plugin_letsencrypt_" .. self.ctx.bw.server_name .. " from datastore : " .. err)
end
return self:ret(true, "certificate/key data found", data)
end
return self:ret(true, "let's encrypt is not used")
end
function letsencrypt:read_files(server_name)
local files = {
"/var/cache/bunkerweb/letsencrypt/etc/live/" .. server_name .. "/fullchain.pem",
"/var/cache/bunkerweb/letsencrypt/etc/live/" .. server_name .. "/privkey.pem"
}
local data = {}
for i, file in ipairs(files) do
local f, err = io.open(file, "r")
if not f then
return false, file .. " = " .. err
end
table.insert(data, f:read("*a"))
f:close()
end
return true, data
end
function letsencrypt:load_data(data, server_name)
-- Load certificate
local cert_chain, err = ssl.parse_pem_cert(data[1])
if not cert_chain then
return false, "error while parsing pem cert : " .. err
end
-- Load key
local priv_key, err = ssl.parse_priv_key(data[2])
if not priv_key then
return false, "error while parsing pem priv key : " .. err
end
local cache_key = "plugin_letsencrypt_" .. (server_name or "global")
local ok, err = self.datastore:set(cache_key, {cert_chain, priv_key}, nil, true)
if not ok then
return false, "error while setting data into datastore : " .. err
end
return true
end
function letsencrypt:access()
if string.sub(self.ctx.bw.uri, 1, string.len("/.well-known/acme-challenge/")) == "/.well-known/acme-challenge/" then
self.logger:log(ngx.NOTICE, "got a visit from Let's Encrypt, let's whitelist it")

View file

@ -7,8 +7,16 @@
"bunkernet",
"limit"
],
"init_worker": ["redis", "bunkernet", "dnsbl"],
"init_worker": [
"redis",
"bunkernet",
"dnsbl",
"customcert",
"letsencrypt",
"selfsigned"
],
"set": ["sessions", "whitelist"],
"ssl_certificate": ["customcert", "letsencrypt", "selfsigned"],
"access": [
"whitelist",
"letsencrypt",

View file

@ -7,8 +7,10 @@ listen [::]:{{ HTTPS_PORT }} ssl {% if HTTP2 == "yes" %}http2{% endif %} {% if U
{% endif %}
# TLS config
ssl_certificate /var/cache/bunkerweb/selfsigned/{{ SERVER_NAME.split(" ")[0] }}.pem;
ssl_certificate_key /var/cache/bunkerweb/selfsigned/{{ SERVER_NAME.split(" ")[0] }}.key;
ssl_certificate /var/cache/bunkerweb/default-server-cert/cert.pem;
ssl_certificate_key /var/cache/bunkerweb/default-server-cert/cert.key;
# ssl_certificate /var/cache/bunkerweb/selfsigned/{{ SERVER_NAME.split(" ")[0] }}.pem;
# ssl_certificate_key /var/cache/bunkerweb/selfsigned/{{ SERVER_NAME.split(" ")[0] }}.key;
ssl_protocols {{ SSL_PROTOCOLS }};
ssl_prefer_server_ciphers on;
ssl_session_tickets off;

View file

@ -0,0 +1,114 @@
local class = require "middleclass"
local plugin = require "bunkerweb.plugin"
local utils = require "bunkerweb.utils"
local ssl = require "ngx.ssl"
local selfsigned = class("selfsigned", plugin)
function selfsigned:initialize(ctx)
-- Call parent initialize
plugin.initialize(self, "selfsigned", ctx)
end
function selfsigned:init()
local ok, err = true, "success"
if utils.has_variable("GENERATE_SELF_SIGNED_SSL", "yes") then
local multisite, err = utils.get_variable("MULTISITE")
if not multisite then
return self:ret(false, "can't get MULTISITE variable : " .. err)
end
if multisite == "yes" then
local vars, err = utils.get_multiple_variables({"GENERATE_SELF_SIGNED_SSL"})
if not vars then
return self:ret(false, "can't get GENERATE_SELF_SIGNED_SSL variables : " .. err)
end
for server_name, multisite_vars in pairs(vars) do
if multisite_vars["GENERATE_SELF_SIGNED_SSL"] == "yes" then
local check, data = self:read_files(server_name)
if not check then
self.logger:log(ngx.ERR, "error while reading files : " .. err)
ok = false
err = "error reading files"
else
local check, err = self:load_data(data, server_name)
if not check then
self.logger:log(ngx.ERR, "error while loading data : " .. err)
ok = false
err = "error loading data"
end
end
end
end
else
local server_name, err = utils.get_variable("SERVER_NAME")
if not server_name then
return self:ret(false, "can't get SERVER_NAME variable : " .. err)
end
local check, data = self:read_files(server_name:gmatch("%S+")[1])
if not check then
self.logger:log(ngx.ERR, "error while reading files : " .. err)
ok = false
err = "error reading files"
else
local check, err = self:load_data(data)
if not check then
self.logger:log(ngx.ERR, "error while loading data : " .. err)
ok = false
err = "error loading data"
end
end
end
else
err = "self signed is not used"
end
return self:ret(ok, err)
end
function selfsigned:ssl_certificate()
if self.variables["GENERATE_SELF_SIGNED_SSL"] == "yes" then
local data, err = self.datastore:get("plugin_selfsigned_" .. self.ctx.bw.server_name, true)
if not data then
return self:ret(false, "error while getting plugin_selfsigned_" .. self.ctx.bw.server_name .. " from datastore : " .. err)
end
return self:ret(true, "certificate/key data found", data)
end
return self:ret(true, "selfsigned is not used")
end
function selfsigned:read_files(server_name)
local files = {
"/var/cache/bunkerweb/selfsigned/" .. server_name .. "/cert.pem",
"/var/cache/bunkerweb/selfsigned/" .. server_name .. "/key.pem"
}
local data = {}
for i, file in ipairs(files) do
local f, err = io.open(file, "r")
if not f then
return false, file .. " = " .. err
end
table.insert(data, f:read("*a"))
f:close()
end
return true, data
end
function selfsigned:load_data(data, server_name)
-- Load certificate
local cert_chain, err = ssl.parse_pem_cert(data[1])
if not cert_chain then
return false, "error while parsing pem cert : " .. err
end
-- Load key
local priv_key, err = ssl.parse_priv_key(data[2])
if not priv_key then
return false, "error while parsing pem priv key : " .. err
end
local cache_key = "plugin_selfsigned_" .. (server_name or "global")
local ok, err = self.datastore:set(cache_key, {cert_chain, priv_key}, nil, true)
if not ok then
return false, "error while setting data into datastore : " .. err
end
return true
end
return selfsigned

View file

@ -346,7 +346,10 @@ class Database:
if has_all_tables:
return False, ""
Base.metadata.create_all(self.__sql_engine, checkfirst=True)
try:
Base.metadata.create_all(self.__sql_engine, checkfirst=True)
except BaseException:
return False, format_exc()
to_put = []
with self.__db_session() as session:
@ -373,19 +376,51 @@ class Database:
jobs = plugin.pop("jobs", [])
page = plugin.pop("page", False)
to_put.append(
Plugins(
id=plugin["id"],
name=plugin["name"],
description=plugin["description"],
version=plugin["version"],
stream=plugin["stream"],
external=plugin.get("external", False),
method=plugin.get("method"),
data=plugin.get("data"),
checksum=plugin.get("checksum"),
db_plugin = session.query(Plugins).filter_by(id=plugin["id"]).first()
if db_plugin:
updates = {}
if plugin["name"] != db_plugin.name:
updates[Plugins.name] = plugin["name"]
if plugin["description"] != db_plugin.description:
updates[Plugins.description] = plugin["description"]
if plugin["version"] != db_plugin.version:
updates[Plugins.version] = plugin["version"]
if plugin["stream"] != db_plugin.stream:
updates[Plugins.stream] = plugin["stream"]
if plugin.get("external", False) != db_plugin.external:
updates[Plugins.external] = plugin.get("external", False)
if plugin.get("method", "manual") != db_plugin.method:
updates[Plugins.method] = plugin.get("method", "manual")
if plugin.get("data") != db_plugin.data:
updates[Plugins.data] = plugin.get("data")
if plugin.get("checksum") != db_plugin.checksum:
updates[Plugins.checksum] = plugin.get("checksum")
if updates:
self.__logger.warning(f'Plugin "{plugin["id"]}" already exists, updating it with the new values')
session.query(Plugins).filter(Plugins.id == plugin["id"]).update(updates)
else:
to_put.append(
Plugins(
id=plugin["id"],
name=plugin["name"],
description=plugin["description"],
version=plugin["version"],
stream=plugin["stream"],
external=plugin.get("external", False),
method=plugin.get("method"),
data=plugin.get("data"),
checksum=plugin.get("checksum"),
)
)
)
for setting, value in settings.items():
value.update(
@ -395,15 +430,98 @@ class Database:
"id": setting,
}
)
db_setting = session.query(Settings).filter_by(id=setting).first()
select_values = value.pop("select", [])
for select in value.pop("select", []):
to_put.append(Selects(setting_id=value["id"], value=select))
if db_setting:
updates = {}
to_put.append(Settings(**value))
if value["name"] != db_setting.name:
updates[Settings.name] = value["name"]
if value["context"] != db_setting.context:
updates[Settings.context] = value["context"]
if value["default"] != db_setting.default:
updates[Settings.default] = value["default"]
if value["help"] != db_setting.help:
updates[Settings.help] = value["help"]
if value["label"] != db_setting.label:
updates[Settings.label] = value["label"]
if value["regex"] != db_setting.regex:
updates[Settings.regex] = value["regex"]
if value["type"] != db_setting.type:
updates[Settings.type] = value["type"]
if value.get("multiple") != db_setting.multiple:
updates[Settings.multiple] = value.get("multiple")
if updates:
self.__logger.warning(f'Setting "{setting}" already exists, updating it with the new values')
session.query(Settings).filter(Settings.id == setting).update(updates)
else:
if db_plugin:
self.__logger.warning(f'Setting "{setting}" does not exist, creating it')
to_put.append(Settings(**value))
db_selects = session.query(Selects).with_entities(Selects.value).filter_by(setting_id=value["id"]).all()
db_values = [select.value for select in db_selects]
missing_values = [select for select in db_values if select not in select_values]
if select_values:
if missing_values:
# Remove selects that are no longer in the list
self.__logger.warning(f'Removing {len(missing_values)} selects from setting "{setting}" as they are no longer in the list')
session.query(Selects).filter(Selects.value.in_(missing_values)).delete()
for select in select_values:
if select not in db_values:
to_put.append(Selects(setting_id=value["id"], value=select))
else:
if missing_values:
self.__logger.warning(f'Removing all selects from setting "{setting}" as there are no longer any in the list')
session.query(Selects).filter_by(setting_id=value["id"]).delete()
db_jobs = session.query(Jobs).with_entities(Jobs.name).filter_by(plugin_id=plugin["id"]).all()
db_names = [job.name for job in db_jobs]
job_names = [job["name"] for job in jobs]
missing_names = [job for job in db_names if job not in job_names]
if missing_names:
# Remove jobs that are no longer in the list
self.__logger.warning(f'Removing {len(missing_names)} jobs from plugin "{plugin["id"]}" as they are no longer in the list')
session.query(Jobs).filter(Jobs.name.in_(missing_names)).delete()
for job in jobs:
job["file_name"] = job.pop("file")
to_put.append(Jobs(plugin_id=plugin["id"], **job))
db_job = session.query(Jobs).with_entities(Jobs.file_name, Jobs.every, Jobs.reload).filter_by(name=job["name"], plugin_id=plugin["id"]).first()
if job["name"] not in db_names or not db_job:
job["file_name"] = job.pop("file")
job["reload"] = job.get("reload", False)
if db_plugin:
self.__logger.warning(f'Job "{job["name"]}" does not exist, creating it')
to_put.append(Jobs(plugin_id=plugin["id"], **job))
else:
updates = {}
if job["file"] != db_job.file_name:
updates[Jobs.file_name] = job["file"]
if job["every"] != db_job.every:
updates[Jobs.every] = job["every"]
if job.get("reload", None) != db_job.reload:
updates[Jobs.reload] = job.get("reload", False)
if updates:
self.__logger.warning(f'Job "{job["name"]}" already exists, updating it with the new values')
updates[Jobs.last_run] = None
session.query(Jobs_cache).filter(Jobs_cache.job_name == job["name"]).delete()
session.query(Jobs).filter(Jobs.name == job["name"]).update(updates)
if page:
core_ui_path = Path(sep, "usr", "share", "bunkerweb", "core", plugin["id"], "ui")
@ -411,16 +529,53 @@ class Database:
if path_ui.exists():
if {"template.html", "actions.py"}.issubset(listdir(str(path_ui))):
db_plugin_page = (
session.query(Plugin_pages)
.with_entities(
Plugin_pages.template_checksum,
Plugin_pages.actions_checksum,
)
.filter_by(plugin_id=plugin["id"])
.first()
)
template = path_ui.joinpath("template.html").read_bytes()
actions = path_ui.joinpath("actions.py").read_bytes()
template_checksum = sha256(template).hexdigest()
actions_checksum = sha256(actions).hexdigest()
if db_plugin_page:
updates = {}
if template_checksum != db_plugin_page.template_checksum:
updates.update(
{
Plugin_pages.template_file: template,
Plugin_pages.template_checksum: template_checksum,
}
)
if actions_checksum != db_plugin_page.actions_checksum:
updates.update(
{
Plugin_pages.actions_file: actions,
Plugin_pages.actions_checksum: actions_checksum,
}
)
if updates:
self.__logger.warning(f'Page for plugin "{plugin["id"]}" already exists, updating it with the new values')
session.query(Plugin_pages).filter(Plugin_pages.plugin_id == plugin["id"]).update(updates)
continue
if db_plugin:
self.__logger.warning(f'Page for plugin "{plugin["id"]}" does not exist, creating it')
to_put.append(
Plugin_pages(
plugin_id=plugin["id"],
template_file=template,
template_checksum=sha256(template).hexdigest(),
template_checksum=template_checksum,
actions_file=actions,
actions_checksum=sha256(actions).hexdigest(),
actions_checksum=actions_checksum,
)
)
@ -568,8 +723,8 @@ class Database:
}
)
else:
if config.get("SERVER_NAME", "") != "" and not (session.query(Services).with_entities(Services.id).filter_by(id=config["SERVER_NAME"].split(" ")[0]).first()):
to_put.append(Services(id=config["SERVER_NAME"].split(" ")[0], method=method))
if not (session.query(Services).with_entities(Services.id).filter_by(id=config.get("SERVER_NAME", "www.example.com").split(" ")[0]).first()):
to_put.append(Services(id=config.get("SERVER_NAME", "www.example.com").split(" ")[0], method=method))
for key, value in config.items():
suffix = 0
@ -783,9 +938,8 @@ class Database:
}
)
if is_multisite:
servers = " ".join(service.id for service in session.query(Services).all())
config["SERVER_NAME"] = servers if not methods else {"value": servers, "global": True, "method": "default"}
servers = " ".join(service.id for service in session.query(Services).all())
config["SERVER_NAME"] = servers if not methods else {"value": servers, "global": True, "method": "default"}
return config

View file

@ -83,64 +83,65 @@ cryptography==41.0.7 \
--hash=sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7 \
--hash=sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d
# via -r requirements.in
greenlet==3.0.1 \
--hash=sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174 \
--hash=sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd \
--hash=sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa \
--hash=sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a \
--hash=sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec \
--hash=sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565 \
--hash=sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d \
--hash=sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c \
--hash=sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234 \
--hash=sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d \
--hash=sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546 \
--hash=sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2 \
--hash=sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74 \
--hash=sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de \
--hash=sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd \
--hash=sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9 \
--hash=sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3 \
--hash=sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846 \
--hash=sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2 \
--hash=sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353 \
--hash=sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8 \
--hash=sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166 \
--hash=sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206 \
--hash=sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b \
--hash=sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d \
--hash=sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe \
--hash=sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997 \
--hash=sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445 \
--hash=sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0 \
--hash=sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96 \
--hash=sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884 \
--hash=sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6 \
--hash=sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1 \
--hash=sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619 \
--hash=sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94 \
--hash=sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4 \
--hash=sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1 \
--hash=sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63 \
--hash=sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd \
--hash=sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a \
--hash=sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376 \
--hash=sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57 \
--hash=sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16 \
--hash=sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e \
--hash=sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc \
--hash=sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a \
--hash=sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c \
--hash=sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5 \
--hash=sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a \
--hash=sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72 \
--hash=sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9 \
--hash=sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9 \
--hash=sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e \
--hash=sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8 \
--hash=sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65 \
--hash=sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064 \
--hash=sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36
greenlet==3.0.2 \
--hash=sha256:006c1028ac0cfcc4e772980cfe73f5476041c8c91d15d64f52482fc571149d46 \
--hash=sha256:0acadbc3f72cb0ee85070e8d36bd2a4673d2abd10731ee73c10222cf2dd4713c \
--hash=sha256:0c0fdb8142742ee68e97c106eb81e7d3e883cc739d9c5f2b28bc38a7bafeb6d1 \
--hash=sha256:0df7eed98ea23b20e9db64d46eb05671ba33147df9405330695bcd81a73bb0c9 \
--hash=sha256:10d247260db20887ae8857c0cbc750b9170f0b067dd7d38fb68a3f2334393bd3 \
--hash=sha256:14b5d999aefe9ffd2049ad19079f733c3aaa426190ffecadb1d5feacef8fe397 \
--hash=sha256:18fe39d70d482b22f0014e84947c5aaa7211fb8e13dc4cc1c43ed2aa1db06d9a \
--hash=sha256:1c1129bc47266d83444c85a8e990ae22688cf05fb20d7951fd2866007c2ba9bc \
--hash=sha256:1dac09e3c0b78265d2e6d3cbac2d7c48bd1aa4b04a8ffeda3adde9f1688df2c3 \
--hash=sha256:2c93cd03acb1499ee4de675e1a4ed8eaaa7227f7949dc55b37182047b006a7aa \
--hash=sha256:2e9c5423046eec21f6651268cb674dfba97280701e04ef23d312776377313206 \
--hash=sha256:2ee59c4627c8c4bb3e15949fbcd499abd6b7f4ad9e0bfcb62c65c5e2cabe0ec4 \
--hash=sha256:339c0272a62fac7e602e4e6ec32a64ff9abadc638b72f17f6713556ed011d493 \
--hash=sha256:38878744926cec29b5cc3654ef47f3003f14bfbba7230e3c8492393fe29cc28b \
--hash=sha256:3e4bfa752b3688d74ab1186e2159779ff4867644d2b1ebf16db14281f0445377 \
--hash=sha256:520fcb53a39ef90f5021c77606952dbbc1da75d77114d69b8d7bded4a8e1a813 \
--hash=sha256:5f9ea7c2c9795549653b6f7569f6bc75d2c7d1f6b2854eb8ce0bc6ec3cb2dd88 \
--hash=sha256:654b84c9527182036747938b81938f1d03fb8321377510bc1854a9370418ab66 \
--hash=sha256:6d65bec56a7bc352bcf11b275b838df618651109074d455a772d3afe25390b7d \
--hash=sha256:7363756cc439a503505b67983237d1cc19139b66488263eb19f5719a32597836 \
--hash=sha256:80d068e4b6e2499847d916ef64176811ead6bf210a610859220d537d935ec6fd \
--hash=sha256:8756a94ed8f293450b0e91119eca2a36332deba69feb2f9ca410d35e74eae1e4 \
--hash=sha256:89a6f6ddcbef4000cda7e205c4c20d319488ff03db961d72d4e73519d2465309 \
--hash=sha256:8f34a765c5170c0673eb747213a0275ecc749ab3652bdbec324621ed5b2edaef \
--hash=sha256:8f8d14a0a4e8c670fbce633d8b9a1ee175673a695475acd838e372966845f764 \
--hash=sha256:950e21562818f9c771989b5b65f990e76f4ac27af66e1bb34634ae67886ede2a \
--hash=sha256:9560c580c896030ff9c311c603aaf2282234643c90d1dec738a1d93e3e53cd51 \
--hash=sha256:9acd8fd67c248b8537953cb3af8787c18a87c33d4dcf6830e410ee1f95a63fd4 \
--hash=sha256:a37ae53cca36823597fd5f65341b6f7bac2dd69ecd6ca01334bb795460ab150b \
--hash=sha256:aecea0442975741e7d69daff9b13c83caff8c13eeb17485afa65f6360a045765 \
--hash=sha256:b1405614692ac986490d10d3e1a05e9734f473750d4bee3cf7d1286ef7af7da6 \
--hash=sha256:b1fd25dfc5879a82103b3d9e43fa952e3026c221996ff4d32a9c72052544835d \
--hash=sha256:b2cedf279ca38ef3f4ed0d013a6a84a7fc3d9495a716b84a5fc5ff448965f251 \
--hash=sha256:b3f0497db77cfd034f829678b28267eeeeaf2fc21b3f5041600f7617139e6773 \
--hash=sha256:bfcecc984d60b20ffe30173b03bfe9ba6cb671b0be1e95c3e2056d4fe7006590 \
--hash=sha256:c1f647fe5b94b51488b314c82fdda10a8756d650cee8d3cd29f657c6031bdf73 \
--hash=sha256:c235131bf59d2546bb3ebaa8d436126267392f2e51b85ff45ac60f3a26549af0 \
--hash=sha256:c27b142a9080bdd5869a2fa7ebf407b3c0b24bd812db925de90e9afe3c417fd6 \
--hash=sha256:c42bb589e6e9f9d8bdd79f02f044dff020d30c1afa6e84c0b56d1ce8a324553c \
--hash=sha256:cd5bc4fde0842ff2b9cf33382ad0b4db91c2582db836793d58d174c569637144 \
--hash=sha256:cecfdc950dd25f25d6582952e58521bca749cf3eeb7a9bad69237024308c8196 \
--hash=sha256:d1fceb5351ab1601903e714c3028b37f6ea722be6873f46e349a960156c05650 \
--hash=sha256:d4d0df07a38e41a10dfb62c6fc75ede196572b580f48ee49b9282c65639f3965 \
--hash=sha256:d5547b462b8099b84746461e882a3eb8a6e3f80be46cb6afb8524eeb191d1a30 \
--hash=sha256:d64643317e76b4b41fdba659e7eca29634e5739b8bc394eda3a9127f697ed4b0 \
--hash=sha256:db4233358d3438369051a2f290f1311a360d25c49f255a6c5d10b5bcb3aa2b49 \
--hash=sha256:e0e28f5233d64c693382f66d47c362b72089ebf8ac77df7e12ac705c9fa1163d \
--hash=sha256:e79fb5a9fb2d0bd3b6573784f5e5adabc0b0566ad3180a028af99523ce8f6138 \
--hash=sha256:e84bef3cfb6b6bfe258c98c519811c240dbc5b33a523a14933a252e486797c90 \
--hash=sha256:ed1a8a08de7f68506a38f9a2ddb26bbd1480689e66d788fcd4b5f77e2d9ecfcc \
--hash=sha256:ed9bf77b41798e8417657245b9f3649314218a4a17aefb02bb3992862df32495 \
--hash=sha256:edf7a1daba1f7c54326291a8cde58da86ab115b78c91d502be8744f0aa8e3ffa \
--hash=sha256:f260e6c2337871a52161824058923df2bbddb38bc11a5cbe71f3474d877c5bd9 \
--hash=sha256:f27aa32466993c92d326df982c4acccd9530fe354e938d9e9deada563e71ce76 \
--hash=sha256:f4cf532bf3c58a862196b06947b1b5cc55503884f9b63bf18582a75228d9950e \
--hash=sha256:fb5d60805057d8948065338be6320d35e26b0a72f45db392eb32b70dd6dc9227 \
--hash=sha256:fc14dd9554f88c9c1fe04771589ae24db76cd56c8f1104e4381b383d6b71aff8 \
--hash=sha256:fefd5eb2c0b1adffdf2802ff7df45bfe65988b15f6b972706a0e55d451bffaea
# via sqlalchemy
psycopg2-binary==2.9.9 \
--hash=sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9 \
@ -275,7 +276,7 @@ sqlalchemy==2.0.23 \
--hash=sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac \
--hash=sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60
# via -r requirements.in
typing-extensions==4.8.0 \
--hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \
--hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef
typing-extensions==4.9.0 \
--hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \
--hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd
# via sqlalchemy

View file

@ -101,6 +101,8 @@ class Templator:
for root_conf in (
"server.conf",
"access-lua.conf",
"ssl-certificate-lua.conf",
"header-lua.conf",
"init-lua.conf",
"log-lua.conf",
"set-lua.conf",

View file

@ -1,4 +1,4 @@
docker==6.1.3
docker==7.0.0
jinja2==3.1.2
kubernetes==28.1.0
python-dotenv==1.0.0

View file

@ -110,13 +110,13 @@ charset-normalizer==3.3.2 \
--hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \
--hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561
# via requests
docker==6.1.3 \
--hash=sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20 \
--hash=sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9
docker==7.0.0 \
--hash=sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b \
--hash=sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3
# via -r requirements.in
google-auth==2.25.1 \
--hash=sha256:d5d66b8f4f6e3273740d7bb73ddefa6c2d1ff691704bd407d51c6b5800e7c97b \
--hash=sha256:dfd7b44935d498e106c08883b2dac0ad36d8aa10402a6412e9a1c9d74b4773f1
google-auth==2.25.2 \
--hash=sha256:42f707937feb4f5e5a39e6c4f343a17300a459aaf03141457ba505812841cc40 \
--hash=sha256:473a8dfd0135f75bb79d878436e568f2695dce456764bf3a02b6f8c540b1d256
# via kubernetes
idna==3.6 \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
@ -308,6 +308,4 @@ urllib3==1.26.18 \
websocket-client==1.7.0 \
--hash=sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6 \
--hash=sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588
# via
# docker
# kubernetes
# via kubernetes

View file

@ -309,10 +309,24 @@ if __name__ == "__main__":
else:
logger.info("Database initialized")
else:
logger.info(
"Database is already initialized, skipping ...",
logger.info("Database is already initialized, checking for changes ...")
ret, err = db.init_tables(
[
config.get_settings(),
config.get_plugins("core"),
config.get_plugins("external"),
]
)
if not ret and err:
logger.error(f"Exception while checking database tables : {err}")
sys_exit(1)
elif not ret:
logger.info("Database tables didn't change, skipping update ...")
else:
logger.info("Database tables successfully updated")
if args.init:
sys_exit(0)

View file

@ -1,4 +1,4 @@
FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 AS builder
FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 AS builder
# Install python dependencies
RUN apk add --no-cache --virtual .build-deps g++ gcc musl-dev jpeg-dev zlib-dev libffi-dev cairo-dev pango-dev gdk-pixbuf-dev openssl-dev cargo postgresql-dev
@ -38,7 +38,7 @@ COPY src/common/utils utils
COPY src/scheduler scheduler
COPY src/VERSION VERSION
FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8
FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8
# Set default umask to prevent huge recursive chmod increasing the final image size
RUN umask 027

View file

@ -1,4 +1,4 @@
FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 AS builder
FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 AS builder
# Install python dependencies
RUN apk add --no-cache --virtual .build-deps g++ gcc musl-dev jpeg-dev zlib-dev libffi-dev cairo-dev pango-dev gdk-pixbuf-dev openssl-dev cargo postgresql-dev file make
@ -36,7 +36,7 @@ COPY src/common/helpers helpers
COPY src/ui ui
COPY src/VERSION VERSION
FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8
FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8
# Set default umask to prevent huge recursive chmod increasing the final image size
RUN umask 027

View file

@ -1,5 +1,6 @@
#!/usr/bin/python3
from contextlib import suppress
from os import _exit, getenv, listdir, sep, urandom
from os.path import basename, dirname, join
from secrets import choice
@ -180,7 +181,11 @@ while not db.is_initialized():
)
sleep(5)
USER = db.get_ui_user()
USER = "Error"
while USER == "Error":
with suppress(Exception):
USER = db.get_ui_user()
USER_PASSWORD_RX = re_compile(r"^(?=.*?\p{Lowercase_Letter})(?=.*?\p{Uppercase_Letter})(?=.*?\d)(?=.*?[ !\"#$%&'()*+,./:;<=>?@[\\\]^_`{|}~-]).{8,}$")
if USER:

0
src/ui/static/images/favicon-white.ico Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

0
src/ui/static/images/favicon.ico Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View file

@ -10,7 +10,9 @@ from subprocess import run
from logger import log
from string import ascii_lowercase, digits
from random import choice
from ssl import SSLContext, create_connection
import OpenSSL.crypto as crypto
from urllib.parse import urlparse
class Test(ABC):
def __init__(self, name, kind, timeout, tests, no_copy_container=False, delay=0):
@ -126,6 +128,7 @@ class Test(ABC):
# run a single test
def __run_test(self, test):
try:
ok = False
ex_url = test["url"]
for ex_domain, test_domain in self._domains.items():
if search(ex_domain, ex_url):
@ -133,10 +136,20 @@ class Test(ABC):
break
if test["type"] == "string":
r = get(ex_url, timeout=10, verify=False)
return test["string"].casefold() in r.text.casefold()
ok = test["string"].casefold() in r.text.casefold()
elif test["type"] == "status":
r = get(ex_url, timeout=10, verify=False)
return test["status"] == r.status_code
ok = test["status"] == r.status_code
if ok and "tls" in test:
connection = create_connection((urlparse(ex_url).netloc, 443))
context = SSLContext()
sock = context.wrap_socket(connection, server_hostname=urlparse(ex_url).netloc)
cert = sock.getpeercert(True)
sock.close()
x509 = crypto.load_certificate(crypto.FILETYPE_ASN1, cert)
if x509.get_subject().CN != test["tls"]:
ok = False
log("TEST", "⚠️", f"wrong cert CN : {x509.get_subject().CN}")
except:
return False
raise (Exception(f"unknown test type {test['type']}"))

View file

@ -1,2 +1,2 @@
docker==6.1.3
docker==7.0.0
requests==2.31.0

View file

@ -100,9 +100,9 @@ charset-normalizer==3.3.2 \
--hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \
--hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561
# via requests
docker==6.1.3 \
--hash=sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20 \
--hash=sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9
docker==7.0.0 \
--hash=sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b \
--hash=sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3
# via -r requirements.in
idna==3.6 \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
@ -124,7 +124,3 @@ urllib3==2.1.0 \
# via
# docker
# requests
websocket-client==1.7.0 \
--hash=sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6 \
--hash=sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588
# via docker

View file

@ -1,2 +1,2 @@
fastapi==0.104.1
fastapi==0.105.0
uvicorn[standard]==0.24.0

View file

@ -23,9 +23,9 @@ exceptiongroup==1.2.0 \
--hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \
--hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68
# via anyio
fastapi==0.104.1 \
--hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \
--hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae
fastapi==0.105.0 \
--hash=sha256:4d12838819aa52af244580675825e750ad67c9df4614f557a769606af902cf22 \
--hash=sha256:f19ebf6fdc82a3281d10f2cb4774bdfa90238e3b40af3525a0c09fd08ad1c480
# via -r requirements.in
h11==0.14.0 \
--hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \
@ -248,9 +248,9 @@ starlette==0.27.0 \
--hash=sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75 \
--hash=sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91
# via fastapi
typing-extensions==4.8.0 \
--hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \
--hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef
typing-extensions==4.9.0 \
--hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \
--hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd
# via
# fastapi
# pydantic

View file

@ -1,2 +1,2 @@
fastapi==0.104.1
fastapi==0.105.0
uvicorn[standard]==0.24.0

View file

@ -23,9 +23,9 @@ exceptiongroup==1.2.0 \
--hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \
--hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68
# via anyio
fastapi==0.104.1 \
--hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \
--hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae
fastapi==0.105.0 \
--hash=sha256:4d12838819aa52af244580675825e750ad67c9df4614f557a769606af902cf22 \
--hash=sha256:f19ebf6fdc82a3281d10f2cb4774bdfa90238e3b40af3525a0c09fd08ad1c480
# via -r requirements.in
h11==0.14.0 \
--hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \
@ -248,9 +248,9 @@ starlette==0.27.0 \
--hash=sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75 \
--hash=sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91
# via fastapi
typing-extensions==4.8.0 \
--hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \
--hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef
typing-extensions==4.9.0 \
--hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \
--hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd
# via
# fastapi
# pydantic

View file

@ -1 +1 @@
docker==6.1.3
docker==7.0.0

View file

@ -100,9 +100,9 @@ charset-normalizer==3.3.2 \
--hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \
--hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561
# via requests
docker==6.1.3 \
--hash=sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20 \
--hash=sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9
docker==7.0.0 \
--hash=sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b \
--hash=sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3
# via -r requirements.in
idna==3.6 \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
@ -122,7 +122,3 @@ urllib3==2.1.0 \
# via
# docker
# requests
websocket-client==1.7.0 \
--hash=sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6 \
--hash=sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588
# via docker

View file

@ -83,64 +83,65 @@ cryptography==41.0.7 \
--hash=sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7 \
--hash=sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d
# via -r requirements.in
greenlet==3.0.1 \
--hash=sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174 \
--hash=sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd \
--hash=sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa \
--hash=sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a \
--hash=sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec \
--hash=sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565 \
--hash=sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d \
--hash=sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c \
--hash=sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234 \
--hash=sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d \
--hash=sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546 \
--hash=sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2 \
--hash=sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74 \
--hash=sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de \
--hash=sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd \
--hash=sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9 \
--hash=sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3 \
--hash=sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846 \
--hash=sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2 \
--hash=sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353 \
--hash=sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8 \
--hash=sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166 \
--hash=sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206 \
--hash=sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b \
--hash=sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d \
--hash=sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe \
--hash=sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997 \
--hash=sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445 \
--hash=sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0 \
--hash=sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96 \
--hash=sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884 \
--hash=sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6 \
--hash=sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1 \
--hash=sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619 \
--hash=sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94 \
--hash=sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4 \
--hash=sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1 \
--hash=sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63 \
--hash=sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd \
--hash=sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a \
--hash=sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376 \
--hash=sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57 \
--hash=sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16 \
--hash=sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e \
--hash=sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc \
--hash=sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a \
--hash=sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c \
--hash=sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5 \
--hash=sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a \
--hash=sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72 \
--hash=sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9 \
--hash=sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9 \
--hash=sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e \
--hash=sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8 \
--hash=sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65 \
--hash=sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064 \
--hash=sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36
greenlet==3.0.2 \
--hash=sha256:006c1028ac0cfcc4e772980cfe73f5476041c8c91d15d64f52482fc571149d46 \
--hash=sha256:0acadbc3f72cb0ee85070e8d36bd2a4673d2abd10731ee73c10222cf2dd4713c \
--hash=sha256:0c0fdb8142742ee68e97c106eb81e7d3e883cc739d9c5f2b28bc38a7bafeb6d1 \
--hash=sha256:0df7eed98ea23b20e9db64d46eb05671ba33147df9405330695bcd81a73bb0c9 \
--hash=sha256:10d247260db20887ae8857c0cbc750b9170f0b067dd7d38fb68a3f2334393bd3 \
--hash=sha256:14b5d999aefe9ffd2049ad19079f733c3aaa426190ffecadb1d5feacef8fe397 \
--hash=sha256:18fe39d70d482b22f0014e84947c5aaa7211fb8e13dc4cc1c43ed2aa1db06d9a \
--hash=sha256:1c1129bc47266d83444c85a8e990ae22688cf05fb20d7951fd2866007c2ba9bc \
--hash=sha256:1dac09e3c0b78265d2e6d3cbac2d7c48bd1aa4b04a8ffeda3adde9f1688df2c3 \
--hash=sha256:2c93cd03acb1499ee4de675e1a4ed8eaaa7227f7949dc55b37182047b006a7aa \
--hash=sha256:2e9c5423046eec21f6651268cb674dfba97280701e04ef23d312776377313206 \
--hash=sha256:2ee59c4627c8c4bb3e15949fbcd499abd6b7f4ad9e0bfcb62c65c5e2cabe0ec4 \
--hash=sha256:339c0272a62fac7e602e4e6ec32a64ff9abadc638b72f17f6713556ed011d493 \
--hash=sha256:38878744926cec29b5cc3654ef47f3003f14bfbba7230e3c8492393fe29cc28b \
--hash=sha256:3e4bfa752b3688d74ab1186e2159779ff4867644d2b1ebf16db14281f0445377 \
--hash=sha256:520fcb53a39ef90f5021c77606952dbbc1da75d77114d69b8d7bded4a8e1a813 \
--hash=sha256:5f9ea7c2c9795549653b6f7569f6bc75d2c7d1f6b2854eb8ce0bc6ec3cb2dd88 \
--hash=sha256:654b84c9527182036747938b81938f1d03fb8321377510bc1854a9370418ab66 \
--hash=sha256:6d65bec56a7bc352bcf11b275b838df618651109074d455a772d3afe25390b7d \
--hash=sha256:7363756cc439a503505b67983237d1cc19139b66488263eb19f5719a32597836 \
--hash=sha256:80d068e4b6e2499847d916ef64176811ead6bf210a610859220d537d935ec6fd \
--hash=sha256:8756a94ed8f293450b0e91119eca2a36332deba69feb2f9ca410d35e74eae1e4 \
--hash=sha256:89a6f6ddcbef4000cda7e205c4c20d319488ff03db961d72d4e73519d2465309 \
--hash=sha256:8f34a765c5170c0673eb747213a0275ecc749ab3652bdbec324621ed5b2edaef \
--hash=sha256:8f8d14a0a4e8c670fbce633d8b9a1ee175673a695475acd838e372966845f764 \
--hash=sha256:950e21562818f9c771989b5b65f990e76f4ac27af66e1bb34634ae67886ede2a \
--hash=sha256:9560c580c896030ff9c311c603aaf2282234643c90d1dec738a1d93e3e53cd51 \
--hash=sha256:9acd8fd67c248b8537953cb3af8787c18a87c33d4dcf6830e410ee1f95a63fd4 \
--hash=sha256:a37ae53cca36823597fd5f65341b6f7bac2dd69ecd6ca01334bb795460ab150b \
--hash=sha256:aecea0442975741e7d69daff9b13c83caff8c13eeb17485afa65f6360a045765 \
--hash=sha256:b1405614692ac986490d10d3e1a05e9734f473750d4bee3cf7d1286ef7af7da6 \
--hash=sha256:b1fd25dfc5879a82103b3d9e43fa952e3026c221996ff4d32a9c72052544835d \
--hash=sha256:b2cedf279ca38ef3f4ed0d013a6a84a7fc3d9495a716b84a5fc5ff448965f251 \
--hash=sha256:b3f0497db77cfd034f829678b28267eeeeaf2fc21b3f5041600f7617139e6773 \
--hash=sha256:bfcecc984d60b20ffe30173b03bfe9ba6cb671b0be1e95c3e2056d4fe7006590 \
--hash=sha256:c1f647fe5b94b51488b314c82fdda10a8756d650cee8d3cd29f657c6031bdf73 \
--hash=sha256:c235131bf59d2546bb3ebaa8d436126267392f2e51b85ff45ac60f3a26549af0 \
--hash=sha256:c27b142a9080bdd5869a2fa7ebf407b3c0b24bd812db925de90e9afe3c417fd6 \
--hash=sha256:c42bb589e6e9f9d8bdd79f02f044dff020d30c1afa6e84c0b56d1ce8a324553c \
--hash=sha256:cd5bc4fde0842ff2b9cf33382ad0b4db91c2582db836793d58d174c569637144 \
--hash=sha256:cecfdc950dd25f25d6582952e58521bca749cf3eeb7a9bad69237024308c8196 \
--hash=sha256:d1fceb5351ab1601903e714c3028b37f6ea722be6873f46e349a960156c05650 \
--hash=sha256:d4d0df07a38e41a10dfb62c6fc75ede196572b580f48ee49b9282c65639f3965 \
--hash=sha256:d5547b462b8099b84746461e882a3eb8a6e3f80be46cb6afb8524eeb191d1a30 \
--hash=sha256:d64643317e76b4b41fdba659e7eca29634e5739b8bc394eda3a9127f697ed4b0 \
--hash=sha256:db4233358d3438369051a2f290f1311a360d25c49f255a6c5d10b5bcb3aa2b49 \
--hash=sha256:e0e28f5233d64c693382f66d47c362b72089ebf8ac77df7e12ac705c9fa1163d \
--hash=sha256:e79fb5a9fb2d0bd3b6573784f5e5adabc0b0566ad3180a028af99523ce8f6138 \
--hash=sha256:e84bef3cfb6b6bfe258c98c519811c240dbc5b33a523a14933a252e486797c90 \
--hash=sha256:ed1a8a08de7f68506a38f9a2ddb26bbd1480689e66d788fcd4b5f77e2d9ecfcc \
--hash=sha256:ed9bf77b41798e8417657245b9f3649314218a4a17aefb02bb3992862df32495 \
--hash=sha256:edf7a1daba1f7c54326291a8cde58da86ab115b78c91d502be8744f0aa8e3ffa \
--hash=sha256:f260e6c2337871a52161824058923df2bbddb38bc11a5cbe71f3474d877c5bd9 \
--hash=sha256:f27aa32466993c92d326df982c4acccd9530fe354e938d9e9deada563e71ce76 \
--hash=sha256:f4cf532bf3c58a862196b06947b1b5cc55503884f9b63bf18582a75228d9950e \
--hash=sha256:fb5d60805057d8948065338be6320d35e26b0a72f45db392eb32b70dd6dc9227 \
--hash=sha256:fc14dd9554f88c9c1fe04771589ae24db76cd56c8f1104e4381b383d6b71aff8 \
--hash=sha256:fefd5eb2c0b1adffdf2802ff7df45bfe65988b15f6b972706a0e55d451bffaea
# via sqlalchemy
psycopg2-binary==2.9.9 \
--hash=sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9 \
@ -275,7 +276,7 @@ sqlalchemy==2.0.23 \
--hash=sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac \
--hash=sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60
# via -r requirements.in
typing-extensions==4.8.0 \
--hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \
--hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef
typing-extensions==4.9.0 \
--hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \
--hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd
# via sqlalchemy

View file

@ -1,2 +1,2 @@
fastapi==0.104.1
fastapi==0.105.0
uvicorn[standard]==0.24.0

View file

@ -23,9 +23,9 @@ exceptiongroup==1.2.0 \
--hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \
--hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68
# via anyio
fastapi==0.104.1 \
--hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \
--hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae
fastapi==0.105.0 \
--hash=sha256:4d12838819aa52af244580675825e750ad67c9df4614f557a769606af902cf22 \
--hash=sha256:f19ebf6fdc82a3281d10f2cb4774bdfa90238e3b40af3525a0c09fd08ad1c480
# via -r requirements.in
h11==0.14.0 \
--hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \
@ -248,9 +248,9 @@ starlette==0.27.0 \
--hash=sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75 \
--hash=sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91
# via fastapi
typing-extensions==4.8.0 \
--hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \
--hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef
typing-extensions==4.9.0 \
--hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \
--hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd
# via
# fastapi
# pydantic

View file

@ -1,4 +1,4 @@
fastapi==0.104.1
fastapi==0.105.0
redis==5.0.1
requests==2.31.0
selenium==4.16.0

View file

@ -134,9 +134,9 @@ exceptiongroup==1.2.0 \
# anyio
# trio
# trio-websocket
fastapi==0.104.1 \
--hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \
--hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae
fastapi==0.105.0 \
--hash=sha256:4d12838819aa52af244580675825e750ad67c9df4614f557a769606af902cf22 \
--hash=sha256:f19ebf6fdc82a3281d10f2cb4774bdfa90238e3b40af3525a0c09fd08ad1c480
# via -r requirements.in
h11==0.14.0 \
--hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \
@ -401,9 +401,9 @@ trio-websocket==0.11.1 \
--hash=sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f \
--hash=sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638
# via selenium
typing-extensions==4.8.0 \
--hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \
--hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef
typing-extensions==4.9.0 \
--hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \
--hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd
# via
# fastapi
# pydantic

View file

@ -1,3 +1,3 @@
fastapi==0.104.1
fastapi==0.105.0
requests==2.31.0
uvicorn[standard]==0.24.0

View file

@ -119,9 +119,9 @@ exceptiongroup==1.2.0 \
--hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \
--hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68
# via anyio
fastapi==0.104.1 \
--hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \
--hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae
fastapi==0.105.0 \
--hash=sha256:4d12838819aa52af244580675825e750ad67c9df4614f557a769606af902cf22 \
--hash=sha256:f19ebf6fdc82a3281d10f2cb4774bdfa90238e3b40af3525a0c09fd08ad1c480
# via -r requirements.in
h11==0.14.0 \
--hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \
@ -350,9 +350,9 @@ starlette==0.27.0 \
--hash=sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75 \
--hash=sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91
# via fastapi
typing-extensions==4.8.0 \
--hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \
--hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef
typing-extensions==4.9.0 \
--hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \
--hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd
# via
# fastapi
# pydantic

View file

@ -1,2 +1,2 @@
fastapi==0.104.1
fastapi==0.105.0
uvicorn[standard]==0.24.0

View file

@ -23,9 +23,9 @@ exceptiongroup==1.2.0 \
--hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \
--hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68
# via anyio
fastapi==0.104.1 \
--hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \
--hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae
fastapi==0.105.0 \
--hash=sha256:4d12838819aa52af244580675825e750ad67c9df4614f557a769606af902cf22 \
--hash=sha256:f19ebf6fdc82a3281d10f2cb4774bdfa90238e3b40af3525a0c09fd08ad1c480
# via -r requirements.in
h11==0.14.0 \
--hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \
@ -248,9 +248,9 @@ starlette==0.27.0 \
--hash=sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75 \
--hash=sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91
# via fastapi
typing-extensions==4.8.0 \
--hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \
--hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef
typing-extensions==4.9.0 \
--hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \
--hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd
# via
# fastapi
# pydantic

View file

@ -1,2 +1,3 @@
pyyaml==6.0.1
requests==2.31.0
pyOpenSSL==23.3.0

View file

@ -1,13 +1,79 @@
#
# This file is autogenerated by pip-compile with Python 3.9
# This file is autogenerated by pip-compile with Python 3.7
# by the following command:
#
# pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in
# pip-compile --allow-unsafe --generate-hashes --resolver=backtracking --strip-extras requirements.in
#
certifi==2023.11.17 \
--hash=sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1 \
--hash=sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474
# via requests
cffi==1.15.1 \
--hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \
--hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \
--hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \
--hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \
--hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \
--hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \
--hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \
--hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \
--hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \
--hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \
--hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \
--hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \
--hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \
--hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \
--hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \
--hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \
--hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \
--hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \
--hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \
--hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \
--hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \
--hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \
--hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \
--hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \
--hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \
--hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \
--hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \
--hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \
--hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \
--hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \
--hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \
--hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \
--hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \
--hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \
--hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \
--hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \
--hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \
--hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \
--hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \
--hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \
--hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \
--hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \
--hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \
--hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \
--hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \
--hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \
--hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \
--hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \
--hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \
--hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \
--hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \
--hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \
--hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \
--hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \
--hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \
--hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \
--hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \
--hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \
--hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \
--hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \
--hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \
--hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \
--hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \
--hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0
# via cryptography
charset-normalizer==3.3.2 \
--hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \
--hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \
@ -100,10 +166,43 @@ charset-normalizer==3.3.2 \
--hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \
--hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561
# via requests
cryptography==41.0.7 \
--hash=sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960 \
--hash=sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a \
--hash=sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc \
--hash=sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a \
--hash=sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf \
--hash=sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1 \
--hash=sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39 \
--hash=sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406 \
--hash=sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a \
--hash=sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a \
--hash=sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c \
--hash=sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be \
--hash=sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15 \
--hash=sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2 \
--hash=sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d \
--hash=sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157 \
--hash=sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003 \
--hash=sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248 \
--hash=sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a \
--hash=sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec \
--hash=sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309 \
--hash=sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7 \
--hash=sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d
# via pyopenssl
idna==3.6 \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
# via requests
pycparser==2.21 \
--hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \
--hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206
# via cffi
pyopenssl==23.3.0 \
--hash=sha256:6756834481d9ed5470f4a9393455154bc92fe7a64b7bc6ee2c804e78c52099b2 \
--hash=sha256:6b2cba5cc46e822750ec3e5a81ee12819850b11303630d575e98108a079c2b12
# via -r requirements.in
pyyaml==6.0.1 \
--hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \
--hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \
@ -160,7 +259,7 @@ requests==2.31.0 \
--hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \
--hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1
# via -r requirements.in
urllib3==2.1.0 \
--hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 \
--hash=sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54
urllib3==2.0.7 \
--hash=sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84 \
--hash=sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e
# via requests