diff --git a/Dockerfile b/Dockerfile index ca1fb7c3..4f5db2dc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -59,7 +59,7 @@ RUN apk upgrade --no-cache -a && \ echo "APPSEC_FAILURE_ACTION=deny" | tee -a /src/crowdsec-nginx-bouncer/lua-mod/config_example.conf && \ sed -i "s|BOUNCING_ON_TYPE=all|BOUNCING_ON_TYPE=ban|g" /src/crowdsec-nginx-bouncer/lua-mod/config_example.conf -FROM zoeyvid/nginx-quic:281-python +FROM zoeyvid/nginx-quic:287-python SHELL ["/bin/ash", "-eo", "pipefail", "-c"] ARG CRS_VER=v4.2.0 diff --git a/backend/templates/_location.conf b/backend/templates/_location.conf index 5ff7f054..1ad86b3a 100644 --- a/backend/templates/_location.conf +++ b/backend/templates/_location.conf @@ -1,17 +1,17 @@ - location {{ path }} { - set $forward_path "{{ forward_path }}"; +location {{ path }} { + {{ advanced_config }} - {% if allow_websocket_upgrade == 1 or allow_websocket_upgrade == true %} - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - {% endif %} + set $forward_path "{{ forward_path }}"; + + {% if allow_websocket_upgrade == 1 or allow_websocket_upgrade == true %} + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + {% endif %} - include conf.d/include/proxy-location.conf; - proxy_set_header X-Forwarded-Host $host{{ path }}; - if ($forward_path = "") { - rewrite ^{{ path }}(/.*)$ $1 break; - } - proxy_pass {{ forward_scheme }}://{{ forward_host }}:{{ forward_port }}{{ forward_path }}; - - {{ advanced_config }} + include conf.d/include/proxy-location.conf; + proxy_set_header X-Forwarded-Host $host{{ path }}; + if ($forward_path = "") { + rewrite ^{{ path }}(/.*)$ $1 break; } + proxy_pass {{ forward_scheme }}://{{ forward_host }}:{{ forward_port }}{{ forward_path }}; +} diff --git a/backend/templates/dead_host.conf b/backend/templates/dead_host.conf index adbf0ec4..efc5af63 100644 --- a/backend/templates/dead_host.conf +++ b/backend/templates/dead_host.conf @@ -8,9 +8,11 @@ server { {% include "_forced_tls.conf" %} {% include "_brotli.conf" %} +include conf.d/include/acme-challenge.conf; +include conf.d/include/block-exploits.conf; + {{ advanced_config }} - include conf.d/include/acme-challenge.conf; - include conf.d/include/block-exploits.conf; + {% if use_default_location == 1 or use_default_location == true %} location / { include conf.d/include/acme-challenge.conf; diff --git a/backend/templates/proxy_host.conf b/backend/templates/proxy_host.conf index a87eedbd..bfa9ead4 100644 --- a/backend/templates/proxy_host.conf +++ b/backend/templates/proxy_host.conf @@ -33,6 +33,9 @@ server { {{ advanced_config }} +# custom locations +{{ locations }} + {% if use_default_location == 1 or use_default_location == true %} location / { include conf.d/include/acme-challenge.conf; @@ -44,14 +47,9 @@ server { # Proxy! include conf.d/include/proxy.conf; - - # custom locations - {{ locations }} } {% endif %} -{{ locations }} - # Custom include /data/nginx/custom/server_proxy.conf; } diff --git a/backend/templates/redirection_host.conf b/backend/templates/redirection_host.conf index ec022134..70842845 100644 --- a/backend/templates/redirection_host.conf +++ b/backend/templates/redirection_host.conf @@ -8,9 +8,11 @@ server { {% include "_forced_tls.conf" %} {% include "_brotli.conf" %} +include conf.d/include/acme-challenge.conf; +include conf.d/include/block-exploits.conf; + {{ advanced_config }} - include conf.d/include/acme-challenge.conf; - include conf.d/include/block-exploits.conf; + {% if use_default_location == 1 or use_default_location == true %} location / { include conf.d/include/acme-challenge.conf; diff --git a/backend/templates/stream.conf b/backend/templates/stream.conf index d7740ad1..1e258adb 100644 --- a/backend/templates/stream.conf +++ b/backend/templates/stream.conf @@ -3,6 +3,7 @@ # ------------------------------------------------------------ {% if enabled == 1 or enabled == true %} + {% if tcp_forwarding == 1 or tcp_forwarding == true -%} server { listen {{ incoming_port }}; @@ -15,6 +16,7 @@ server { include /data/nginx/custom/server_stream_tcp.conf; } {% endif %} + {% if udp_forwarding == 1 or udp_forwarding == true %} server { listen {{ incoming_port }} udp; @@ -26,4 +28,5 @@ server { include /data/nginx/custom/server_stream_udp.conf; } {% endif %} + {% endif %} diff --git a/docker/dev/dnsrouter-config.json b/docker/dev/dnsrouter-config.json deleted file mode 100644 index a4e538d7..00000000 --- a/docker/dev/dnsrouter-config.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "log": { - "format": "nice", - "level": "debug" - }, - "servers": [ - { - "host": "0.0.0.0", - "port": 53, - "upstreams": [ - { - "regex": "website[0-9]+.example\\.com", - "upstream": "127.0.0.11" - }, - { - "regex": ".*\\.example\\.com", - "upstream": "1.1.1.1" - }, - { - "regex": "local", - "nxdomain": true - } - ], - "internal": null, - "default_upstream": "127.0.0.11" - } - ] -} diff --git a/docker/dev/letsencrypt.ini b/docker/dev/letsencrypt.ini deleted file mode 100644 index 93647b64..00000000 --- a/docker/dev/letsencrypt.ini +++ /dev/null @@ -1,7 +0,0 @@ -text = True -non-interactive = True -webroot-path = /data/letsencrypt-acme-challenge -key-type = ecdsa -elliptic-curve = secp384r1 -preferred-chain = ISRG Root X1 -server = diff --git a/docker/dev/pdns-db.sql b/docker/dev/pdns-db.sql deleted file mode 100644 index c182cf78..00000000 --- a/docker/dev/pdns-db.sql +++ /dev/null @@ -1,255 +0,0 @@ -/* - -How this was generated: -1. bring up an empty pdns stack -2. use api to create a zone ... - -curl -X POST \ - 'http://npm.dev:8081/api/v1/servers/localhost/zones' \ - --header 'X-API-Key: npm' \ - --header 'Content-Type: application/json' \ - --data-raw '{ - "name": "example.com.", - "kind": "Native", - "masters": [], - "nameservers": [ - "ns1.pdns.", - "ns2.pdns." - ] -}' - -3. Dump sql: - -docker exec -ti npm.pdns.db mysqldump -u pdns -p pdns - -*/ - ----------------------------------------------------------------------- - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `comments` --- - -DROP TABLE IF EXISTS `comments`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `comments` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `domain_id` int(11) NOT NULL, - `name` varchar(255) NOT NULL, - `type` varchar(10) NOT NULL, - `modified_at` int(11) NOT NULL, - `account` varchar(40) CHARACTER SET utf8mb3 DEFAULT NULL, - `comment` text CHARACTER SET utf8mb3 NOT NULL, - PRIMARY KEY (`id`), - KEY `comments_name_type_idx` (`name`,`type`), - KEY `comments_order_idx` (`domain_id`,`modified_at`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `comments` --- - -LOCK TABLES `comments` WRITE; -/*!40000 ALTER TABLE `comments` DISABLE KEYS */; -/*!40000 ALTER TABLE `comments` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `cryptokeys` --- - -DROP TABLE IF EXISTS `cryptokeys`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `cryptokeys` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `domain_id` int(11) NOT NULL, - `flags` int(11) NOT NULL, - `active` tinyint(1) DEFAULT NULL, - `published` tinyint(1) DEFAULT 1, - `content` text DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `domainidindex` (`domain_id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `cryptokeys` --- - -LOCK TABLES `cryptokeys` WRITE; -/*!40000 ALTER TABLE `cryptokeys` DISABLE KEYS */; -/*!40000 ALTER TABLE `cryptokeys` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `domainmetadata` --- - -DROP TABLE IF EXISTS `domainmetadata`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `domainmetadata` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `domain_id` int(11) NOT NULL, - `kind` varchar(32) DEFAULT NULL, - `content` text DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `domainmetadata_idx` (`domain_id`,`kind`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `domainmetadata` --- - -LOCK TABLES `domainmetadata` WRITE; -/*!40000 ALTER TABLE `domainmetadata` DISABLE KEYS */; -INSERT INTO `domainmetadata` VALUES -(1,1,'SOA-EDIT-API','DEFAULT'); -/*!40000 ALTER TABLE `domainmetadata` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `domains` --- - -DROP TABLE IF EXISTS `domains`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `domains` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(255) NOT NULL, - `master` varchar(128) DEFAULT NULL, - `last_check` int(11) DEFAULT NULL, - `type` varchar(8) NOT NULL, - `notified_serial` int(10) unsigned DEFAULT NULL, - `account` varchar(40) CHARACTER SET utf8mb3 DEFAULT NULL, - `options` varchar(64000) DEFAULT NULL, - `catalog` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `name_index` (`name`), - KEY `catalog_idx` (`catalog`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `domains` --- - -LOCK TABLES `domains` WRITE; -/*!40000 ALTER TABLE `domains` DISABLE KEYS */; -INSERT INTO `domains` VALUES -(1,'example.com','',NULL,'NATIVE',NULL,'',NULL,NULL); -/*!40000 ALTER TABLE `domains` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `records` --- - -DROP TABLE IF EXISTS `records`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `records` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `domain_id` int(11) DEFAULT NULL, - `name` varchar(255) DEFAULT NULL, - `type` varchar(10) DEFAULT NULL, - `content` varchar(64000) DEFAULT NULL, - `ttl` int(11) DEFAULT NULL, - `prio` int(11) DEFAULT NULL, - `disabled` tinyint(1) DEFAULT 0, - `ordername` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL, - `auth` tinyint(1) DEFAULT 1, - PRIMARY KEY (`id`), - KEY `nametype_index` (`name`,`type`), - KEY `domain_id` (`domain_id`), - KEY `ordername` (`ordername`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `records` --- - -LOCK TABLES `records` WRITE; -/*!40000 ALTER TABLE `records` DISABLE KEYS */; -INSERT INTO `records` VALUES -(1,1,'example.com','NS','ns1.pdns',1500,0,0,NULL,1), -(2,1,'example.com','NS','ns2.pdns',1500,0,0,NULL,1), -(3,1,'example.com','SOA','a.misconfigured.dns.server.invalid hostmaster.example.com 2023030501 10800 3600 604800 3600',1500,0,0,NULL,1); -/*!40000 ALTER TABLE `records` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `supermasters` --- - -DROP TABLE IF EXISTS `supermasters`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `supermasters` ( - `ip` varchar(64) NOT NULL, - `nameserver` varchar(255) NOT NULL, - `account` varchar(40) CHARACTER SET utf8mb3 NOT NULL, - PRIMARY KEY (`ip`,`nameserver`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `supermasters` --- - -LOCK TABLES `supermasters` WRITE; -/*!40000 ALTER TABLE `supermasters` DISABLE KEYS */; -/*!40000 ALTER TABLE `supermasters` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `tsigkeys` --- - -DROP TABLE IF EXISTS `tsigkeys`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `tsigkeys` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(255) DEFAULT NULL, - `algorithm` varchar(50) DEFAULT NULL, - `secret` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `namealgoindex` (`name`,`algorithm`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `tsigkeys` --- - -LOCK TABLES `tsigkeys` WRITE; -/*!40000 ALTER TABLE `tsigkeys` DISABLE KEYS */; -/*!40000 ALTER TABLE `tsigkeys` ENABLE KEYS */; -UNLOCK TABLES; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/docker/dev/pebble-config.json b/docker/dev/pebble-config.json deleted file mode 100644 index ea937905..00000000 --- a/docker/dev/pebble-config.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "pebble": { - "listenAddress": "0.0.0.0:443", - "managementListenAddress": "0.0.0.0:15000", - "certificate": "test/certs/localhost/cert.pem", - "privateKey": "test/certs/localhost/key.pem", - "httpPort": 80, - "tlsPort": 443, - "ocspResponderURL": "", - "externalAccountBindingRequired": false - } -} diff --git a/docker/docker-compose.ci.mysql.yml b/docker/docker-compose.ci.mysql.yml deleted file mode 100644 index 388cdb38..00000000 --- a/docker/docker-compose.ci.mysql.yml +++ /dev/null @@ -1,27 +0,0 @@ -# WARNING: This is a CI docker-compose file used for building and testing of the entire app, it should not be used for production. -services: - - fullstack: - environment: - DB_MYSQL_HOST: 'db-mysql' - DB_MYSQL_PORT: '3306' - DB_MYSQL_USER: 'npm' - DB_MYSQL_PASSWORD: 'npmpass' - DB_MYSQL_NAME: 'npm' - depends_on: - - db-mysql - - db-mysql: - image: jc21/mariadb-aria - environment: - MYSQL_ROOT_PASSWORD: 'npm' - MYSQL_DATABASE: 'npm' - MYSQL_USER: 'npm' - MYSQL_PASSWORD: 'npmpass' - volumes: - - mysql_vol:/var/lib/mysql - networks: - - fulltest - -volumes: - mysql_vol: diff --git a/docker/docker-compose.ci.sqlite.yml b/docker/docker-compose.ci.sqlite.yml deleted file mode 100644 index 1c5be48e..00000000 --- a/docker/docker-compose.ci.sqlite.yml +++ /dev/null @@ -1,9 +0,0 @@ -# WARNING: This is a CI docker-compose file used for building and testing of the entire app, it should not be used for production. -services: - - fullstack: - environment: - DB_SQLITE_FILE: '/data/mydb.sqlite' - PUID: 1000 - PGID: 1000 - DISABLE_IPV6: 'true' diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts deleted file mode 100644 index 52586bfc..00000000 --- a/docs/.vitepress/config.mts +++ /dev/null @@ -1,61 +0,0 @@ -import { defineConfig, type DefaultTheme } from 'vitepress'; - -// https://vitepress.dev/reference/site-config -export default defineConfig({ - title: "Nginx Proxy Manager", - description: "Expose your services easily and securely", - head: [ - ["link", { rel: "icon", href: "/icon.png" }], - ["meta", { name: "description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt" }], - ["meta", { property: "og:title", content: "Nginx Proxy Manager" }], - ["meta", { property: "og:description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt"}], - ["meta", { property: "og:type", content: "website" }], - ["meta", { property: "og:url", content: "https://nginxproxymanager.com/" }], - ["meta", { property: "og:image", content: "https://nginxproxymanager.com/icon.png" }], - ["meta", { name: "twitter:card", content: "summary"}], - ["meta", { name: "twitter:title", content: "Nginx Proxy Manager"}], - ["meta", { name: "twitter:description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt"}], - ["meta", { name: "twitter:image", content: "https://nginxproxymanager.com/icon.png"}], - ["meta", { name: "twitter:alt", content: "Nginx Proxy Manager"}], - // GA - ['script', { async: 'true', src: 'https://www.googletagmanager.com/gtag/js?id=G-TXT8F5WY5B'}], - ['script', {}, "window.dataLayer = window.dataLayer || [];\nfunction gtag(){dataLayer.push(arguments);}\ngtag('js', new Date());\ngtag('config', 'G-TXT8F5WY5B');"], - ], - sitemap: { - hostname: 'https://nginxproxymanager.com' - }, - metaChunk: true, - srcDir: './src', - outDir: './dist', - themeConfig: { - // https://vitepress.dev/reference/default-theme-config - logo: { src: '/logo.svg', width: 24, height: 24 }, - nav: [ - { text: 'Setup', link: '/setup/' }, - ], - sidebar: [ - { - items: [ - // { text: 'Home', link: '/' }, - { text: 'Guide', link: '/guide/' }, - { text: 'Screenshots', link: '/screenshots/' }, - { text: 'Setup Instructions', link: '/setup/' }, - { text: 'Advanced Configuration', link: '/advanced-config/' }, - { text: 'Upgrading', link: '/upgrading/' }, - { text: 'Frequently Asked Questions', link: '/faq/' }, - { text: 'Third Party', link: '/third-party/' }, - ] - } - ], - socialLinks: [ - { icon: 'github', link: 'https://github.com/NginxProxyManager/nginx-proxy-manager' } - ], - search: { - provider: 'local' - }, - footer: { - message: 'Released under the MIT License.', - copyright: 'Copyright © 2016-present jc21.com' - } - } -}); diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css deleted file mode 100644 index cd485237..00000000 --- a/docs/.vitepress/theme/custom.css +++ /dev/null @@ -1,27 +0,0 @@ -:root { - --vp-home-hero-name-color: transparent; - --vp-home-hero-name-background: -webkit-linear-gradient(120deg, #f15833 30%, #FAA42F); - - --vp-home-hero-image-background-image: linear-gradient(-45deg, #aaaaaa 50%, #777777 50%); - --vp-home-hero-image-filter: blur(44px); - - --vp-c-brand-1: #f15833; - --vp-c-brand-2: #FAA42F; - --vp-c-brand-3: #f15833; -} - - @media (min-width: 640px) { - :root { - --vp-home-hero-image-filter: blur(56px); - } -} - - @media (min-width: 960px) { - :root { - --vp-home-hero-image-filter: blur(68px); - } -} - -.inline-img img { - display: inline; -} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts deleted file mode 100644 index 42fe9a93..00000000 --- a/docs/.vitepress/theme/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import DefaultTheme from 'vitepress/theme' -import './custom.css' - -export default DefaultTheme diff --git a/docs/src/guide/index.md b/docs/src/guide/index.md deleted file mode 100644 index ad350b3b..00000000 --- a/docs/src/guide/index.md +++ /dev/null @@ -1,126 +0,0 @@ ---- -outline: deep ---- - -# Guide - -::: raw -
-::: - -This project comes as a pre-built docker image that enables you to easily forward to your websites -running at home or otherwise, including free SSL, without having to know too much about Nginx or Letsencrypt. - -- [Quick Setup](#quick-setup) -- [Full Setup](/setup/) -- [Screenshots](/screenshots/) - -## Project Goal - -I created this project to fill a personal need to provide users with an easy way to accomplish reverse -proxying hosts with SSL termination and it had to be so easy that a monkey could do it. This goal hasn't changed. -While there might be advanced options they are optional and the project should be as simple as possible -so that the barrier for entry here is low. - -::: raw -