web应用托管_如何免费托管轻量级应用

web应用托管

by Pubs Abayasiri

通过Pubs Abayasiri

如何免费托管轻量级应用 (How to host lightweight apps for free)

When you look for web hosting services, there are many free options available. But there aren’t that many places where you can host full stack web apps that involve APIs, CGI, or AJAX backend queries — especially if you want to use something other than PHP.

当您寻找虚拟主机服务时,有许多可用的免费选项。 但是,在很多地方您都可以托管涉及API,CGI或AJAX后端查询的全栈Web应用程序-特别是如果您想使用PHP以外的东西。

This article is a simple but meaningful “walk before you can run” guide on how to get started with hosting your scripts on cloud servers.

本文是有关如何开始在云服务器上托管脚本的简单而有意义的“运行之前的指南”指南。

何时使用云应用程序平台 (When to use a Cloud Application Platform)

Cloud Application Platforms work well in scenarios where you need a bit of code to run on a server. Many of these platforms offer a series of Linux-based application containers (that appear like virtual machines) where you deploy the code you developed on your local computer with a set of command line keywords.

在需要一些代码才能在服务器上运行的情况下,Cloud Application Platform可以很好地工作。 这些平台中的许多平台都提供了一系列基于Linux的应用程序容器(看起来像虚拟机),您可以在其中使用一组命令行关键字来部署在本地计算机上开发的代码。

Heroku is one such service you could use to host your code (in various languages) relatively easily. It offers a freemium model where they let you use about 500 hours of computing for free (their full pricing is here).

Heroku是一项这样的服务,您可以使用它相对轻松地托管代码(各种语言)。 它提供了一个免费增值模式,使您可以免费使用大约500个小时的计算时间(其完整价格在此处 )。

Once you’ve written your code on your local desktop, you can execute commands that deploy the code onto a workspace in Heroku. The code then executes depending on a trigger. Triggers can be a scheduled job, a web server which is triggered through a web page request, or something that is running constantly and processing data — which could get quite expensive.

在本地桌面上编写代码后,就可以执行将代码部署到Heroku中的工作区的命令。 然后根据触发器执行代码。 触发器可以是计划的作业,可以是通过网页请求触发的Web服务器,也可以是持续运行并正在处理数据的事物,这可能会变得非常昂贵。

What’s really nice is that you don’t have to worry about the operating system (memory, storage, CPU, security patches) as that is all managed for you — but at the same time it means that you do have limited flexibility since you cannot allocate resources directly.

真正的好处是,您不必担心操作系统(内存,存储,CPU,安全补丁程序),因为它们都是为您管理的,但是同时这意味着您的灵活性有限,因为您无法直接分配资源。

Some specific examples where Heroku can work nicely for you:

Heroku可以为您很好地工作的一些特定示例:

  • Hosting your own website where you want to write your own web server

    在要编写自己的Web服务器的地方托管自己的网站
  • Periodically scraping data from a website and then storing it on a database for analysis

    定期从网站上抓取数据,然后将其存储在数据库中进行分析
  • Offering an API server for a specific task. Things like offering weather data, storing Internet of Things sensor data, or a web service call for a machine learning model

    提供用于特定任务的API服务器。 提供天气数据,存储物联网传感器数据或通过Web服务调用机器学习模型之类的东西
  • A database service (although a service such as Firebase is possibly better suited)

    数据库服务(尽管Firebase之类的服务可能更合适)

Heroku建筑 (Heroku Architecture)

Heroku provides a lightweight virtual machine (VM) for you to deploy your code. Note that under the free option, you can deploy up to 5 applications that are considered as 5 lightweight VMs. For your actual application, you are provided a separate URL subdomain under Heroku. So your project names need to be unique.

Heroku提供了一个轻量级的虚拟机(VM),供您部署代码。 请注意,在free选项下,您最多可以部署5个被视为5个轻量级VM的应用程序。 对于您的实际应用程序,在Heroku下为您提供了一个单独的URL子域。 因此,您的项目名称必须唯一。

These workspaces have their own space for components such as: code and resource files (not dynamic data files), database (Postgres), and log files.

这些工作空间拥有自己的组件空间,例如:代码和资源文件(不是动态数据文件),数据库(Postgres)和日志文件。

On your local desktop, Heroku uses your directory name to define your project, and also for Heroku to understand your context. So you can have multiple projects in different directories and when you run the Heroku commands — just make sure you do so in the right folder.

在您的本地桌面上,Heroku使用目录名称来定义您的项目,并让Heroku理解您的上下文。 因此,您可以在不同目录中运行多个项目,并且在运行Heroku命令时-只需确保在正确的文件夹中进行即可。

The one key thing that you do need to be aware of (which I discovered the hard way through hours of debugging — I wish I paid more attention to the documentation) is that everything is run from memory. There is no persistent storage. I’ll say it again — you cannot store any files on the file server! For persistence, Heroku offers a postgress SQL database where you can add records as required.

您确实需要了解的一件事(我在数小时的调试中发现了这一难题-我希望我对文档有更多的关注)是,一切都从内存运行。 没有持久性存储。 我再说一遍-您不能在文件服务器上存储任何文件! 为了保持持久性,Heroku提供了一个Postgress SQL数据库,您可以在其中根据需要添加记录。

一个简单的例子-网站更改检测 (A simple example — website change detection)

Here’s a step-by-step guide to get a working example of a simple service that will email you if a website has changed — basically a clone of www.changedetection.com. There will be several key components of this:

这是逐步指南,以获取一个简单服务的工作示例,如果网站已更改,该服务将通过电子邮件发送给您-基本上是www.changedetection.com的副本 其中将包含几个关键组件:

  1. A database that will store: (a) the email address to notify of a changed website; (b) the website to track; (c) the last ‘copy’ of the website

    一个数据库,将存储:(a)通知网站更改的电子邮件地址; (b)要跟踪的网站; (c)网站的最后“副本”
  2. A piece of code that will check a given website from the database in #1 (Python script)

    一段代码,将从#1(Python脚本)的数据库中检查给定的网站
  3. A job scheduler that will run the program in #2 (equivalent of a cron job)

    作业调度程序将在#2中运行程序(等同于cron作业)
  4. A web user interface where you can add/delete websites to monitor into the database mentioned in #1

    一个Web用户界面,您可以在其中添加/删除网站以监视#1中提到的数据库
  5. A mechanism to send out emails

    发送电子邮件的机制

Understanding these components will arm you with the skills to do a lot of things already. I learned all of these things through multiple sources, so this acts as a consolidated post.

了解这些组件将使您具备完成许多工作的技能。 我通过多种渠道了解了所有这些内容,因此这是一个综合文章。

假设条件 (Assumptions)

The following guide makes the following assumptions:

以下指南进行以下假设:

  • You have a GitHub account — if you don’t, please create one here. You should also read this simple guide.

    您有一个GitHub帐户-如果没有,请在此处创建一个。 您还应该阅读此简单指南

  • You already have a Heroku account — if you don’t please create one here.

    您已经有一个Heroku帐户-如果没有,请在此处创建一个帐户。

  • You are running a Windows machine — if not, it is fine, the instructions are quite similar in other environments

    您正在运行Windows机器-如果没有,那很好,在其他环境中的说明非常相似
  • You already have Python installed — if you don’t, please go here to install it

    您已经安装了Python-如果没有,请前往此处进行安装

  • You can already program in Python — if not, then I’d suggest you learn some of the basics first. Some guides are here.

    您已经可以使用Python编程了-如果没有,那么我建议您首先学习一些基础知识。 一些指南在这里

  • You know SQL — if you don’t, please go here.

    您知道SQL-如果不了解,请转到此处

步骤概述 (Overview of the steps)

I find that going through a ‘walk before you can run’ approach helps with the learning process. It also serves as documentation for yourself for how to solve each piece of the larger process. That way, if something breaks in your future endeavor, you have a better chance of figuring out where it went wrong.

我发现通过“行之有效”的方法有助于学习过程。 它还为您自己提供文档,说明如何解决较大过程的每一部分。 这样,如果将来的工作出现问题,您就有更大的机会弄清楚问题出在哪里。

Step 1: Develop the web user interface — build Hello World first

步骤1 :开发Web用户界面-首先构建Hello World

Step 2: Persistence — create a database

步骤2 :持久性-创建数据库

Step 3: Check websites for changes

步骤3 :检查网站是否有变化

Step 4: Send an email notification on changes

第4步:发送有关更改的电子邮件通知

Step 5: List the output on the web page

步骤5 :在网页上列出输出

Step 6: Deploy

步骤6:部署

第1步:开发Web用户界面-首先构建Hello World (Step 1: Develop the web user interface — build Hello World first)

First, let’s get a simple program deployed onto Heroku to get things started. This program will be a precursor to the web user interface (item #4) in the components list above. In order to serve up a page, we could simply have an HTML page, but then we would need to have a web server to server that file. In other words, when you type in the URL of the website, a program would need to interpret the request, then provide the contents of the HTML file. You can create your own mini web server with the Flask Python library, which is what we’ll do.

首先,让我们将一个简单的程序部署到Heroku上以开始工作。 该程序将是上述组件列表中Web用户界面(项目4)的前身。 为了提供一个页面,我们可以简单地创建一个HTML页面,但是随后我们需要一个Web服务器来对该文件进行服务器处理。 换句话说,当您输入网站的URL时,程序将需要解释请求,然后提供HTML文件的内容。 您可以使用Flask Python库创建自己的小型Web服务器,这就是我们要做的。

  • Create a folder called webchecker and go into that directory (this directory name does not have to be the same as the Heroku application name)

    创建一个名为webchecker的文件夹并进入该目录(此目录名称不必与Heroku应用程序名称相同)
  • Install the Flask library. Enter the command: npm Flask

    安装Flask库。 输入命令:npm Flask
  • Create the following Python program and name it showchecks.py:

    创建以下Python程序并将其命名为showchecks.py:

Before you deploy to Heroku, test that it works on your local PC. You can test it with the following steps:

在部署到Heroku之前,请测试它是否可以在本地PC上运行。 您可以按照以下步骤进行测试:

Next, let’s deploy this to Heroku. Before you can deploy, there needs to be a few more files that need to be included to help Heroku know more about your application.

接下来,让我们将其部署到Heroku。 在进行部署之前,需要再包含一些文件,以帮助Heroku进一步了解您的应用程序。

First, the requirements.txt

一,requirements.txt

Second, the file to tell Heroku what to run when a webrequest is made:

其次,该文件告诉Heroku在发出Web请求时要运行什么:

Finally, the runtime version of Python to use (default is 2.7, but we want to specify the latest version of Python):

最后,使用要使用的Python运行时版本(默认为2.7,但我们要指定Python的最新版本):

Hence, you should have four files:

因此,您应该有四个文件:

  1. showchecker.py which is the code

    showchecker.py这是代码
  2. requirements.txt for the list of non-standard library dependencies. Whenever you have new libraries which are not part of the Python Standard Library — i.e. you need to install them using a tool such as “pip” — then add these here. You can find the version of an installed library such as Flask by running the command: pip show Flask in the command line

    非标准库依赖项列表的requirements.txt。 每当您拥有不属于Python标准库的新库时(例如,您需要使用“ pip”之类的工具进行安装),然后在此处添加它们。 您可以通过运行以下命令来找到已安装的库(例如Flask)的版本:在命令行中pip show Flask

  3. Procfile which is the actual Python script to run when the website is called — make sure to update this if you change the Python file

    Procfile是在调用网站时运行的实际Python脚本-如果更改Python文件,请确保对其进行更新
  4. runtime.txt which is the actual version of python to use

    runtime.txt是要使用的python的实际版本

You can deploy with the following steps from the command line:

您可以从命令行按照以下步骤进行部署:

  1. heroku create webchecker01 — buildpack heroku/python

    heroku create webchecker01-buildpack heroku / python
  2. git add *.* *

    git添加*。* *
  3. git status

    git状态
  4. git commit -m “all files”

    git commit -m“所有文件”
  5. git push heroku master

    git push heroku主

For the command #1 (heroku create…), the “webechecker01” part is the unique name you’ll need to provide for the name of the app.

对于命令#1( heroku create… ),“ webechecker01”部分是您需要为应用程序名称提供的唯一名称。

For command #3 (git status) this will tell you what files are ready to be deployed. Make sure all files are there, if not add them using git add <filename>.

对于命令3( git status ),这将告诉您准备部署哪些文件。 确保所有文件都在那里,如果没有使用git add <filena me>添加它们。

Now you can check your website: <application name>.herokuapp.com/hello

现在,您可以检查您的网站:<应用程序名称> .herokuapp.com / hello

Let’s also make sure we can see the logs since this is a great way to see what’s going on with your app server. On your PC and in the webchecker directory, run the command: heroku logs

我们还要确保我们可以看到日志,因为这是查看应用服务器运行情况的好方法。 在您的PC上和webchecker目录中,运行命令: heroku logs

You’ll see the last execution steps. If things aren’t working as expected, this is your first stop to find out more detail.

您将看到最后的执行步骤。 如果一切都不如预期,这是您查找更多细节的第一站。

You can also go to the Heroku dashboard to see your consumption:

您也可以转到Heroku仪表板以查看消费情况:

https://dashboard.heroku.com

https://dashboard.heroku.com

步骤2:持久性-创建数据库 (Step 2: Persistence — create a database)

In order to make more useful programs, you’ll need to have a data store of sorts. This is where the Postgres database service comes into play. You first need to deploy the Heroku database service, then create your tables, and finally be able to connect to the database from your code locally (for testing).

为了制作更有用的程序,您需要具有各种数据存储。 这就是Postgres数据库服务发挥作用的地方。 首先,您需要部署Heroku数据库服务,然后创建表,最后能够从本地代码连接到数据库(以进行测试)。

To deploy a database service, first create it using the following command:

要部署数据库服务,请首先使用以下命令创建它:

heroku addons:create heroku-postgresql:hobby-dev

heroku addons:create heroku-postgresql:hobby-dev

Next, access the database from the command line and create your tables. The database is created on the Heroku cloud service and not locally. However, you can access it through the command line. To log on to the database via the console, run the command heroku pg:psql. Remember, you have to do it in your webchecker folder so that Heroku knows that it is the database for the webchecker site.

接下来,从命令行访问数据库并创建表。 该数据库是在Heroku云服务上创建的,而不是在本地创建的。 但是,您可以通过命令行访问它。 要通过控制台登录数据库,请运行命令heroku pg:psql 。 请记住,您必须在webchecker文件夹中执行此操作,以便Heroku知道它是webchecker站点的数据库。

To see the list of tables type the command \d

要查看表列表,请键入命令\d

To create a table, you need to use normal SQL statements. For our webchecker program, let’s create a table with the following columns:

要创建表,您需要使用普通SQL语句。 对于我们的webchecker程序,让我们创建一个包含以下列的表:

  • ID — automatically generated ID for each entry (this will be the primary key). This is done by using the type “serial”

    ID-为每个条目自动生成的ID(这将是主键)。 这是通过使用“ serial”类型完成的
  • website — the website to monitor

    网站-要监视的网站
  • emailaddress — the email address to send the notification that a change has occurred

    emailaddress-用于发送已发生更改的通知的电子邮件地址
  • lasthashcode — we won’t store a copy of the whole webpage, instead we will generate a hash based on the HTML of the page, and then compare this each time. This is more efficient storage-wise, but will not tell us what actually changed

    lasthashcode-我们将不会存储整个网页的副本,而是将基于页面HTML生成一个哈希,然后每次进行比较。 这是更有效的存储方式,但不会告诉我们实际发生了什么变化
  • lastchangedate — the date that the web changed last time. Hence we will get the database to default this with the current date

    lastchangedate-网络上次更改的日期。 因此,我们将获得数据库默认的当前日期

To create this table, enter the following command in the Heroku Postgres database console:

要创建此表,请在Heroku Postgres数据库控制台中输入以下命令:

CREATE TABLE webcheckerdb (id serial, website varchar(250), emailaddress varchar(250), lasthashcode varchar(32), lastchangedate timestamp DEFAULT current_date );

(Make sure you include the semicolon at the end!)

(确保在末尾包含分号!)

Next, let’s insert a single record in the database to ensure we have something to work with prior to getting our web UI up and running (you can use your own email address so it works in the future):

接下来,让我们在数据库中插入一条记录,以确保在启动和运行Web UI之前可以使用一些记录(您可以使用自己的电子邮件地址,以便将来使用):

INSERT into webcheckerdb values(DEFAULT, 'news.google.com', 'email@me.com', '', DEFAULT);

(Make sure you include the semicolon at the end!)

(确保在末尾包含分号!)

You can quit with \q.

您可以使用\q退出。

步骤3 :检查网站是否有变化 (Step 3: Check websites for changes)

First, let’s get a piece of code to at least check if a hardcoded site can be retrieved (following on the concept of walking before running).

首先,让我们获得一段代码,至少检查一下是否可以检索到一个硬编码的站点(遵循跑步前走路的概念)。

Hence, first step is to see if we can retrieve a webpage, hash it, and then compare it to a hardcoded hash. Create a new Python file called checkwebsite.py. Code here:

因此,第一步是看看我们是否可以检索网页,对其进行哈希处理,然后将其与硬编码的哈希进行比较。 创建一个名为checkwebsite.py的新Python文件。 代码在这里:

Running this will output the following:

运行此命令将输出以下内容:

If you have any errors with missing libraries, you can add them via: pip install <library> from the command line.

如果缺少库有任何错误,可以通过以下方式添加它们:从命令行pip install <libra ry>。

Next, let’s connect to the database with the following code:

接下来,让我们使用以下代码连接到数据库:

When you try to run this code, you are likely going to get an error of the form KeyError: ‘DATABASE_URL’. This is because your Python code is trying to locate the web address of the Postgres database hosted on Heroku. This is automatically updated to the environment variable DATABASE_URL in the Heroku server. However, on your local PC you will have to do this manually:

当您尝试运行此代码时,您可能会收到KeyError: 'DATABASE_URL'形式的错误。 这是因为您的Python代码正在尝试查找Heroku上托管的Postgres数据库的网址。 它会自动更新为Heroku服务器中的环境变量DATABASE_URL。 但是,在本地PC上,您将必须手动执行以下操作:

  1. heroku config

    heroku配置
  2. set DATABASE_URL=<the database string listed from “heroku config”>

    set DATABASE_URL = <“ heroku config”中列出的数据库字符串>

第4步:发送有关更改的电子邮件通知 (Step 4: Send an email notification on changes)

Final step is to send an email. To do this, you’ll need to install an Addon that has the ability to send emails — you can find these via the Heroku marketplace: https://elements.heroku.com/addons

最后一步是发送电子邮件。 为此,您需要安装具有发送电子邮件功能的插件-您可以在Heroku市场上找到这些插件: https : //elements.heroku.com/addons

In here, there is an Addon called SendGrid: https://elements.heroku.com/addons/sendgrid

在这里,有一个名为SendGrid的插件: https ://elements.heroku.com/addons/sendgrid

You can add SendGrid to your app in the command line by typing:

您可以在命令行中通过输入以下命令将SendGrid添加到您的应用程序:

heroku addons:create sendgrid:starter

heroku addons:create sendgrid:starter

When you go to your dashboard you can see the new Addon in the Resources section:

当您进入仪表板时,您可以在参考资料部分中看到新的插件:

Before using it, you’ll need to create an API key. Double click the SendGrid component above and go into Settings->API Key->Create Key (blue button on top right).

使用它之前,您需要创建一个API密钥。 双击上方的SendGrid组件,然后进入“设置”->“ API密钥”->“创建密钥”(右上角的蓝色按钮)。

Once you create the key, copy it and go back to the command prompt and enter:

创建密钥后,将其复制并返回命令提示符并输入:

heroku config:set SENDGRID_API_KEY=<API key from above>

heroku config:set SENDGRID_API_KEY=<API key from abo >

This will only register it on the server, you need to add it locally to your desktop with:

这只会在服务器上注册它,您需要使用以下命令将其本地添加到桌面上:

set SENDGRID_API_KEY=<API Key from above again>

set SENDGRID_API_KEY=<API Key from above aga >

Once done, you can test your code in a new Python script called sendmail.py. Install the library via pip install sendgrid:

完成后,您可以在名为sendmail.py的新Python脚本中测试代码。 通过pip install sendgrid安装库:

To confirm the email was sent and delivered, you can go back to the SendGrid dashboard and checking the Statistics Overview screen:

要确认电子邮件已发送和传递,您可以返回SendGrid仪表板并检查“统计信息概述”屏幕:

When checking your email, remember to check your spam.

检查电子邮件时,请记住检查垃圾邮件。

Once it is working, there are only two lines of code you need to add to your main checkwebsite.py script. It is:

一旦运行,只需将两行代码添加到您的主要checkwebsite.py脚本中。 它是:

import sendmail #import the send email subroutine you wrote above
...
#call the subroutine after find the hashcode has changedsendmail.sendemail(webrecord['emailaddress'], 'Website changed', webrecord['website'] + ' changed')

The full code is here:

完整的代码在这里:

步骤5 :在网页上列出输出并安排作业 (Step 5: List the output on the web page and schedule the job)

The next step is to list the output on the webpage.

下一步是在网页上列出输出。

This involves querying the database, and then cycling through and showing the data on your screen. Hence, it takes the ‘Hello World’ code above, and makes the modification. I also created a different path for this, so to test this out you’ll need to go to the URL: http://localhost:5000/list

这涉及查询数据库,然后循环浏览并在屏幕上显示数据。 因此,它采用了上面的“ Hello World”代码,并进行了修改。 我还为此创建了一个不同的路径,因此要进行测试,您需要转到URL:http:// localhost:5000 / list

And here’s the output:

这是输出:

步骤6:部署 (Step 6: Deploy)

The final step is to deploy everything to Heroku and then schedule the job so that it checks email.

最后一步是将所有内容部署到Heroku,然后安排作业,以便检查电子邮件。

You should have the following files:

您应该具有以下文件:

  1. Procfile — the file which points to showchecker.py

    Procfile —指向showchecker.py的文件
  2. requirements.txt — the file which contains the library dependencies

    requirements.txt —包含库依赖项的文件
  3. runtime.txt — the version of python

    runtime.txt — python的版本
  4. showchecker.py — the python code which shows the database output on the web via <your appname>.herokuapp.com/list

    showchecker.py —通过<your appname> .herokuapp.com / list在网络上显示数据库输出的python代码
  5. checkwebsite.py — the python code that checks for any changes on the websites

    checkwebsite.py —检查网站上是否有任何更改的python代码

For the requirements.txt, you will need to make amendments to add the latest libraries:

对于requirements.txt,您需要进行修改以添加最新的库:

Deploy these all to Heroku:

将所有这些部署到Heroku:

  1. git add *.* *

    git添加*。* *
  2. git commit -m “deployment”

    git commit -m“部署”
  3. git push heroku master

    git push heroku主

Test each component:

测试每个组件:

  1. Go to <your app name>.herokuapp.com/hello

    转到<您的应用程序名称> .herokuapp.com / hello
  2. Go to <your app name>.herokuapp.com/list

    转到<您的应用程序名称> .herokuapp.com / list

If there are any errors, then run heroku logs in the command line to see what is going on.

如果有任何错误,请在命令行中运行heroku logs以查看发生了什么。

Next, run the checkwebsite.py directly on Heroku to make sure there are no issues. To do this, you can type:

接下来,直接在Heroku上运行checkwebsite.py以确保没有问题。 为此,您可以键入:

heroku run python checkwebsite.py

heroku run python checkwebsite.py

Finally, you can now schedule your job. Again, you need to include an Addon to do this.

最后,您现在可以安排工作了。 同样,您需要包括一个Addon来执行此操作。

heroku addons:create scheduler:standard

heroku addons:create scheduler:standard

And you should be able to see the scheduler in your resources page:

并且您应该能够在资源页面中看到调度程序:

You can simply use the command line to run the program, in our case it is: python checkwebsite.py (this is the same as what we tested above with the heroku run command).

您可以简单地使用命令行来运行该程序,在我们的例子中是: python checkwebsite.py (这与我们上面用heroku run命令测试过的相同)。

摘要 (Summary)

And that’s it… the first time it is a little complex, but hopefully the above incremental steps will help you understand what’s going on under the hood. There are a lot more resources on Heroku as well as a wealth of information on Stack Overflow. These resources should make a lot more sense after going through the above.

就是这样……第一次有点复杂,但是希望上述增量步骤可以帮助您了解幕后的情况。 Heroku上有很多资源,以及Stack Overflow上的大量信息。 通过上述操作后,这些资源应该更有意义。

Good Luck!

祝好运!

Thanks for reading! If you like what you read, hit the❤ button below so that others may find this (you can also find me on Twitter )

谢谢阅读! 如果您喜欢阅读的内容,请点击下面的❤按钮,以便其他人可以找到(您也可以在Twitter上找到我)

翻译自: https://www.freecodecamp.org/news/how-to-host-lightweight-apps-for-free-a29773e5f39e/

web应用托管

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值