使用Sveltekit构建对隐私友好的,自托管的应用程序体系结构
#javascript #编程 #docker #svelte

这是building a gratitude journaling app called Appreciation Jar系列的第二篇文章。在上一篇文章中,我们详细介绍了使用Sveltekit和电容器发布iOS和Android应用程序的过程。今天,我想谈谈应用程序的基础架构和隐私方面。

基础架构概述

让我们从高级基础架构图开始,然后详细介绍。有很多要打开包装的东西,但是我们将一一浏览图的每个部分!该应用程序的总体架构目标是能够在不依赖第三方服务的情况下运行所有​​“内部”的所有内容,我设法完成了这些服务,同时仍然拥有现代女子,例如实时更新,跟踪和错误监视。如果您想在阅读此帖子之前尝试该应用程序,则可以这样做here

平台-Caprover

用于托管我正在使用CapRover的所有服务。这是一个非常简单的PAAS(平台即服务),可为您提供类似于Heroku的界面,但完全可以在您控制的虚拟专用服务器上运行。对于自动部署,使用GITHUB操作。我已经录制了一个有关如何开始并部署Sveltekit的教程,因此请通过单击下面的图像来检查一下这听起来很有趣!

注意:似乎Svelte Society视频在最后有一些问题,因此,如果您陷入困境,则可以观看this version of the video where the sound is intact

数据库-PostgreSQL

当您使用Caprover的自助主持人时,您会有大量所谓的“单击应用程序”,使您可以轻松部署像MySQL,PostgreSQL甚至Microsoft SQL这样的普通数据库,如果这是您的茶!<<<<<<<<<<<<<<<<<< /p>

赞赏jar正在运行通过“一点击应用”功能部署的标准PostgreSQL实例。

身份验证

对于身份验证,我想让事情变得非常简单,而没有任何第三方。我登陆的方法是:

  1. 当您注册为用户时,您不会提交任何个人信息,例如您的电子邮件,电话号码甚至密码。
  2. 我们在注册后为每个用户内部为内部生成一个独特的强密码。生成的密码返回给用户并存储在LocalStorage(或iOS/Android上的@capacitor/preferences -see implementation)。
  3. 鼓励用户保存其“恢复密钥”(实际上只是他们的唯一用户ID +密码组合36中编码的唯一用户ID +密码组合),并在稍后在应用程序中恢复它,以防他们想切换到其他电话。
  4. 由出色的sveltekit-rate-limiter包提供的API限制了一些光速。

这远非完美的方法。例如,用户责任备份其恢复密钥。另一方面,它不需要用户提交任何个人数据。当涉及GDPR和隐私时,我认为最好的数据是您甚至不需要存储的数据。 ð

这是好奇的登录系统的一些屏幕截图:

加密

加密是一个特别困难的话题,应该得到自己的博客文章 - 我只会在这里浏览表面。

加密的核心是关于隐私的,我相信可以在没有加密的情况下实现隐私。例如,通过注册期间不收集任何用户数据(昵称除),我们的应用不知道我们的用户是谁。我认为这是一个很好的权衡,仍然可以让您使用自动化工具来检测平台的滥用。它还为您提供了一个选项,可以通过允许您交叉检查信息来帮助失去恢复键的用户。

另一方面,如果我们选择加密,事情会变得更加困难。如果我们想在没有任何安全剧院的情况下真正实现加密,我们将持有用户密钥并可以真正解锁数据,我们需要实现真实的端到端加密,这意味着我们无法访问用户加密密钥。这意味着,如果用户失去恢复密钥,他们的数据将永远无法访问。您也无法在平台上检测到滥用,因为您将无法检查任何数据。

在这种情况下,最终最终提出了刻度的是什么是需要通过Web浏览器访问的某些功能,例如应用程序中的仪表板功能,这使您可以对智能冰箱或Raspberry之类的内容进行最新的欣赏pi。另一件事是,该应用程序的核心是与其他用户共享您的消息,这将涉及一个相当复杂的加密方案,以支持添加和删除成员。考虑到这一点,我选择了保护隐私的方法,而不是端到端的加密。

仪表板功能的演示。

umami

分析

Analytics是很容易成为隐私头痛的东西。为了尽可能解决这些问题,我实施的策略是自助架分析工具Umami(同样,通过Caprover中的一单击“应用程序”功能!)。

由于我对跟踪个人用户并不真正感兴趣,但是总汇总以了解服务的健康状况,因此我还将用户跟踪从客户端端移到了服务器端。这意味着客户端根本没有跟踪器!取而代之的是,我们有一个小的中间件,用于Sveltekit,可以自动跟踪页面视图和API命中。我已经组装了向Umami发送跟踪请求的代码,以及自动跟踪页面视图in this gist if you're interested的挂钩中间件!

感谢此,我们可以在不强迫用户加载任何跟踪器的情况下获得用户活动的概述:

我们还可以在某些地方跟踪特定的操作,例如用户寄存器,然后将其绘制在umami上的图表上。例如,这是用户注册帐户时的跟踪呼叫:

trackRequest(
    'event',
    {
        url: '/',
        event_name: 'user_created'
    }
);

再次,没有与此一起发送的用户数据,并且仅在+server.ts端点!

中完成。

这是事件仪表板的外观:

pushpin

实时

用于实时,我将Pushpin与服务器发送事件一起使用。 (它也支持websocket)。

我真正喜欢的PushPin是您可以运行它as a single self-hosted Docker container,并且它具有独特的体系结构,它可以在您的服务之上充当代理。我建议您阅读他们的文档,以确切弄清楚这需要什么,但是实际上意味着所有身份验证和数据获取均由Sveltekit App来处理 - Pushpin只是一个愚蠢的无状态框,可确保用户收到更新的更新实时数据!

使用实时我们可以做一些有趣的事情,例如在没有任何第三方服务的情况下在设备上同步数据,这是一个演示:

错误监视GlitchTip

Glitchtip是一项非常酷的自托管监控服务。之所以很酷,是因为它与Sentry client SDK兼容!从Caprover中的一键应用程序设置GlitchTip(注意a Protest?ð),我们在Sveltekit应用程序中使用以下方式将其初始化:

..我们已经完成了!现在,我们获得了一个不错的仪表板,可以在其中检查用户实时遇到的错误:

当然,我们首先询问我们的用户是否会在注册期间接受诊断数据!如果未给予同意,我们不会初始化库。

带有Postgres-backup-local的备份

许多云服务以较小的成本为您的服务器提供自动备份。我主要依靠此功能来用于服务器备份。这些备份往往每隔几天运行一次,在还原服务器时,这是可以接受的,但最好是您希望拥有一个新版本的数据库以后还原。为此,我使用prodrigestivill/postgres-backup-local Docker image。您可以看到下面使用的配置的示例:

此配置将在我的服务器上的一个位置中每小时放置数据库的备份。从那里,我在家中使用了Synology NAS中的rsync在CRON计划下下载备份。

关于托管位置的注释

“位置,位置,位置”是一句众所周知的格言,当您试图决定托管应用程序的位置时,它也同样奏效。

除非您在过去几年中一直生活在岩石下,否则不可能错过无服务器云服务的扩散。 Vercel,Netlify,DeNo部署,Cloudflare工人,Firebase-所有很酷的孩子都有服务供您使用。云数据库的产品也是如此。

边缘肯定是很酷的技术,但是要记住隐私的影响。由于Edge Runtimes在全球运行,这意味着可以在任何地方处理用户数据。

如果您来自欧盟,则可能知道GDPR。尽管GDPR远非完美,但这是一项绝佳的隐私立法。它已设法将大多数公司的心态从“尽可能多的数据”转移到“数据是应谨慎处理的责任”。

此外,随着Privacy Shield的法律无效,以前允许将个人数据从欧盟转移给我们,我认为除外行以外的任何人都无法最终说明是否合法地使用无服务器服务,如果他们正在与个人合作。欧盟公民的数据。我对此的看法是:如果我们可以构建一项不需要我们处理复杂隐私影响的服务,这听起来像是一个好主意!

我目前正在使用Digitalocean在德国运行的服务器上托管应用程序基础架构。 Digitalocean提供了标准化的DPA,该DPA限制了向美国转移。由于Digitalocean是一家总部位于美国的公司,我目前也评估了欧盟提供商Hetzner。

结论 - 堆栈太复杂了吗?

有些人可能会读这篇文章,并想到“这肯定是为了简单的事情,这似乎是很多工作”。你会没错的。这种体系结构是自我托管的实验。您本可以在没有跟踪,错误监视或实时的情况下离开。另外,您可以使用免费的外部服务或每月只需花费几美元。但是对我来说,组装一个提供现代功能的堆栈,同时仍然非常意识到用户隐私是值得的。最后,每个人都必须自己进行权衡。

如果您有任何疑问,请随时发表评论,不要忘记尝试为WebiOSAndroid尝试欣赏罐子!

ppe lloging aguments wurchona kovation(cótmongubb)hy hard hard haph a photh of Photoan