中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

做網(wǎng)站還要寫文章嗎品牌運(yùn)營(yíng)中心

做網(wǎng)站還要寫文章嗎,品牌運(yùn)營(yíng)中心,免費(fèi)b2b網(wǎng)站大全1042,dw2020網(wǎng)頁設(shè)計(jì)教程前言 最近在參加的幾個(gè)項(xiàng)目測(cè)評(píng)里,我發(fā)現(xiàn)**“一鍵部署”這功能真心好用,省下了不少寶貴時(shí)間和力氣,再加上看到阿里云現(xiàn)在有個(gè)開源上云**的活動(dòng)。趁著這波熱潮,今天就聊聊怎么從頭開始,一步步搞定阿里云的資源編排服務(wù)…

前言

最近在參加的幾個(gè)項(xiàng)目測(cè)評(píng)里,我發(fā)現(xiàn)**“一鍵部署”這功能真心好用,省下了不少寶貴時(shí)間和力氣,再加上看到阿里云現(xiàn)在有個(gè)開源上云**的活動(dòng)。趁著這波熱潮,今天就聊聊怎么從頭開始,一步步搞定阿里云的資源編排服務(wù)(ROS),希望能對(duì)剛接觸這塊的朋友有點(diǎn)幫助。咱們一塊兒邊學(xué)邊實(shí)踐,讓云上的項(xiàng)目部署變得更簡(jiǎn)單高效。

資源編排

阿里云的資源編排服務(wù)(Resource Orchestration Service,簡(jiǎn)稱ROS)是一種基礎(chǔ)設(shè)施即代碼(IaC)服務(wù),它允許用戶通過編寫模板來定義和管理云上的各種資源。這些資源包括但不限于ECS( Elastic Compute Service)實(shí)例、RDS(Relational Database Service)數(shù)據(jù)庫實(shí)例、SLB(Server Load Balancer)負(fù)載均衡器等。ROS的核心價(jià)值在于自動(dòng)化部署及運(yùn)維,它能自動(dòng)處理資源的創(chuàng)建、配置及之間的依賴關(guān)系,從而極大地簡(jiǎn)化了云計(jì)算資源的管理過程。

在ROS中,用戶根據(jù)ROS提供的模板規(guī)范,使用JSON或YAML格式編寫資源棧模板。模板中不僅定義了所需的資源類型和數(shù)量,還明確了資源之間的邏輯依賴,確保資源按正確的順序被創(chuàng)建和配置。這樣,無論是新建環(huán)境、更新配置還是進(jìn)行大規(guī)模的架構(gòu)調(diào)整,都可通過執(zhí)行模板腳本來實(shí)現(xiàn),保證了操作的一致性和可重復(fù)性。

資源編排地址如下:https://ros.console.aliyun.com/cn-hangzhou/welcome

image.png

下面我們還是以實(shí)戰(zhàn)為導(dǎo)向,從最基礎(chǔ)的ROS腳本開始看起,一步步拆解。

ROS模板

首先我們先看一下ROS模板結(jié)構(gòu)及參數(shù)說明。

{"ROSTemplateFormatVersion" : "2015-09-01","Description" : "模板描述信息,可用于說明模板的適用場(chǎng)景、架構(gòu)說明等。","Metadata" : {// 關(guān)于模板的元數(shù)據(jù)信息,例如存放用于可視化的布局信息。},"Parameters" : {// 定義創(chuàng)建資源棧時(shí),用戶可以定制化的參數(shù)。},"Mappings" : {// 定義映射信息表,映射信息是一種多層的Map結(jié)構(gòu)。},"Conditions": {// 使用內(nèi)部條件函數(shù)定義條件。這些條件確定何時(shí)創(chuàng)建關(guān)聯(lián)的資源。},"Resources" : {// 所需資源的詳細(xì)定義,包括資源間的依賴關(guān)系、配置細(xì)節(jié)等。},"Outputs" : {// 用于輸出一些資源屬性等有用信息。可以通過API或控制臺(tái)獲取輸出的內(nèi)容。}
}

【參數(shù)說明】:

  • ROSTemplateFormatVersion必選,ROS支持的模板版本號(hào),當(dāng)前版本號(hào):2015-09-01。

  • Description:可選,模板的描述信息??捎糜谡f明模板的適用場(chǎng)景、架構(gòu)說明等。通常情況下,對(duì)模板進(jìn)行詳細(xì)描述,有利于用戶理解模板的內(nèi)容。

  • Metadata:可選,模板編寫者可以使用Metadata來存放與模板相關(guān)的元數(shù)據(jù)信息,內(nèi)容可以為JSON格式。

  • Parameters:可選,定義創(chuàng)建資源棧時(shí),模板用戶可以定制化的參數(shù)。通常,模板的編輯者會(huì)把ECS的規(guī)格設(shè)計(jì)成一個(gè)參數(shù)。參數(shù)支持默認(rèn)值。使用參數(shù)可以增強(qiáng)模板的靈活性,提高復(fù)用性。使用模板創(chuàng)建資源棧時(shí),可以根據(jù)實(shí)際的評(píng)估結(jié)果來選擇合適的規(guī)格。更多詳細(xì)信息,請(qǐng)參見參數(shù)(Parameters)。

  • Mappings:可選,Mappings定義了一個(gè)多層的映射表,可以通過Fn::FindInMap函數(shù)來選擇Key對(duì)應(yīng)的值,或根據(jù)不同的輸入?yún)?shù)值作為Key來查找映射表。例如,您可以根據(jù)Region不同,自動(dòng)查找Region-鏡像映射表,從而找到適用的鏡像。更多詳細(xì)信息,請(qǐng)參見映射(Mappings)。

  • Conditions:可選,Conditions使用Fn::And、Fn::Or、Fn::Not、Fn::Equals定義條件。多個(gè)條件之間使用半角逗號(hào)(,)隔開。在創(chuàng)建或更新資源棧時(shí),系統(tǒng)先計(jì)算模板中的所有條件,然后再創(chuàng)建資源。創(chuàng)建與true條件關(guān)聯(lián)的所有資源,忽略與false條件關(guān)聯(lián)的所有資源。更多詳細(xì)信息,請(qǐng)參見條件(Conditions)。

  • Resources:可選,用于詳細(xì)定義使用該模板創(chuàng)建的資源棧所包含的資源,包括資源間的依賴關(guān)系、配置細(xì)節(jié)等。更多詳細(xì)信息,請(qǐng)參見資源(Resources)。

  • Outputs:可選,用于輸出一些資源屬性等有用信息??梢酝ㄟ^API或控制臺(tái)獲取輸出的內(nèi)容。更多詳細(xì)信息,請(qǐng)參見輸出(Outputs)。

通過上面可以看出最核心、最關(guān)鍵的部分其實(shí)是Parameters、Resources , 因?yàn)檫@兩個(gè)決定了模板設(shè)計(jì)者定義一系列可配置的參數(shù)和將要?jiǎng)?chuàng)建或管理的所有云資源及其配置,是直接涉及資源創(chuàng)建和配置的核心邏輯參數(shù)。

下面我們來創(chuàng)建第一個(gè)案例。

基于ROS模板創(chuàng)建VPC

在創(chuàng)建之前,我們需要先知道ROS支持的所有資源類型,這里需要查看資源類型索引。

image.png

如果在這個(gè)列表中沒有出現(xiàn)的產(chǎn)品,就是暫時(shí)不支持采用ROS來創(chuàng)建的,這是需要明確的第一點(diǎn)。

如上圖,我們看到VPC是支持使用ROS來創(chuàng)建的,接下來我們?cè)匍_展第二步,點(diǎn)擊這個(gè)藍(lán)色鏈接位置,查看它的詳細(xì)語法、屬性及返回值。

image.png

到這里,我們基本就明白它的語法格式及書寫方式了,下面第三步,上手開寫。

回到資源編排界面,點(diǎn)擊【我的模板】→【創(chuàng)建模板】,進(jìn)去ROS在線編輯界面開始編輯。

image.png

初始的模板如下,我們選擇為yaml格式來進(jìn)行編寫。

image.png

下面咱們一行行的分析:

ROSTemplateFormatVersion

默認(rèn)版本號(hào),這里不用修改,直接過

ROSTemplateFormatVersion: '2015-09-01'

Description

這里不是必填,不過也可以填一下,暫且起名為my first VPC-test。

Description: my first VPC-test

Parameters

這里到重頭戲了,幾乎所有的可定制化參數(shù)都是在這里修改的,在比較復(fù)雜的ROS腳本中幾乎都會(huì)用到,但是這里為了方便演示,也選擇暫時(shí)不填寫,等下后面測(cè)試時(shí)再填寫后對(duì)比。

Parameters: {}

Resources

這里是用來詳細(xì)定義使用該模板創(chuàng)建的資源棧所包含的資源,包括資源間的依賴關(guān)系、配置細(xì)節(jié)等,是必填項(xiàng)。

而其具體的格式,可以看到如下:

image.png

這里我們沿用該格式,并且剔除一些不需要的參數(shù),最終命令如下:

 VPC:Type: ALIYUN::ECS::VPCProperties:VpcName: VPC-testCidrBlock: 192.168.0.0/24

這里面就只包含了最基礎(chǔ)的CidrBlock(專有網(wǎng)絡(luò)網(wǎng)段)和VpcName(專有網(wǎng)絡(luò)名稱)。

Mappings、Metadata、Conditions

這里也暫時(shí)不涉及,可以直接刪除掉。

Outputs

這里用于輸出一些資源屬性等有用信息,這里我們可以嘗試輸出一下VPC的ID和關(guān)聯(lián)的虛擬路由器ID

Outputs:VPCId:Value:Fn::GetAtt:- VPC- VRouterIdVRouterId:Value:Fn::GetAtt:- VPC- VRouterId

參照返回示例如下

image.png

最終ROS的整體腳本如下:

ROSTemplateFormatVersion: '2015-09-01'
Description: my first VPC-test
Resources:VPC:Type: ALIYUN::ECS::VPCProperties:VpcName: VPC-testCidrBlock: 192.168.0.0/24
Outputs:VPCId:Value:Fn::GetAtt:- VPC- VRouterIdVRouterId:Value:Fn::GetAtt:- VPC- VRouterId

點(diǎn)擊預(yù)覽,查看資源架構(gòu),我們可以看到如圖所示的架構(gòu):

image.png

確定之后點(diǎn)擊保存模板,命名后可在模板空間中查看和直接創(chuàng)建棧:

image.png
image.png

選擇失敗時(shí)回滾,點(diǎn)擊創(chuàng)建:

image.png

此時(shí)可以看到開始創(chuàng)建資源棧,等待一段時(shí)間:

image.png

創(chuàng)建成功后如下圖所示:

image.png

點(diǎn)擊輸出,我們可以看到outputs中設(shè)定的輸出的關(guān)鍵字

image.png

而假如我們不需要使用了,也可以直接點(diǎn)擊刪除資源棧:

image.png

以上是手動(dòng)編寫腳本的流程了,在實(shí)際調(diào)試中還是有一些復(fù)雜的,下面我們就來結(jié)合案例,完成這次參賽的ROS部署作品。

基于ROS部署MaxKB

MaxKB

MaxKB是基于LLM大語言模型的知識(shí)庫問答系統(tǒng),旨在成為企業(yè)的最強(qiáng)大腦。它支持開箱即用,無縫嵌入到第三方業(yè)務(wù)系統(tǒng),并提供多模型支持,包括主流大模型和本地私有大模型,為用戶提供智能問答交互體驗(yàn)和靈活性。

image.png

另外說一句,我的關(guān)于知識(shí)庫側(cè)測(cè)評(píng)的文章也已經(jīng)快寫完了,這幾個(gè)月參加護(hù)網(wǎng)有點(diǎn)太累了,幾乎沒時(shí)間來寫,抱歉抱歉!

編寫ROS 模板

這里我們還是一步步的來,逐步解析。

ROSTemplateFormatVersion

老規(guī)矩,不變。

ROSTemplateFormatVersion: '2015-09-01'

Description

因?yàn)槭菂①惖淖髌?#xff0c;所以我這里也寫的詳細(xì)一點(diǎn)吧,下面也是帶上了中英的描述。

Description:en: Setting up the large language model-based knowledge base question and answer system, MaxKB, on an ECS (Elastic Compute Service) instance.zh-cn:ECS實(shí)例上搭建大語言模型的知識(shí)庫問答系統(tǒng)MaxKB。

Parameters

這里涉及到的就比較復(fù)雜了,因?yàn)榇颂幨潜仨氁M(jìn)行一些自定義參數(shù)設(shè)置的,我們進(jìn)到ECS的語法下面詳細(xì)查看。

說實(shí)話,有點(diǎn)嚇人,居然這么多!

image.png

我們按照下面這個(gè)表格來一一排查:

image.png

ZoneId

這里首先申明ZoneId , 至于為什么先申明ZoneId呢?這是因?yàn)閰^(qū)域(Zone)的選擇對(duì)創(chuàng)建的云資源(如ECS實(shí)例、RDS數(shù)據(jù)庫等)有著直接的影響,且下面在申明實(shí)例規(guī)格時(shí)會(huì)用到。

ZoneId:Type: StringLabel:en: Availability Zonezh-cn: 可用區(qū)IDAssociationProperty: ALIYUN::ECS::Instance:ZoneId

AssociationProperty 說明ZoneId參數(shù)與ECS實(shí)例的ZoneId屬性關(guān)聯(lián)。這意味著在模板中使用此參數(shù)的地方,我們所選擇的值將會(huì)直接應(yīng)用于創(chuàng)建ECS實(shí)例時(shí)的可用區(qū)選擇。這樣的設(shè)計(jì)確保了模板的邏輯與阿里云ECS服務(wù)的實(shí)際屬性緊密集成,提高了模板的準(zhǔn)確性和易用性。

InstanceType

ECS實(shí)例規(guī)格 ,必填項(xiàng) ,這里需要參考實(shí)例規(guī)格族。

 InstanceType:Type: StringLabel:en: Instance Typezh-cn: 實(shí)例類型AssociationProperty: ALIYUN::ECS::Instance::InstanceTypeAssociationPropertyMetadata:ZoneId: ${ZoneId}DefaultValueStrategy: recent

同樣,這里的 AssociationProperty 是指明參數(shù)與ECS實(shí)例的InstanceType屬性關(guān)聯(lián);而 AssociationPropertyMetadata 則是表示實(shí)例類型的可用性依賴于ZoneId中選擇的區(qū)域ID,且當(dāng)用戶沒有明確指定實(shí)例類型時(shí),系統(tǒng)會(huì)選擇最近常用或推薦的實(shí)例類型作為默認(rèn)選項(xiàng)。

SystemDiskCategory

下面定義ECS實(shí)例系統(tǒng)盤的類型,其中,AssociationPropertyMetadata 里面包含了一些元數(shù)據(jù)來指導(dǎo)和約束系統(tǒng)盤類型的選擇:

SystemDiskCategory:Type: StringLabel:en: System Disk Typezh-cn: 系統(tǒng)盤類型AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategoryAssociationPropertyMetadata:LocaleKey: DiskCategoryZoneId: ${ZoneId}InstanceType: ${InstanceType}AutoSelectFirst: trueAutoChangeType: falseDefault: cloud_essd
InstancePassword

下面定義了用于登錄ECS實(shí)例的密碼規(guī)則,確保了安全性的同時(shí)也提供了一定的靈活性:

InstancePassword:Type: StringLabel:en: Instance Passwordzh-cn: 實(shí)例密碼Description:en: Server login password, Length 8-30, must contain three(Capital letters,lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbolin).zh-cn: 服務(wù)器登錄密碼,長(zhǎng)度8-30,必須包含三項(xiàng)(大寫字母、小寫字母、數(shù)字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符號(hào))。ConstraintDescription:en: Length 8-30, must contain three(Capital letters, lowercase letters, numbers,()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in).zh-cn: 長(zhǎng)度8-30,必須包含三項(xiàng)(大寫字母、小寫字母、數(shù)字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符號(hào))。AssociationPropertyMetadata:Visible:Condition:Fn::Equals:- ${SelectInstance}- falseDefault:AllowedPattern: '[0-9A-Za-z\_\-\&:;''<>,=%`~!@#\(\)\$\^\*\+\|\{\}\[\]\.\?\/]+$'MinLength: 8MaxLength: 30NoEcho: true

所以Parameters此處的完整腳本如下:

Parameters:ZoneId:Type: StringLabel:en: Availability Zonezh-cn: 可用區(qū)IDAssociationProperty: ALIYUN::ECS::Instance:ZoneIdInstanceType:Type: StringLabel:en: Instance Typezh-cn: 實(shí)例類型AssociationProperty: ALIYUN::ECS::Instance::InstanceTypeAssociationPropertyMetadata:ZoneId: ${ZoneId}DefaultValueStrategy: recentSystemDiskCategory:Type: StringLabel:en: System Disk Typezh-cn: 系統(tǒng)盤類型AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategoryAssociationPropertyMetadata:LocaleKey: DiskCategoryZoneId: ${ZoneId}InstanceType: ${InstanceType}AutoSelectFirst: trueAutoChangeType: falseDefault: cloud_essdInstancePassword:Type: StringLabel:en: Instance Passwordzh-cn: 實(shí)例密碼Description:en: Server login password, Length 8-30, must contain three(Capital letters,lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbolin).zh-cn: 服務(wù)器登錄密碼,長(zhǎng)度8-30,必須包含三項(xiàng)(大寫字母、小寫字母、數(shù)字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符號(hào))。ConstraintDescription:en: Length 8-30, must contain three(Capital letters, lowercase letters, numbers,()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in).zh-cn: 長(zhǎng)度8-30,必須包含三項(xiàng)(大寫字母、小寫字母、數(shù)字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符號(hào))。AssociationPropertyMetadata:Visible:Condition:Fn::Equals:- ${SelectInstance}- falseDefault:AllowedPattern: '[0-9A-Za-z\_\-\&:;''<>,=%`~!@#\(\)\$\^\*\+\|\{\}\[\]\.\?\/]+$'MinLength: 8MaxLength: 30NoEcho: true

Resources

這里開始創(chuàng)建資源,分析架構(gòu)所需,涉及產(chǎn)品如下:

VPC

定義一個(gè)虛擬私有云(VPC)資源,192.168.0.0/16 指定了VPC的IP地址范圍。

Vpc:Type: ALIYUN::ECS::VPCProperties:CidrBlock: 192.168.0.0/16
VSwitch

定義一個(gè)虛擬交換機(jī)(VSwitch)的配置:Ref: ZoneId 表示虛擬交換機(jī)將被創(chuàng)建在指定的可用區(qū)(Zone)中,這里的ZoneId是一個(gè)引用,其實(shí)際值需要在模板的參數(shù)或映射部分提前定義或通過外部參數(shù)傳入;Ref: Vpc 指明該虛擬交換機(jī)隸屬于哪個(gè)VPC。這里同樣使用了引用,意味著VSwitch將與之前定義的VPC關(guān)聯(lián)。確保在模板中已經(jīng)定義了VPC資源或者通過參數(shù)傳遞了正確的VPC ID;192.168.0.0/24 定義了虛擬交換機(jī)的IP地址范圍。

 VSwitch:Type: ALIYUN::ECS::VSwitchProperties:ZoneId:Ref: ZoneIdVpcId:Ref: VpcCidrBlock: 192.168.0.0/24
SecurityGroup

創(chuàng)建安全組:Ref: Vpc 指定該安全組將被創(chuàng)建在哪個(gè)VPC中,這里通過引用之前定義的VPC資源(Vpc),確保安全組與目標(biāo)VPC正確關(guān)聯(lián)。這一步是必要的,因?yàn)槊總€(gè)安全組都必須綁定到一個(gè)特定的VPC。

SecurityGroup:Type: ALIYUN::ECS::SecurityGroupProperties:VpcId:Ref: Vpc
SecurityGroupIngress_80

定義了入站規(guī)則:Ref: SecurityGroup 引用了之前定義的安全組ID,這條入站規(guī)則將被添加到該安全組中;0.0.0.0/0 指定任何IP地址(全網(wǎng)段)都可以作為流量的來源,這意味著對(duì)于這條規(guī)則,不限制訪問的來源IP地址;**tcp **指定了該規(guī)則適用的協(xié)議類型,這里是TCP;intranet 表示這條規(guī)則僅適用于VPC內(nèi)部的通信;80/80 定義了允許訪問的端口范圍,這里只開放了TCP 80端口,通常用于HTTP服務(wù)。

SecurityGroupIngress_80:Type: ALIYUN::ECS::SecurityGroupIngressProperties:SecurityGroupId:Ref: SecurityGroupSourceCidrIp: 0.0.0.0/0IpProtocol: tcpNicType: intranetPortRange: 80/80
InstanceGroup

定義實(shí)例群組:引用上面創(chuàng)建的Vpc、VSwitch和SecurityGroupId實(shí)例;指定使用CentOS 7.9的鏡像;設(shè)置了實(shí)例的名稱為MaxKB;后面繼續(xù)引入實(shí)例類型、系統(tǒng)盤的類別和密碼。

InstanceGroup:Type: ALIYUN::ECS::InstanceGroupProperties:VpcId:Ref: VpcVSwitchId:Ref: VSwitchSecurityGroupId:Ref: SecurityGroupImageId: centos_7_9InstanceName: MaxKBInstanceType:Ref: InstanceTypeSystemDiskCategory:Ref: SystemDiskCategoryPassword:Ref: InstancePasswordIoOptimized: optimizedMaxAmount: 1
DS_Instances

通過DS_Instances數(shù)據(jù)源來獲取通過InstanceGroup創(chuàng)建的ECS實(shí)例列表。

 DS_Instances:Type: DATASOURCE::ECS::InstancesProperties:InstanceIds:Fn::GetAtt:- InstanceGroup- InstanceIds
InstallMaxKB

這里使用到Formation模板中的ALIYUN::ECS::RunCommand資源類型配置,用于在特定的ECS實(shí)例上執(zhí)行一系列Shell腳本命令。

InstallMaxKB:
Type: ALIYUN::ECS::RunCommandProperties:InstanceIds:Fn::GetAtt:- InstanceGroup- InstanceIdsType: RunShellScriptSync: trueTimeout: 1800CommandContent: |#!/bin/bashecho "#########################"echo "# Install Docker"echo "#########################"wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum -y install docker-cesystemctl start dockersystemctl enable dockerecho "#########################"echo "# Install MaxKB"echo "#########################"yum -y install jqDOCKER_DAEMON_JSON="/etc/docker/daemon.json"sudo jq --arg registry "$NEW_REGISTRY" '. + { "registry-mirrors": [https://0jt38sli.mirror.aliyuncs.com] }' $DOCKER_DAEMON_JSON > ${DOCKER_DAEMON_JSON}.temp && sudo mv ${DOCKER_DAEMON_JSON}.temp $DOCKER_DAEMON_JSONsudo systemctl daemon-reloadsudo systemctl restart dockerdocker run -d --name=maxkb -p 8080:8080 -v ~/.maxkb:/var/lib/postgresql/data 1panel/maxkb

最終,Resources下腳本如下:

Resources:Vpc:Type: ALIYUN::ECS::VPCProperties:CidrBlock: 192.168.0.0/16VSwitch:Type: ALIYUN::ECS::VSwitchProperties:ZoneId:Ref: ZoneIdVpcId:Ref: VpcCidrBlock: 192.168.0.0/24SecurityGroup:Type: ALIYUN::ECS::SecurityGroupProperties:VpcId:Ref: VpcSecurityGroupIngress_80:Type: ALIYUN::ECS::SecurityGroupIngressProperties:SecurityGroupId:Ref: SecurityGroupSourceCidrIp: 0.0.0.0/0IpProtocol: tcpNicType: intranetPortRange: 80/80InstanceGroup:Type: ALIYUN::ECS::InstanceGroupProperties:VpcId:Ref: VpcVSwitchId:Ref: VSwitchSecurityGroupId:Ref: SecurityGroupImageId: centos_7_9InstanceName: difyInstanceType:Ref: InstanceTypeSystemDiskCategory:Ref: SystemDiskCategoryPassword:Ref: InstancePasswordIoOptimized: optimizedMaxAmount: 1DS_Instances:Type: DATASOURCE::ECS::InstancesProperties:InstanceIds:Fn::GetAtt:- InstanceGroup- InstanceIds
InstallMaxKB:
Type: ALIYUN::ECS::RunCommandProperties:InstanceIds:Fn::GetAtt:- InstanceGroup- InstanceIdsType: RunShellScriptSync: trueTimeout: 1800CommandContent: |#!/bin/bashecho "#########################"echo "# Install Docker"echo "#########################"wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum -y install docker-cesystemctl start dockersystemctl enable dockerecho "#########################"echo "# Install MaxKB"echo "#########################"yum -y install jqDOCKER_DAEMON_JSON="/etc/docker/daemon.json"sudo jq --arg registry "$NEW_REGISTRY" '. + { "registry-mirrors": [https://0jt38sli.mirror.aliyuncs.com] }' $DOCKER_DAEMON_JSON > ${DOCKER_DAEMON_JSON}.temp && sudo mv ${DOCKER_DAEMON_JSON}.temp $DOCKER_DAEMON_JSONsudo systemctl daemon-reloadsudo systemctl restart dockerdocker run -d --name=maxkb -p 8080:8080 -v ~/.maxkb:/var/lib/postgresql/data 1panel/maxkb

Outputs

定義了名為 MaxKBUrl 的輸出項(xiàng),用于提供MaxKB服務(wù)的默認(rèn)訪問地址:

Outputs:MaxKBUrl:Description: MaxKB default address.Value:Fn::Sub:- http://${IP}- IP:Fn::Jq:- First- if .[0].PublicIpAddress != [] then .[0].PublicIpAddress[0] else .[0].EipAddress.IpAddressend- Fn::GetAtt:- DS_Instances- Instances

Metadata

添加了一個(gè)標(biāo)簽來描述此模板的功能和背景,按照比賽要求是需要采用“手機(jī)尾號(hào)-模板用途”來編寫。

Metadata:ALIYUN::ROS::Interface:TemplateTags:- acs:developer:gitee:0147-ECS實(shí)例上搭建大語言模型的知識(shí)庫問答系統(tǒng)MaxKB。

整體腳本

ROSTemplateFormatVersion: '2015-09-01'
Description:en: Setting up the large language model-based knowledge base question and answer system, MaxKB, on an ECS (Elastic Compute Service) instance.zh-cn:ECS實(shí)例上搭建大語言模型的知識(shí)庫問答系統(tǒng)MaxKB。
Parameters:ZoneId:Type: StringLabel:en: Availability Zonezh-cn: 可用區(qū)IDAssociationProperty: ALIYUN::ECS::Instance:ZoneIdInstanceType:Type: StringLabel:en: Instance Typezh-cn: 實(shí)例類型AssociationProperty: ALIYUN::ECS::Instance::InstanceTypeAssociationPropertyMetadata:ZoneId: ${ZoneId}DefaultValueStrategy: recentSystemDiskCategory:Type: StringLabel:en: System Disk Typezh-cn: 系統(tǒng)盤類型AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategoryAssociationPropertyMetadata:LocaleKey: DiskCategoryZoneId: ${ZoneId}InstanceType: ${InstanceType}AutoSelectFirst: trueAutoChangeType: falseDefault: cloud_essdInstancePassword:Type: StringLabel:en: Instance Passwordzh-cn: 實(shí)例密碼Description:en: Server login password, Length 8-30, must contain three(Capital letters,lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbolin).zh-cn: 服務(wù)器登錄密碼,長(zhǎng)度8-30,必須包含三項(xiàng)(大寫字母、小寫字母、數(shù)字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符號(hào))。ConstraintDescription:en: Length 8-30, must contain three(Capital letters, lowercase letters, numbers,()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in).zh-cn: 長(zhǎng)度8-30,必須包含三項(xiàng)(大寫字母、小寫字母、數(shù)字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符號(hào))。AssociationPropertyMetadata:Visible:Condition:Fn::Equals:- ${SelectInstance}- falseDefault:AllowedPattern: '[0-9A-Za-z\_\-\&:;''<>,=%`~!@#\(\)\$\^\*\+\|\{\}\[\]\.\?\/]+$'MinLength: 8MaxLength: 30NoEcho: true
Resources:Vpc:Type: ALIYUN::ECS::VPCProperties:CidrBlock: 192.168.0.0/16VSwitch:Type: ALIYUN::ECS::VSwitchProperties:ZoneId:Ref: ZoneIdVpcId:Ref: VpcCidrBlock: 192.168.0.0/24SecurityGroup:Type: ALIYUN::ECS::SecurityGroupProperties:VpcId:Ref: VpcSecurityGroupIngress_80:Type: ALIYUN::ECS::SecurityGroupIngressProperties:SecurityGroupId:Ref: SecurityGroupSourceCidrIp: 0.0.0.0/0IpProtocol: tcpNicType: intranetPortRange: 80/80InstanceGroup:Type: ALIYUN::ECS::InstanceGroupProperties:VpcId:Ref: VpcVSwitchId:Ref: VSwitchSecurityGroupId:Ref: SecurityGroupImageId: centos_7_9InstanceName: MaxKBInstanceType:Ref: InstanceTypeSystemDiskCategory:Ref: SystemDiskCategoryPassword:Ref: InstancePasswordIoOptimized: optimizedMaxAmount: 1DS_Instances:Type: DATASOURCE::ECS::InstancesProperties:InstanceIds:Fn::GetAtt:- InstanceGroup- InstanceIdsInstallMaxKB:Type: ALIYUN::ECS::RunCommandProperties:InstanceIds:Fn::GetAtt:- InstanceGroup- InstanceIdsType: RunShellScriptSync: trueTimeout: 1800CommandContent: |#!/bin/bashecho "#########################"echo "# Install Docker"echo "#########################"wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum -y install docker-cesystemctl start dockersystemctl enable dockerecho "#########################"echo "# Install MaxKB"echo "#########################"yum -y install jqDOCKER_DAEMON_JSON="/etc/docker/daemon.json"sudo jq --arg registry "$NEW_REGISTRY" '. + { "registry-mirrors": [https://0jt38sli.mirror.aliyuncs.com] }' $DOCKER_DAEMON_JSON > ${DOCKER_DAEMON_JSON}.temp && sudo mv ${DOCKER_DAEMON_JSON}.temp $DOCKER_DAEMON_JSONsudo systemctl daemon-reloadsudo systemctl restart dockerdocker run -d --name=maxkb -p 8080:8080 -v ~/.maxkb:/var/lib/postgresql/data 1panel/maxkbOutputs:MaxKBUrl:Description: MaxKB default address.Value:Fn::Sub:- http://${IP}- IP:Fn::Jq:- First- if .[0].PublicIpAddress != [] then .[0].PublicIpAddress[0] else .[0].EipAddress.IpAddressend- Fn::GetAtt:- DS_Instances- Instances
Metadata:ALIYUN::ROS::Interface:TemplateTags:- acs:developer:gitee:0147-ECS實(shí)例上搭建大語言模型的知識(shí)庫問答系統(tǒng)MaxKB

部署測(cè)試

回到我的模板中,點(diǎn)擊我的模板,查看對(duì)應(yīng)的資源框架,確認(rèn)基本無誤后點(diǎn)擊保存。

image.png

命名為MaxKB。

image.png

點(diǎn)擊創(chuàng)建棧:

image.png

由于我在上述ROS腳本中申明了可用區(qū)、CPU內(nèi)存配置、系統(tǒng)盤類型等,所以這里都需要進(jìn)行選擇:

image.png

選擇失敗時(shí)回滾,點(diǎn)擊創(chuàng)建,需保證賬戶余額大于100元

image.png

在創(chuàng)建界面的資源處,可以看到ROS中定義的實(shí)例正在逐一被創(chuàng)建:

image.png

構(gòu)建MaxKB需要花費(fèi)一些時(shí)間,創(chuàng)建完成后如下圖所示:

image.png

但是意外的是,事件里面出現(xiàn)執(zhí)行失敗了。

進(jìn)入事件,點(diǎn)擊前面的實(shí)例鏈接。

image.png

查看實(shí)例的日志,發(fā)現(xiàn)是docker超時(shí)了。

image.png

于是我增加了一個(gè)測(cè)試下載的hello-world的案例,發(fā)現(xiàn)是正常的:

sudo docker run hello-world

image.png

于是乎,我換到我自己的電腦上嘗試,很奇怪的是,即使添加了一堆鏡像源依然下載報(bào)錯(cuò)。。。

image.png

感覺有點(diǎn)不對(duì)勁了,開始嘗試用git方式部署,對(duì)照著文檔學(xué)習(xí)了一下,采用git本地編譯部署對(duì)環(huán)境要求極為苛刻。。。轉(zhuǎn)化成一鍵部署的腳本更是麻煩。

image.png

最后嘗試了半天無果,還是放棄MaxKB的搭建吧。。。沒事,咱們換個(gè)別的,反正這次重點(diǎn)在于ROS編寫上。

既然上面我們把基本框架都搭建完了,那么理論上只需要找個(gè)能跑的腳本就可以了,思來想去,考慮到綜合使用頻率和實(shí)用性,我這里還是決定來試一試部署Dify。

這里在查安裝方法的時(shí)候,突然看到阿里的ROS官方已經(jīng)發(fā)過一篇了。。。。流汗黃豆。。。

整體的內(nèi)容也是大差不差,區(qū)別就在于Dify的本地編譯很方便,而MaxKB需要規(guī)定版本的python環(huán)境,很麻煩。

ROSTemplateFormatVersion: '2015-09-01'
Description:en: Build the large language model (LLM) application development platform Dify onthe ECS instance (CentOS 7).zh-cn:ECS實(shí)例(CentOS 7)上搭建大語言模型(LLM) 應(yīng)用開發(fā)平臺(tái)Dify。
Parameters:ZoneId:Type: StringLabel:en: Availability Zonezh-cn: 可用區(qū)IDAssociationProperty: ALIYUN::ECS::Instance:ZoneIdInstanceType:Type: StringLabel:en: Instance Typezh-cn: 實(shí)例類型AssociationProperty: ALIYUN::ECS::Instance::InstanceTypeAssociationPropertyMetadata:ZoneId: ${ZoneId}DefaultValueStrategy: recentSystemDiskCategory:Type: StringLabel:en: System Disk Typezh-cn: 系統(tǒng)盤類型AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategoryAssociationPropertyMetadata:LocaleKey: DiskCategoryZoneId: ${ZoneId}InstanceType: ${InstanceType}AutoSelectFirst: trueAutoChangeType: falseDefault: cloud_essdInstancePassword:Type: StringLabel:en: Instance Passwordzh-cn: 實(shí)例密碼Description:en: Server login password, Length 8-30, must contain three(Capital letters,lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbolin).zh-cn: 服務(wù)器登錄密碼,長(zhǎng)度8-30,必須包含三項(xiàng)(大寫字母、小寫字母、數(shù)字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符號(hào))。ConstraintDescription:en: Length 8-30, must contain three(Capital letters, lowercase letters, numbers,()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in).zh-cn: 長(zhǎng)度8-30,必須包含三項(xiàng)(大寫字母、小寫字母、數(shù)字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符號(hào))。AssociationPropertyMetadata:Visible:Condition:Fn::Equals:- ${SelectInstance}- falseDefault:AllowedPattern: '[0-9A-Za-z\_\-\&:;''<>,=%`~!@#\(\)\$\^\*\+\|\{\}\[\]\.\?\/]+$'MinLength: 8MaxLength: 30NoEcho: true
Resources:Vpc:Type: ALIYUN::ECS::VPCProperties:CidrBlock: 192.168.0.0/16VSwitch:Type: ALIYUN::ECS::VSwitchProperties:ZoneId:Ref: ZoneIdVpcId:Ref: VpcCidrBlock: 192.168.0.0/24SecurityGroup:Type: ALIYUN::ECS::SecurityGroupProperties:VpcId:Ref: VpcSecurityGroupIngress_80:Type: ALIYUN::ECS::SecurityGroupIngressProperties:SecurityGroupId:Ref: SecurityGroupSourceCidrIp: 0.0.0.0/0IpProtocol: tcpNicType: intranetPortRange: 80/80InstanceGroup:Type: ALIYUN::ECS::InstanceGroupProperties:VpcId:Ref: VpcVSwitchId:Ref: VSwitchSecurityGroupId:Ref: SecurityGroupImageId: centos_7_9InstanceName: difyInstanceType:Ref: InstanceTypeSystemDiskCategory:Ref: SystemDiskCategoryPassword:Ref: InstancePasswordIoOptimized: optimizedMaxAmount: 1DS_Instances:Type: DATASOURCE::ECS::InstancesProperties:InstanceIds:Fn::GetAtt:- InstanceGroup- InstanceIdsInstallDify:Type: ALIYUN::ECS::RunCommandProperties:InstanceIds:Fn::GetAtt:- InstanceGroup- InstanceIdsType: RunShellScriptSync: trueTimeout: 1800CommandContent: |#!/bin/bashecho "#########################"echo "# Install Docker"echo "#########################"wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum -y install docker-cesystemctl start dockersystemctl enable dockerecho "#########################"echo "# Install Dify"echo "#########################"yum -y install gitgit clone --depth 1 https://github.com/langgenius/dify.git /opt/difycd /opt/dify/dockerdocker compose up -ddocker compose ps
Outputs:DifyUrl:Description: Dify default address.Value:Fn::Sub:- http://${IP}- IP:Fn::Jq:- First- if .[0].PublicIpAddress != [] then .[0].PublicIpAddress[0] else .[0].EipAddress.IpAddressend- Fn::GetAtt:- DS_Instances- Instances
Metadata:ALIYUN::ROS::Interface:TemplateTags:- acs:developer:gitee:0147-ECS實(shí)例上搭建大語言模型的知識(shí)庫問答系統(tǒng)MaxKB

最后結(jié)果是創(chuàng)建成功了,但是網(wǎng)站打不開,我一查日志,給我看笑了。

image.png

官方文檔給出的部署方式同樣出現(xiàn)了docker超時(shí)的情況,這下估計(jì)docker真指望不到了。

離了個(gè)大譜,還是自己來吧。

先寫了個(gè)部署nginx的腳本:

#!/bin/bash
#提前解決編譯時(shí)所需的依賴環(huán)境、庫文件;
yum install -y wget gzip gcc tar make
yum install -y pcre pcre-devel zlib-devel
#下載Nginx軟件包;
wget -c http://nginx.org/download/nginx-1.24.0.tar.gz -P /usr/src/
#Cd切換/usr/src/;
cd /usr/src/
ls -l nginx-1.24.0.tar.gz
#通過Tar工具對(duì)其解壓;
tar -xzvf nginx-1.24.0.tar.gz
#Cd切換至Nginx源代碼目錄;
cd nginx-1.24.0/
#提前創(chuàng)建www用戶和組;
useradd -s /sbin/nologin www -M
#預(yù)編譯;
./configure --prefix=/usr/local/nginx/ --user=www --group=www --with-http_stub_status_module
#編譯;
make -j4
#安裝;
make -j4 install
#查看Nginx軟件服務(wù)是否部署成功;
ls -l /usr/local/nginx/
#啟動(dòng)Nginx服務(wù)進(jìn)程;
/usr/local/nginx/sbin/nginx
#查看Nginx進(jìn)程狀態(tài);
ps -ef|grep -aiE nginx
#Firewalld防火墻對(duì)外開放80端口;
firewall-cmd --add-port=80/tcp --permanent
systemctl reload firewalld.service 

直接丟里面執(zhí)行,部署完了如下所示:

image.png
image.png

這里可以看到nginx還是部署成功了的,看來只是docker存在一些莫名奇妙的問題罷了。將這里的nginx腳本替換之前的MaxKB或者Dify的shell腳本處,勉強(qiáng)算是制作出第一個(gè)ROS腳本了,雖然一點(diǎn)用處都沒有。。。

總結(jié)

如果不是這次親手嘗試來寫ROS腳本也沒想到會(huì)碰到那么多問題,本來其實(shí)聽起來很簡(jiǎn)單的,整個(gè)邏輯也能理解,但是實(shí)際上手后,由于不熟悉,搞得這也是問題那也是問題,反反復(fù)復(fù)折騰。

第二點(diǎn)就是,官網(wǎng)上給的腳本居然也會(huì)出現(xiàn)執(zhí)行錯(cuò)誤的情況,這是我沒想到的。

不過,也正是這些問題和挑戰(zhàn),讓我深刻體會(huì)到了理論與實(shí)踐之間的差距,也促使我更加深入地學(xué)習(xí)和探索。每解決一個(gè)問題,都是對(duì)云計(jì)算領(lǐng)域理解的一次深化,對(duì)ROS及背后資源編排理念的掌握也愈發(fā)熟練。

過程充滿挑戰(zhàn),但每一次解決問題都是一次寶貴的學(xué)習(xí)機(jī)會(huì),讓我的技術(shù)棧更加堅(jiān)實(shí),也讓我在云原生和DevOps的道路上邁出了堅(jiān)實(shí)的一步。這種從實(shí)戰(zhàn)中獲得的經(jīng)驗(yàn),是任何教科書或理論學(xué)習(xí)都無法替代的。


2024年7月13日更新

昨晚研究了一晚,又寫了一個(gè)部署2048游戲的ROS腳本。

ROSTemplateFormatVersion: '2015-09-01'
Description:en: Set up the 2048 game on an ECS instance..zh-cn:ECS實(shí)例上搭建2048小游戲。
Parameters:ZoneId:Type: StringLabel:en: Availability Zonezh-cn: 可用區(qū)IDAssociationProperty: ALIYUN::ECS::Instance:ZoneIdInstanceType:Type: StringLabel:en: Instance Typezh-cn: 實(shí)例類型AssociationProperty: ALIYUN::ECS::Instance::InstanceTypeAssociationPropertyMetadata:ZoneId: ${ZoneId}DefaultValueStrategy: ecs.e-c1m2.large
Resources:Vpc:Type: ALIYUN::ECS::VPCProperties:CidrBlock: 192.168.0.0/16VSwitch:Type: ALIYUN::ECS::VSwitchProperties:ZoneId:Ref: ZoneIdVpcId:Ref: VpcCidrBlock: 192.168.0.0/24SecurityGroup:Type: ALIYUN::ECS::SecurityGroupProperties:VpcId:Ref: VpcSecurityGroupIngress_80:Type: ALIYUN::ECS::SecurityGroupIngressProperties:SecurityGroupId:Ref: SecurityGroupSourceCidrIp: 0.0.0.0/0IpProtocol: tcpNicType: intranetPortRange: 80/80InstanceGroup:Type: ALIYUN::ECS::InstanceGroupProperties:VpcId:Ref: VpcVSwitchId:Ref: VSwitchSecurityGroupId:Ref: SecurityGroupImageId: centos_7_9InstanceName: GAMEInstanceType:Ref: InstanceTypeSystemDiskCategory : cloud_essdIoOptimized: optimizedMaxAmount: 2DS_Instances:Type: DATASOURCE::ECS::InstancesProperties:InstanceIds:Fn::GetAtt:- InstanceGroup- InstanceIdsInstallGAME:Type: ALIYUN::ECS::RunCommandProperties:InstanceIds:Fn::GetAtt:- InstanceGroup- InstanceIdsType: RunShellScriptSync: trueTimeout: 1800CommandContent: |#!/bin/bashyum install -y httpd wgetsystemctl start httpdwget 'https://computenest-artifacts-cn-hangzhou.oss-cn-hangzhou-internal.aliyuncs.com/1853370294850618/cn-beijing/1697533575326/2048.tgz' -O 2048.tgztar xvf 2048.tgzmv 2048/* /var/www/html && rm -rf 2048Outputs:GAMEUrl:Description: GAME default address.Value:Fn::Sub:- http://${IP}- IP:Fn::Jq:- First- if .[0].PublicIpAddress != [] then .[0].PublicIpAddress[0] else .[0].EipAddress.IpAddressend- Fn::GetAtt:- DS_Instances- Instances
Metadata:ALIYUN::ROS::Interface:TemplateTags:- acs:developer:gitee:0147-在ECS實(shí)例上搭建2048小游戲

這里實(shí)測(cè)是完全沒有任何問題的。

image.png

image.png

image.png

下面我把腳本上傳到我的gitee中,新建一個(gè)倉庫,命名為阿里云ROS:

image.png

由于只有一個(gè)腳本,所以直接創(chuàng)建文件然后復(fù)制進(jìn)去就可以了:

image.png

最終地址如下:

image.png

我們來嘗試直接一鍵部署,前面引入ROS的部署的鏈接地址:

https://ros.console.aliyun.com/region/stacks/create?hideStepRow=true&hideStackConfig=true&disableRollback=false&isSimplified=true&disableNarue&productNavBar=disabled&templateUrl=

后面拼接自己的gitee地址:

https://gitee.com/a156da16/aliyunros/blob/master/GAME.yaml

所以最終一鍵部署鏈接如下:

https://ros.console.aliyun.com/cn-hangzhou/stacks/create?hideStepRow=true&hideStackConfig=true&disableRollback=false&isSimplified=true&disableNarue&productNavBar=disabled&templateUrl=https://gitee.com/a156da16/aliyunros/blob/master/GAME.yaml

嘗試了一下,有個(gè)很逆天的地方,一直顯示訪問被拒絕。具體原因也一直沒找到,在群里找專家問了:

image.png

為了避免版本不一致,我直接復(fù)制gitee里上傳的那個(gè)版本,進(jìn)入ROS中進(jìn)行創(chuàng)建,是能夠識(shí)別模板參數(shù)的:

image.png

但是通過官方給的鏈接就是一直報(bào)錯(cuò)。。。

這篇就這樣吧,反正總之把腳本也是寫出來了,剛開始接觸不是很熟悉,只能從簡(jiǎn)單的開始了。

http://www.risenshineclean.com/news/7955.html

相關(guān)文章:

  • 做圖片網(wǎng)站用什么程序百度地圖導(dǎo)航手機(jī)版免費(fèi)下載
  • 可以先做網(wǎng)站后備案么app拉新推廣平臺(tái)有哪些
  • 2345網(wǎng)址導(dǎo)航手機(jī)上網(wǎng)導(dǎo)航下載seo網(wǎng)絡(luò)推廣教程
  • 秦皇島建設(shè)網(wǎng)站品牌宣傳方式
  • 網(wǎng)絡(luò)營(yíng)銷方式的使用方法搜索引擎優(yōu)化有哪些要點(diǎn)
  • 長(zhǎng)春關(guān)鍵詞推廣快速排名優(yōu)化seo
  • 網(wǎng)頁設(shè)計(jì)與實(shí)現(xiàn)論文杭州seo公司排名
  • 濟(jì)寧營(yíng)銷網(wǎng)站建設(shè)長(zhǎng)沙網(wǎng)站優(yōu)化排名推廣
  • 加強(qiáng)兩微一端和門戶網(wǎng)站建設(shè)云資源軟文發(fā)布平臺(tái)
  • 代購網(wǎng)站建設(shè)網(wǎng)絡(luò)營(yíng)銷平臺(tái)有哪些?
  • 武漢網(wǎng)站多少百度網(wǎng)址導(dǎo)航
  • 南山做網(wǎng)站推廣樂云seo最新營(yíng)銷模式
  • 網(wǎng)站給他人做付刑事責(zé)任現(xiàn)在什么app引流效果好
  • 交易所網(wǎng)站開發(fā)實(shí)戰(zhàn)優(yōu)化排名軟件
  • 武漢肥貓科技商城網(wǎng)站建設(shè)北京專業(yè)seo公司
  • 簡(jiǎn)要列舉網(wǎng)站常見類型合肥百度關(guān)鍵詞優(yōu)化
  • 深圳外包網(wǎng)站制作公司seo網(wǎng)站優(yōu)化快速排名軟件
  • 建站快車凡科網(wǎng)站維護(hù)的內(nèi)容有哪些
  • 廣州最新新聞發(fā)大水杭州谷歌seo公司
  • wordpress 列表頁面sem優(yōu)化師
  • 中國建設(shè)銀行網(wǎng)站 黨費(fèi)云安卓?jī)?yōu)化大師官網(wǎng)
  • 怎樣做網(wǎng)站二維碼windows優(yōu)化大師怎么下載
  • 粘土做龍網(wǎng)站視頻seo新方法
  • 淘寶代做網(wǎng)站百度競(jìng)價(jià)關(guān)鍵詞價(jià)格查詢工具
  • 網(wǎng)站兩邊廣告整站優(yōu)化外包服務(wù)
  • 香港做雞網(wǎng)站今日資訊最新消息
  • 做爰小視頻網(wǎng)站鄭州網(wǎng)絡(luò)營(yíng)銷哪個(gè)好
  • 彩票銷信 網(wǎng)站怎么做站長(zhǎng)之家最新網(wǎng)站
  • 企業(yè)如何免費(fèi)做網(wǎng)站商業(yè)公司的域名
  • wordpress 制作portfolioseo管理與優(yōu)化期末試題