HomePage.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. <template>
  2. <div>
  3. <v-card outline tile class="pa-md-12 pa-8 elevation-4" style="overflow: hidden">
  4. <div class="d-none d-md-block triangle-bg"></div>
  5. <v-container class="pa-0">
  6. <v-row align="center">
  7. <v-col class="col-md-6 col-12 py-8 triangle-fg">
  8. <h1 class="text-h4 font-weight-bold">Modern DNS Hosting for Everyone</h1>
  9. <h3 class="subheading mt-2 pt-8 font-weight-regular">
  10. <p>
  11. deSEC is a <strong>free DNS hosting</strong> service, <strong>designed with security in mind</strong>.
  12. </p>
  13. <p>
  14. Running on <strong>open-source software</strong> and <strong>supported by <a href="https://securesystems.de/">SSE</a></strong>,
  15. deSEC is free for everyone to use.
  16. </p>
  17. </h3>
  18. <div class="pa-2">
  19. <v-form @submit.prevent="signup" :value="valid" ref="form">
  20. <v-row>
  21. <v-col md="9" cols="12">
  22. <div class="d-flex align-center flex-column">
  23. <v-radio-group
  24. v-model="domainType"
  25. class="pb-2"
  26. hide-details
  27. row
  28. @change="$router.push({query: {domainType: domainType}})"
  29. >
  30. <v-radio class="pb-2" label="Managed DNS account" value="custom"></v-radio>
  31. <v-radio class="pb-2" label="dynDNS account" value="dynDNS"></v-radio>
  32. </v-radio-group>
  33. </div>
  34. <v-text-field
  35. outlined
  36. solo
  37. flat
  38. v-model="email"
  39. :prepend-inner-icon="mdiEmail"
  40. type="email"
  41. placeholder="Account Email Address"
  42. :rules="email_rules"
  43. validate-on-blur
  44. ></v-text-field>
  45. <v-btn
  46. color="primary"
  47. type="submit"
  48. depressed
  49. x-large
  50. block
  51. >
  52. Create Account
  53. </v-btn>
  54. </v-col>
  55. </v-row>
  56. </v-form>
  57. </div>
  58. </v-col>
  59. </v-row>
  60. </v-container>
  61. </v-card>
  62. <v-container fluid>
  63. <v-container>
  64. <v-row justify="center" class="py-8">
  65. <v-col class="col-12 col-sm-4 text-center" v-for="f in features" :key="f.title">
  66. <v-icon x-large>{{ f.icon }}</v-icon>
  67. <h1 class="grey--text text--darken-2"><span>{{ f.title }}</span></h1>
  68. <p v-html="f.text"></p>
  69. </v-col>
  70. </v-row>
  71. </v-container>
  72. </v-container>
  73. <v-container fluid class="grey lighten-4">
  74. <v-container class="py-8">
  75. <v-row align="center">
  76. <v-col class="text-center">
  77. <h2>Supporters</h2>
  78. </v-col>
  79. </v-row>
  80. <v-row align="center" class="py-2" justify="center">
  81. <v-col class="col-12 col-lg-3 py-4">
  82. <v-layout class="justify-center">
  83. <img loading="lazy" :src="require('../assets/non-free/sse.logo.png')" alt="SSE Logo" class="mr-6" style="max-width: 160px; width: 100%"/>
  84. </v-layout>
  85. </v-col>
  86. <v-col class="col-12 col-sm-10 col-lg-9 py-4 text-center">
  87. <a class="primary--text text--darken-2" href="https://securesystems.de/">SSE</a> supports us with staff for
  88. software development and our standardization activities within the IETF and ICANN.
  89. We trust them because creating and auditing security solutions is their daily business.
  90. </v-col>
  91. </v-row>
  92. <v-row align="center" class="py-2" justify="center">
  93. <v-col class="col-12 col-lg-3 py-4">
  94. <v-layout class="justify-center">
  95. <img loading="lazy" :src="require('../assets/non-free/nlnet.logo.svg')" alt="NLnet Foundation Logo" class="mr-6" style="max-width: 180px; width: 100%"/>
  96. </v-layout>
  97. </v-col>
  98. <v-col class="col-12 col-sm-10 col-lg-9 py-4 text-center">
  99. deSEC receives funding through <a class="primary--text text--darken-2" href="https://nlnet.nl/">NLnet
  100. Foundation</a> for its work on the automation and future viability of DNSSEC. The <strong>NGI Assure</strong>
  101. fund, established with financial support from the European Commission's <strong>Next Generation
  102. Internet</strong> programme, is dedicated to technologies providing strong assurances about the Internet's
  103. security and trustworthiness.
  104. </v-col>
  105. </v-row>
  106. <v-row align="center" class="py-2" justify="center">
  107. <v-col class="col-12 col-lg-3 py-4">
  108. <v-layout class="justify-center">
  109. <img loading="lazy" :src="require('../assets/non-free/ripe-ncc.logo.svg')" alt="RIPE NCC Logo" class="mr-6" style="margin-bottom: -7%; margin-top: -7%; max-width: 240px; width: 100%"/>
  110. </v-layout>
  111. </v-col>
  112. <v-col class="col-12 col-sm-10 col-lg-9 py-4 text-center">
  113. Through their Community Projects Fund, <a class="primary--text text--darken-2" href="https://ripe.net/">RIPE NCC</a>
  114. supports the ongoing operation of our DNS platform and covers global Anycast network expenses in
  115. particular. We greatly appreciate their support.
  116. </v-col>
  117. </v-row>
  118. <v-row align="center" class="py-2" justify="center">
  119. <v-col class="col-12 col-lg-3 py-4">
  120. <v-layout class="justify-center">
  121. <img loading="lazy" :src="require('../assets/non-free/sox.logo.svg')" alt="SOX Logo" class="mr-6" style="max-width: 170px; width: 100%"/>
  122. </v-layout>
  123. </v-col>
  124. <v-col class="col-12 col-sm-10 col-lg-9 py-4 text-center">
  125. The Serbian Open eXchange, <a class="primary--text text--darken-2" href="https://sox.rs/">SOX</a>, provides us
  126. with an anycast node in Belgrade, extending our presence to Eastern Europe.
  127. </v-col>
  128. </v-row>
  129. </v-container>
  130. </v-container>
  131. <v-container fluid>
  132. <v-container class="py-8">
  133. <v-row align="center">
  134. <v-col class="text-center">
  135. <h2>Partners</h2>
  136. </v-col>
  137. </v-row>
  138. <v-row justify="center">
  139. <v-col class="py-4 text-center">
  140. <a href="https://nextcloud.com/"><img loading="lazy" :src="require('../assets/non-free/nextcloud-logo-inverted.svg')" alt="Nextcloud Logo" class="mx-6 my-2" style="display: inline-block; max-height: 113px; max-width: 160px; width: 100%"/></a>
  141. <a href="https://www.hanssonit.se/"><img loading="lazy" :src="require('../assets/non-free/hanssonit.logo.png')" alt="Hansson IT Logo" class="mx-6 my-2" style="display: inline-block; max-height: 113px; max-width: 160px; width: 100%"/></a>
  142. </v-col>
  143. </v-row>
  144. </v-container>
  145. </v-container>
  146. <v-container fluid class="grey lighten-4">
  147. <v-container>
  148. <v-row align="center" justify="center">
  149. <v-card
  150. class="mx-auto col-12"
  151. color="grey lighten-5"
  152. >
  153. <v-card-text
  154. class="pt-6"
  155. style="position: relative;"
  156. >
  157. <h3 class="text-h4 mb-2 text--darken-2 grey--text text-center">
  158. deSEC Global Anycast Networks
  159. </h3>
  160. <div class="font-weight-light text-h6 mb-2">
  161. Global distribution of our frontend servers ensures quick answers to queries, regardless of the user's
  162. location on the globe. You can
  163. <a :href="'mailto:' + contact_email + '?subject=' + encodeURIComponent(contact_subject) +
  164. '&body=' + encodeURIComponent(contact_body)"
  165. >support deSEC</a> by adopting a frontend server to help us cover the cost or adding a frontend server
  166. in a corner of the world where there is no frontend yet.
  167. </div>
  168. </v-card-text>
  169. <v-img
  170. :src="require('../assets/anycast.worldmap.svg')" alt="World Map of Anycast POPs" contain
  171. class="justify-center"
  172. style="display: block; width: 100%; aspect-ratio: 2/1"
  173. >
  174. <v-tooltip bottom v-for="f in frontends" :key="f.host">
  175. <template #activator="{ on }">
  176. <v-img
  177. v-on="on"
  178. :src="require('../assets/mapmarker.svg')" alt="Anycast POP" height="2em" width="2em"
  179. :style="{left: f.left, top: f.top}"
  180. style="transform: translate(-50%, -100%); position: absolute; overflow: visible;" contain
  181. >
  182. </v-img>
  183. </template>
  184. <span>
  185. {{ f.name }}
  186. <span v-if="f.adopted_by">sponsored by {{ f.adopted_by }}</span>
  187. <span v-else>has no sponsor, support it now!</span>
  188. </span>
  189. </v-tooltip>
  190. </v-img>
  191. </v-card>
  192. </v-row>
  193. </v-container>
  194. </v-container>
  195. </div>
  196. </template>
  197. <style scoped>
  198. div.triangle-bg {
  199. border: 80em solid transparent;
  200. border-right: 60em solid #FFC107;
  201. position: absolute;
  202. right: 0;
  203. bottom: -20em;
  204. width: 0;
  205. z-index: 1;
  206. }
  207. .triangle-fg {
  208. z-index: 2;
  209. }
  210. </style>
  211. <script>
  212. import {email_pattern} from '@/validation';
  213. import {useUserStore} from "@/store/user";
  214. import {
  215. mdiCertificate,
  216. mdiCloudCheck,
  217. mdiDatabaseArrowUp,
  218. mdiDns, mdiEmail, mdiFileCertificate, mdiFlower, mdiGift, mdiHeartBroken,
  219. mdiIpNetworkOutline, mdiLan,
  220. mdiLockOutline,
  221. mdiMonitorCellphoneStar,
  222. mdiRobot, mdiRunFast,
  223. mdiTwoFactorAuthentication
  224. } from "@mdi/js";
  225. export default {
  226. name: 'HomePage',
  227. components: {
  228. },
  229. methods: {
  230. async signup() {
  231. if (this.$refs.form.validate()) {
  232. this.$router.push({name: 'signup', params: this.email ? {email: this.email} : {}, query: {domainType: this.domainType}});
  233. }
  234. },
  235. },
  236. created() {
  237. this.domainType = this.$route.query.domainType || 'none';
  238. for (let news of this.breaking_news) {
  239. if (new Date() >= news.start && new Date() < news.end) {
  240. useUserStore().alert(news);
  241. }
  242. }
  243. },
  244. data: () => ({
  245. mdiEmail,
  246. contact_email: process.env.VUE_APP_EMAIL,
  247. contact_subject: 'Adopting of a Frontend Server',
  248. contact_body: 'Dear deSEC,\n\nI would like to adopt a frontend server in your networks!',
  249. domainType: null,
  250. email: '',
  251. email_rules: [
  252. v => !!email_pattern.test(v || '') || 'Invalid email address.'
  253. ],
  254. valid: false,
  255. frontends: [
  256. {
  257. name: 'Santiago de Chile (ns2.desec.org)',
  258. host: 'scl-1.c.desec.io',
  259. left: '22%',
  260. top: '85%',
  261. },
  262. {
  263. name: 'London (ns2.desec.org)',
  264. host: 'lhr-1.c.desec.io',
  265. left: '45%',
  266. top: '20%',
  267. },
  268. {
  269. name: 'Singapore (ns2.desec.org)',
  270. host: 'sin-1.c.desec.io',
  271. left: '81%',
  272. top: '57.5%',
  273. },
  274. {
  275. name: 'Dubai (ns2.desec.org)',
  276. host: 'dxb-1.c.desec.io',
  277. left: '64%',
  278. top: '40.2%',
  279. },
  280. {
  281. name: 'Los Angeles (ns2.desec.org)',
  282. host: 'lax-1.c.desec.io',
  283. left: '6%',
  284. top: '32%',
  285. },
  286. {
  287. name: 'Tokyo (ns2.desec.org)',
  288. host: 'tyo-1.c.desec.io',
  289. left: '90.4%',
  290. top: '32.2%',
  291. },
  292. {
  293. name: 'Frankfurt (ns2.desec.org)',
  294. host: 'fra-1.c.desec.io',
  295. left: '49.0%',
  296. top: '23.0%',
  297. },
  298. {
  299. name: 'New York (ns2.desec.org)',
  300. host: 'lga-1.c.desec.io',
  301. left: '22%',
  302. top: '29%',
  303. },
  304. {
  305. name: 'Amsterdam (ns1.desec.io)',
  306. host: 'ams-1.a.desec.io',
  307. left: '47%',
  308. top: '22%',
  309. },
  310. {
  311. name: 'Frankfurt (ns1.desec.io)',
  312. host: 'fra-1.a.desec.io',
  313. left: '48.5%',
  314. top: '23.5%',
  315. },
  316. {
  317. name: 'Johannesburg (ns1.desec.io)',
  318. host: 'jnb-1.a.desec.io',
  319. left: '54%',
  320. top: '81%',
  321. },
  322. {
  323. name: 'São Paulo (ns1.desec.io)',
  324. host: 'sao-1.a.desec.io',
  325. left: '29.3%',
  326. top: '78%',
  327. },
  328. {
  329. name: 'Sydney (ns1.desec.io)',
  330. host: 'syd-1.a.desec.io',
  331. left: '93%',
  332. top: '84%',
  333. },
  334. {
  335. name: 'Dallas, TX (ns1.desec.io)',
  336. host: 'dfw-1.a.desec.io',
  337. left: '13%',
  338. top: '34%',
  339. },
  340. {
  341. name: 'Hong Kong (ns1.desec.io)',
  342. host: 'hkg-1.a.desec.io',
  343. left: '83.5%',
  344. top: '42.2%',
  345. },
  346. {
  347. name: 'Belgrade (ns1.desec.io)',
  348. host: 'beg-1.a.desec.io',
  349. left: '51.6%',
  350. top: '25.5%',
  351. adopted_by: 'SOX',
  352. },
  353. ],
  354. features: [
  355. {
  356. href: '#',
  357. icon: mdiLockOutline,
  358. title: 'DNSSEC',
  359. text: 'DNS information hosted at deSEC is <b>signed with DNSSEC, always</b>. We use state-of-the-art '
  360. + 'elliptic-curve cryptography. Besides following operational best practice, we adopt '
  361. + '<a href="https://datatracker.ietf.org/doc/draft-ietf-dnsop-dnssec-bootstrapping/" target="_blank">cutting-edge '
  362. + 'developments</a>.',
  363. },
  364. {
  365. href: '#',
  366. icon: mdiCloudCheck,
  367. title: 'Cloud Integration',
  368. text: 'Thanks to <a href="https://talk.desec.io/t/tools-implementing-desec/11" target="_blank">cloud '
  369. + 'integrations and language bindings</a>, deSEC works out of the box in automated environments. '
  370. + 'Examples include <b>Terraform</b> providers and <b>Go, Python, and JavaScript bindings.</b>',
  371. },
  372. {
  373. href: '#',
  374. icon: mdiDns,
  375. title: 'Modern Record Types',
  376. text: 'We support a <a href="https://desec.readthedocs.io/en/latest/dns/rrsets.html#supported-types" target="_blank">broad '
  377. + 'array of record types</a>, including novel types such as <code>HTTPS</code>/<code>SVCB</code> (for '
  378. + '<code>CNAME</code>-like behavior at the apex), <code>CDNSKEY</code>/<code>CDS</code> (RFC 8078, RFC '
  379. + '8901), or <code>OPENPGPKEY</code>, <code>SMIMEA</code>, and <code>TLSA</code>.',
  380. },
  381. {
  382. href: '#',
  383. icon: mdiMonitorCellphoneStar,
  384. title: 'Web Interface',
  385. text: 'We think we have the <b>coolest GUI on the market</b>. Thanks to <b>real-time record validation</b> and '
  386. + 'parsing, it is <b>very intuitive and fast</b> to use (even on mobile devices). Get started by '
  387. + 'importing your domain.',
  388. },
  389. {
  390. href: '#',
  391. icon: mdiRobot,
  392. title: 'REST API',
  393. text: 'Exert full control over your DNS via our <b>modern API</b> and benefit from advanced features such as '
  394. + ' bulk operations. It is <a href="https://desec.readthedocs.io/en/latest/dns/domains.html" target="_blank">well-documented</a> '
  395. + ' and easily integrates into your scripts, tools, or CI/CD pipeline.',
  396. },
  397. {
  398. href: '#',
  399. icon: mdiTwoFactorAuthentication,
  400. title: 'Multi-Factor Auth (2FA)',
  401. text: 'Accidentally shared your password with someone? Enable MFA to <b>keep your account safe</b>. We '
  402. + 'currently support <b>TOTP tokens</b> (Authenticator app), with WebAuthn in the making.',
  403. },
  404. {
  405. href: '#',
  406. icon: mdiDatabaseArrowUp,
  407. title: 'Scalability',
  408. text: 'Are you a web hoster? Start using deSEC, <b>even with thousands of domains</b>. Our global network '
  409. + 'ensures <b>high availability and performance everywhere</b>. <a href="mailto:support@desec.io">Talk '
  410. + 'to us</a> about your use case.',
  411. },
  412. {
  413. href: '#',
  414. icon: mdiIpNetworkOutline,
  415. title: 'IPv6',
  416. text: 'deSEC is <b>fully IPv6-aware</b>: administration can be done using v6, AAAA-records '
  417. + 'containing IPv6 addresses can be set up, our name servers are reachable via IPv6.',
  418. },
  419. {
  420. href: '#',
  421. icon: mdiRunFast,
  422. title: 'Fast Updates',
  423. text: 'Updates to your DNS information will be <b>published world-wide within a few seconds</b>. '
  424. + 'Minimum required TTLs are low.',
  425. },
  426. {
  427. href: '#',
  428. icon: mdiCertificate,
  429. title: 'DANE / TLSA',
  430. text: 'Secure your web service with <code>TLSA</code> records, <b>hardening it against fraudulently issued SSL '
  431. + 'certificates</b>. You can also use other DANE techniques, such as <code>OPENPGPKEY</code> key '
  432. + 'exchange.',
  433. },
  434. {
  435. href: '#',
  436. icon: mdiFileCertificate,
  437. title: "Let's Encrypt Integration",
  438. text: 'We provide <b><a href="https://pypi.org/project/certbot-dns-desec/">easy integration</a> with Let\'s '
  439. + 'Encrypt</b> and their certbot tool. '
  440. + '<a href="https://talk.desec.io/t/tools-implementing-desec/11">Further integration with other '
  441. + 'tools</a> like acme.sh, lego, and Terraform is available.',
  442. },
  443. {
  444. href: '#',
  445. icon: mdiLan,
  446. title: 'Low-latency Anycast',
  447. text: 'We run <b>global networks of high-performance frontend DNS servers</b>. Your query is routed to the '
  448. + '<b>closest server</b> via Anycast, so clients receive answers as fast as possible.',
  449. },
  450. {
  451. href: '#',
  452. icon: mdiFlower,
  453. title: 'Open Source',
  454. text: 'deSEC runs <b>100% on free and open-source</b> software. Start hacking away!',
  455. },
  456. {
  457. href: '#',
  458. icon: mdiGift,
  459. title: 'Non-profit',
  460. text: 'deSEC is organized as a <b>non-profit organization based in Berlin</b>. We make sure that privacy '
  461. + 'is not compromised by business interest.',
  462. },
  463. ],
  464. breaking_news: [
  465. {
  466. id: 'news-20201017001',
  467. start: new Date(Date.UTC(2020, 10 - 1, 17)), // first day of showing
  468. end: new Date(Date.UTC(2020, 10 - 1, 20)), // first day of not showing
  469. icon: mdiHeartBroken,
  470. teaser: 'deSEC API and web services have been unavailable on 17 Oct 2020 starting at 4:26 am UTC and resumed ' +
  471. 'normal operations at 10:13 am UTC. DNS operations continued throughout.',
  472. button: 'deSEC Status Details',
  473. href: '//desec-status.net/',
  474. },
  475. {
  476. id: 'news-20221010001',
  477. start: new Date(Date.UTC(2022, 10 - 1, 10)), // first day of showing
  478. end: new Date(Date.UTC(2022, 10 - 1, 12)), // first day of not showing
  479. icon: mdiHeartBroken,
  480. teaser: "From 10 Oct 2022 11:32 am UTC until 10 Oct 2022 16:33 UTC, the deSEC web interface was unavailable " +
  481. "when accessed via direct links, e.g. though emails sent by deSEC. The issue has been fixed; links that " +
  482. "have not expired in the meantime are now working when opened. Direct login to the web interface and " +
  483. "deSEC DNS operations were not affected.",
  484. },
  485. ],
  486. })
  487. }
  488. </script>