生活黑客-免费在云端编写和托管带有访客留言簿的网站

免费在云端托管访客留言网站


如今,您可以在云中免费部署带有二级域名的网站。 您对方法感到好奇吗? 继续阅读。


我建议您看一下如何在ASP.NET Core(带有reCAPTCHA)上创建留言簿,并将其免费托管在相当知名的云托管中(是的,但有限制,但是它非常适合流量不多的个人网站)


作为数据库,我喜欢Atlas的MongoDB 。 它也可以是免费的“ zayuzat”。
另外,DynamoDB仍然有不错的选择,带有某种免费限制和Firebase Firestore。


该应用程序将被码头化。 但是由于“没有欲望”在本地安装Docker,我们将配置管道以自动构建和发布Docker映像(当然也是免费的)


您可以在github上找到留言簿的源代码
我不会详细考虑代码。 简而言之,我将介绍添加reCAPTCHA v3。 访客留言簿为Must。 此外,Recaptcha 3rd版本不会因输入字符而打扰用户。


使用reCAPTCHA


您可以创建一个帐户,并在Google管理控制台reCAPTCHA中获取SiteKey和SecretKey。
不要忘记将localhost(在开发时会临时添加)和您网站的网址添加到域列表中(位于设置中)


管理员reCAPTCHA


我们使用从应用程序设置中获取的密钥作为参数来挂接脚本:


<script src="https://www.google.com/recaptcha/api.js?render=@Configuration["ReCaptcha:SiteKey"]" async defer></script> 

并且在发送表单内容的情况下,我们添加了reCAPTCHA令牌(无需使用jQuery就发送“ XMLHttpRequest”)


 grecaptcha.ready(function() { grecaptcha.execute('@Configuration["ReCaptcha:SiteKey"]', {action: 'homepage'}).then(function(token) { xhttp.open('POST', '@Url.Action("AddMessage", "Home")', true); xhttp.setRequestHeader("RequestVerificationToken", document.getElementById('RequestVerificationToken').value); var formData = new FormData(document.forms.message); formData.append("Token", token) xhttp.send(formData); }); }); 

AntiForgeryToken设置为标题。 这是另一个令牌,没有它也不会。
为了确保该请求不是由漫游器或垃圾邮件发送者发送的,您需要将从reCAPTCHA收到的令牌和密钥发送到www.google.com/recaptcha/api/siteverify地址


为此,我们需要HttpClient。 使用using结构创建HttpClient根本不在ASP.NET Core概念中。 在Core中,习惯上创建HttpClientFactory工厂。 它是简单创建的。 一行添加到Startup.cs


 services.AddHttpClient(); 

然后,在控制器的设计人员中,我们可以从DI中提取/创建客户端实例。 例如,像这样:


 private readonly HttpClient _httpClient; public HomeController(IHttpClientFactory httpClientFactory) { _httpClient = httpClientFactory.CreateClient("defaultClient"); } 

像这样检查reCAPTCHA:


 var parameters = new Dictionary<string, string> { { "secret", _configuration["ReCaptcha:SecretKey"] }, { "response", model.Token } }; var encodedContent = new FormUrlEncodedContent(parameters); var response = await _httpClient.PostAsync("https://www.google.com/recaptcha/api/siteverify", encodedContent); var result = JsonConvert.DeserializeObject<ReCaptchaResponse>(await response.Content.ReadAsStringAsync()); 

在这种情况下,ReCaptchaResponse类本身:


 public class ReCaptchaResponse { public bool success { get; set; } public double score { get; set; } public string action { get; set; } public string hostname { get; set; } public string challenge_ts { get; set; } } 

创建一个免费的云数据库


MongoDB Atlas中注册帐户时。
您必须输入电话号码和其他一些个人数据。 免费的Starter集群旨在学习MongoDB和面向小型应用程序。 有趣的是,您不仅可以从三个最大的地区中选择地区,还可以根据自己的口味选择您的基地的云托管提供商。


在MondoDB Atlas中选择区域和提供者


创建集群后,您将需要创建一个用户


用户创建


并且您必须将所有IP添加到允许的列表中(不幸的是,Heroku的免费托管计划不提供静态IP)。


允许从所有IP访问的安全性影响


现在我们要做的就是创建一个数据库和一个集合


管理员主屏幕


点击收藏,然后点击添加我自己的数据


您可以从中创建集合的窗口


我们拿出数据库和集合的名称,并填写字段。 最好不要选择上限集合,因为在这种情况下将无法删除记录。 上限集合非常适合记录信息。 新记录的记录很快,当达到一定数量时,旧记录将被重写。


创建收藏


通过单击连接并选择连接您的应用程序


获取连接字符串


您将能够复制连接字符串


获取连接字符串


创建一个Heroku应用程序


在Heroku上创建应用程序


那里的一切真的很简单。 注册帐户时,甚至都无法捆绑信用卡。


创建管道以将映像发布到Docker Hub


在项目中,创建具有相当普通内容的Dockerfile(提供了.NET Core 2.2版本的示例文件)


 FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base WORKDIR /app EXPOSE 64498 EXPOSE 44396 FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build WORKDIR /src COPY Guestbook.csproj Guestbook.csproj RUN dotnet restore COPY . . WORKDIR /src RUN dotnet build -c Release -o /app FROM build AS publish RUN dotnet publish -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "Guestbook.dll"] 

为了使Heroku能够启动图像,需要将最后一行更改为


 CMD ASPNETCORE_URLS=http://*:$PORT dotnet Guestbook.dll 

源代码必须在某些版本控制系统中运行。 我从github开始。
将代码放置在GitHub上以构建docker映像后,就可以使用Azure Devops了 。 您可以跳过本文的这一部分,在本地安装Docker,然后每次都手动重建所有内容。


我将用截图描述项目的创建


在Azure DevOps中创建项目


创建项目本身之后,您需要创建一个新管道


管道创建


然后选择您正在使用的版本控制系统


选择版本控制系统


现在您可以选择一个存储库


储存库选择


接下来,您将需要授权DevOps访问存储库。
并且可以选择配置类型(将自动创建某种类型的Yaml文件)


选择配置类型


我们的版本是Docker。
在打开的窗口中,您需要指定Docker文件的路径:


Docker文件路径


下一步,将显示yaml文件的内容。


您可以自己考虑和想到它,但是复制以下代码并替换其中的值会更容易(注意!yaml中的空格非常重要):


 variables: dockerId: your-docker-login # Replace with your Docker ID for Docker Hub or the admin user name for the Azure Container Registry imageName: mongodb-guestbook # Replace with the name of the image you want to publish steps: - script: | docker build -t $(dockerId)/$(imageName) . docker login -u $(dockerId) -p $(dockerPassword) docker push $(dockerId)/$(imageName) docker login --username=_ --password=$(token) registry.heroku.com docker build -t registry.heroku.com/myfreeguestbook/web . docker push registry.heroku.com/myfreeguestbook/web 

您的docker-login您需要替换为您的docker帐户的ID
mongodb-guestbook更改图像名称
代替myfreeguestbook在Heroku上插入应用程序的名称


剩下的就是输入dockerPassword令牌变量的值。 为此,请单击变量


变量按钮


好吧,输入docker帐户的密码。 和令牌..


变量窗口


如果很清楚从docker帐户中获取密码的位置,那么为了获取令牌,我们需要Heroku CLI
您可以通过以下链接下载它: 下载并安装
您可以安装独立/便携式版本。


使用以下命令之一登录: heroku login (此命令将打开浏览器窗口进行登录)或heroku login -I (此命令将在控制台中要求输入密码)


使用命令获得令牌


heroku auth:token


还建议将Heroku应用程序的类型更改为容器。 这是通过以下命令完成的:


heroku stack:set container -a myfreeguestbook


记住将myfreeguestbook更改为您的应用程序名称。


管道完成并创建docker映像后,您需要运行发布应用程序的命令:


heroku container:release -a myfreeguestbook


如果您是合适的开发人员,并将所有设置存储在appsettings.Development.json文件中,那么该项目将对您不起作用。 为了使一切正常,您需要向Heroku添加设置


Heroku应用程序配置值


Json子元素由双下划线__分隔


域和SSL设置


使用Heroku CLI,您可以将域添加到应用程序中。 为此,您首先必须将信用卡附加到您的帐户。


团队:


heroku domains:add www.example.ru


它会给你类似的东西:


将www.example.ru添加到⬢example-app ...
▸配置应用程序的DNS提供程序以指向DNS目标
▸whispering-willow-5678.herokudns.com。
▸如需帮助,请参见https://devcenter.heroku.com/articles/custom-domains
必须对您的根域重复此操作(例如,example.ru)

必须将CNAME别名保存并添加为您的域名注册商门户上的CNAME


www whispering-willow-erkie5ugksj4fo.herokudns.com


@ mighty-horse-dvkerbibi34biufbwiieuf.herokudns.com


您可以将它们直接添加到任意DNS记录编辑器中:


www.example.ru. IN CNAME whispering-willow-erkie5ugksj4fo.herokudns.com.


@.example.ru IN CNAME mighty-horse-dvkerbibi34biufbwiieuf.herokudns.com.


您可以这样做。


但是我更喜欢拥有免费的cloudflare帐户的选项。 毕竟,Cloudflare提供了免费的SSL证书。 对于内容,必须指定从Heroku接收的CNAME值。 如您所见,我还为该域添加了免费的Yandex邮件。


配置CloudFlare


好吧,您将需要在域名注册商站点上以DNS服务器的形式指定Cloudflare名称服务器的值中指出的内容。


结果是CloudFlare是您的DNS提供商和Heroku之间的中介。

Source: https://habr.com/ru/post/zh-CN471474/


All Articles