From d224ff37f827783f33aed7647504adefffaf455f Mon Sep 17 00:00:00 2001 From: RiceBowlJr Date: Thu, 10 May 2018 14:12:21 +0200 Subject: [PATCH 1/4] Added CI + CD + Infra to make the blog example work on AWS --- .cloudformation/ci_cd_infra.yml | 237 ++++++++++++++++++++++++++++++++ buildspec.yml | 18 +++ 2 files changed, 255 insertions(+) create mode 100644 .cloudformation/ci_cd_infra.yml create mode 100644 buildspec.yml diff --git a/.cloudformation/ci_cd_infra.yml b/.cloudformation/ci_cd_infra.yml new file mode 100644 index 0000000..e44d35a --- /dev/null +++ b/.cloudformation/ci_cd_infra.yml @@ -0,0 +1,237 @@ +AWSTemplateFormatVersion: "2010-09-09" +Description: CI/CD + S3 bucket Website Hostoing for Front-End example in VueJS + +#------------------------------------------------------------------------------- +#--[ PARAMETERS ]--------------------------------------------------------------- +#------------------------------------------------------------------------------- +Parameters: + BuildBucket: + Description: S3 Build bucket + Type: String + + BucketName: + Description: S3 website bucket + Type: String + + CacheControlMaxAge: + Description: Cache Control for S3 synchronization (default 5 min) + Type: Number + Default: 300 + + GitHubUser: + Description: GitHub user + Type: String + + GitHubRepo: + Description: GitHub repository + Type: String + + GitHubBranch: + Description: Gith branch for + Type: String + + GitHubToken: + Description: GitHub personal token + Type: String + NoEcho: true + + SlackHook: + Description: Slack hook + Type: String + NoEcho: true + +#------------------------------------------------------------------------------- +#--[ RESOURCES ]---------------------------------------------------------------- +#------------------------------------------------------------------------------- +Resources: + S3WebsiteBucket: + Type: AWS::S3::Bucket + Properties: + BucketName: !Ref BucketName + WebsiteConfiguration: + IndexDocument: index.html + ErrorDocument: error.html + DeletionPolicy: Retain + + S3BuildBucket: + Type: AWS::S3::Bucket + Properties: + BucketName: !Ref BuildBucket + + SampleBucketPolicy: + Type: AWS::S3::BucketPolicy + Properties: + Bucket: !Ref S3WebsiteBucket + PolicyDocument: + Statement: + - Action: + - s3:GetObject + Effect: Allow + Resource: + Fn::Join: + - "" + - + - "arn:aws:s3:::" + - + Ref: "S3WebsiteBucket" + - "/*" + Principal: "*" + + CodeBuildServiceRole: + Type: AWS::IAM::Role + Properties: + RoleName: AWSCodeBuildServiceRole + Path: / + AssumeRolePolicyDocument: | + { + "Statement": [{ + "Effect": "Allow", + "Principal": { "Service": [ "codebuild.amazonaws.com" ]}, + "Action": [ "sts:AssumeRole" ] + }] + } + Policies: + - PolicyName: root + PolicyDocument: + Version: 2012-10-17 + Statement: + - Resource: "*" + Effect: Allow + Action: + - logs:CreateLogGroup + - logs:CreateLogStream + - logs:PutLogEvents + - iam:* + - Resource: + - !Sub arn:aws:s3:::${BucketName}/* + - !Sub arn:aws:s3:::${BucketName} + Effect: Allow + Action: + - s3:* + - Resource: + - !Sub arn:aws:s3:::${BuildBucket}/* + - !Sub arn:aws:s3:::${BuildBucket} + Effect: Allow + Action: + - s3:Get* + + CodePipelineServiceRole: + Type: AWS::IAM::Role + Properties: + RoleName: AWSCodePipelineServiceRole + Path: / + AssumeRolePolicyDocument: | + { + "Statement": [{ + "Effect": "Allow", + "Principal": { "Service": [ "codepipeline.amazonaws.com" ]}, + "Action": [ "sts:AssumeRole" ] + }] + } + Policies: + - PolicyName: root + PolicyDocument: + Version: 2012-10-17 + Statement: + - Resource: + - !Sub arn:aws:s3:::${BuildBucket}/* + - !Sub arn:aws:s3:::${BuildBucket} + Effect: Allow + Action: + - s3:PutObject + - s3:GetObject + - s3:GetObjectVersion + - s3:GetBucketVersioning + - Resource: "*" + Effect: Allow + Action: + - codebuild:StartBuild + - codebuild:BatchGetBuilds + - codedeploy:* + - cloudformation:* + - iam:PassRole + - lambda:* + +#--[ CodeBuild Production ]-------------------------------------------------------- + CodeBuild: + Type: AWS::CodeBuild::Project + Properties: + Artifacts: + Type: "CODEPIPELINE" + Source: + Type: "CODEPIPELINE" + Environment: + ComputeType: "BUILD_GENERAL1_SMALL" + Image: "node:8-alpine" + Type: "LINUX_CONTAINER" + EnvironmentVariables: + - Name: AWS_DEFAULT_REGION + Value: !Ref AWS::Region + - Name: BUCKET_NAME + Value: !Ref BucketName + - Name: CACHE_CONTROL_MAX_AGE + Value: !Ref CacheControlMaxAge + - Name: BRANCH + Value: !Ref GitHubBranch + - Name: SLACK_HOOK + Value: !Ref SlackHook + - Name: REPO + Value: !Ref GitHubRepo + - Name: USER + Value: !Ref GitHubUser + Name: !Ref GitHubRepo + ServiceRole: !GetAtt CodeBuildServiceRole.Arn + +#--[ CodePipeline ]------------------------------------------------------------- + CodePipeline: + Type: AWS::CodePipeline::Pipeline + Properties: + Name: !Ref GitHubRepo + RoleArn: !GetAtt CodePipelineServiceRole.Arn + ArtifactStore: + Type: S3 + Location: !Ref BuildBucket + Stages: + - Name: "Source" + Actions: + - Name: "Download_Source" + ActionTypeId: + Category: Source + Owner: ThirdParty + Version: 1 + Provider: GitHub + Configuration: + Owner: !Ref GitHubUser + Repo: !Ref GitHubRepo + Branch: !Ref GitHubBranch + OAuthToken: !Ref GitHubToken + OutputArtifacts: + - Name: source + RunOrder: 1 + - Name: "Build" + Actions: + - Name: "Build_and_deploy" + ActionTypeId: + Category: Build + Owner: AWS + Version: 1 + Provider: CodeBuild + Configuration: + ProjectName: !Ref CodeBuild + InputArtifacts: + - Name: source + OutputArtifacts: + - Name: build + RunOrder: 1 + +Outputs: + WebsiteURL: + Value: !GetAtt [S3WebsiteBucket, WebsiteURL] + Description: URL for website hosted on S3 + Export: + Name: WebsiteURL + S3BucketSecureURL: + Value: !Join ['', ['https://', !GetAtt [S3WebsiteBucket, DomainName]]] + Description: Name of S3 bucket to hold website content + Export: + Name: WebsiteSecureURL diff --git a/buildspec.yml b/buildspec.yml new file mode 100644 index 0000000..a4e56ed --- /dev/null +++ b/buildspec.yml @@ -0,0 +1,18 @@ +version: 0.1 +os: linux +phases: + install: + commands: + - apk add --no-cache --update python3 + - pip3 install awscli + - apk add curl + build: + commands: + - npm install + - npm run build + - aws s3 sync ./dist/ s3://$BUCKET_NAME/ --delete --cache-control max-age=$CACHE_CONTROL_MAX_AGE + post_build: + commands: + - 'curl -X POST -d "{\"text\": \"Environment deployment succeded\", \"attachments\": [{\"color\": \"#00CC00\",\"title\": \"Deployment informations\", \"text\": \"Repository: https://github.com/$USER/$REPO\nBranch: $BRANCH \nBucket: $BUCKET_NAME\"}]}" https://hooks.slack.com/services/$SLACK_HOOK' + - ls -lah ./ + - echo "Sucess!" From 7b1bd27a23cac8f111e65323f0cc81e655db68f2 Mon Sep 17 00:00:00 2001 From: RiceBowlJr Date: Thu, 10 May 2018 14:44:01 +0200 Subject: [PATCH 2/4] Added documentation to use CloudFormation resources --- .cloudformation/README.md | 60 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 .cloudformation/README.md diff --git a/.cloudformation/README.md b/.cloudformation/README.md new file mode 100644 index 0000000..29d8148 --- /dev/null +++ b/.cloudformation/README.md @@ -0,0 +1,60 @@ +# CloudFormation + +This directory contains the Infrastructure as a Code to deploy the project on AWS, for a minimal cost (near $0). + +> Note: +> It only works without SSL and doesn't generate the friendly DNS records. For that purpose, you need to set a CloudFront Distribution that points to the S3 bucket website link as a backend, and redirect all HTTP to HTTPS. You'll also need to generate a Public Hosted Zone and a A (and AAAA) Alias record pointing to the CloudFront distribution. To make SSL work correctly you'll also need to generate a certificate with ACM (Amazon Certificate Manager) and put it in the CloudFront distribution. + +## Prequisite + +To deploy this infrastructure, you'll prealably need to: + * Set a GitHub Token with Read Only access to the repo + * Have a AWS account with an IAM user (with your Access Key and Secret Key) having CloudFormation rights (at least) + * Set a `incoming-webhook` in your Slack Team (and obviously have a Slack Team) + +## Deploying to AWS + +To deploy the CloudFormation Stack, I like to use a powerful tool which is [aws-shell](https://github.com/awslabs/aws-shell) which give an enhanced CLI for AWS.
+The command to deploy everything is (pretty long): + +``` +aws cloudformation deploy --template-file ci_infra.yml \ + --stack-name \ + --capabilities CAPABILITY_NAMED_IAM \ + --parameter-overrides \ + GitHubRepo=vue-blog-demo \ + BuildBucket= \ + BucketName= \ + CacheControlMaxAge=300 \ + GitHubUser= \ + GitHubBranch= \ + GitHubToken=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \ + SlackHook=xxxxxxx/xxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxx +``` + +This will create a CloudFormation Stack with the following resources: + * **AWS::CodeBuild::Project**: a CodeBuild project to build the project (instructions in the `buildspec.yml` in root directory of this repo) + * **AWS::IAM::Role**: a CodeBuild IAM role to make CodeDeploy able to execute itself (spawn a container and access to S3 build Bucket and S3 Website bucket) + * **AWS::CodePipeline::Pipeline**: a CodePipeline pipeline to listen to any change in the GitHub repository and trigger the build + * **AWS::IAM::Role**: a CodePipeline IAM role to make it able to call CodeBuild and push an artifact to the build bucket + * **AWS::S3::Bucket**: 2 buckets, one for the website, an other to store the artifacts + * **AWS::S3::BucketPolicy**: a bucket policy attached to the website bucket, to make it accessible to the whole world + +## Update the Stack + +To update the stack (if you make any change to it), just run the same command than for deploying without the parameters (if you don"t want to override any parameters): + +``` +aws cloudformation deploy --template-file ci_infra.yml \ + --stack-name \ + --capabilities CAPABILITY_NAMED_IAM +``` +## Delete the Stack + +Since everything is created with CloudFormation, you can delete every resources with one command, without forgeting any resources, avoiding aditional costs. The command is pretty simple: + +``` +aws cloudformation delete-stack --stack-name ci_infra.yml +``` + +That's all. From fceb1467307b50087c54f62e024b297ccb687a94 Mon Sep 17 00:00:00 2001 From: RiceBowlJr Date: Mon, 21 May 2018 21:42:41 +0200 Subject: [PATCH 3/4] Added CloudFront distrib + Route 53 records A & AAAA --- .cloudformation/ci_cd_infra.yml | 65 ++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/.cloudformation/ci_cd_infra.yml b/.cloudformation/ci_cd_infra.yml index e44d35a..cbe1b33 100644 --- a/.cloudformation/ci_cd_infra.yml +++ b/.cloudformation/ci_cd_infra.yml @@ -18,6 +18,10 @@ Parameters: Type: Number Default: 300 + CertificateArn: + Description: Certificate ARN, located in us-east-1, for CloudFront Distribution CNAME + Type: String + GitHubUser: Description: GitHub user Type: String @@ -35,6 +39,14 @@ Parameters: Type: String NoEcho: true + HostedZoneName: + Description: Hosted Zone Name, obviously + Type: String + + RecordName: + Description: Name of the record set (without the hosted zone name, just the last subdomain) + Type: String + SlackHook: Description: Slack hook Type: String @@ -51,7 +63,7 @@ Resources: WebsiteConfiguration: IndexDocument: index.html ErrorDocument: error.html - DeletionPolicy: Retain +# DeletionPolicy: Retain S3BuildBucket: Type: AWS::S3::Bucket @@ -77,6 +89,57 @@ Resources: - "/*" Principal: "*" + CloudfrontDistribution: + Type: AWS::CloudFront::Distribution + Properties: + DistributionConfig: + Aliases: + - !Ref BucketName + Comment: !Ref BucketName + DefaultRootObject: index.html + Enabled: True + IPV6Enabled: True + DefaultCacheBehavior: + ForwardedValues: + QueryString: True + TargetOriginId: !Sub S3-Website-${BucketName} + ViewerProtocolPolicy: redirect-to-https + Origins: + - CustomOriginConfig: + OriginProtocolPolicy: http-only + DomainName: !Sub ${BucketName}.s3-website-${AWS::Region}.amazonaws.com + Id: !Sub S3-Website-${BucketName} + ViewerCertificate: + AcmCertificateArn: !Ref CertificateArn + SslSupportMethod: sni-only + Tags: + - Key: Env + Value: prod + - Key: Name + Value: static-website-example + + Route53RecordSetIPv4: + Type: AWS::Route53::RecordSet + Properties: + AliasTarget: + DNSName: !GetAtt CloudfrontDistribution.DomainName + HostedZoneId: Z2FDTNDATAQYW2 + Comment: !Ref BucketName + HostedZoneName: !Ref HostedZoneName + Name: !Sub ${RecordName}.${HostedZoneName} + Type: A + + Route53RecordSetIPv6: + Type: AWS::Route53::RecordSet + Properties: + AliasTarget: + DNSName: !GetAtt CloudfrontDistribution.DomainName + HostedZoneId: Z2FDTNDATAQYW2 + Comment: !Ref BucketName + HostedZoneName: !Ref HostedZoneName + Name: !Sub ${RecordName}.${HostedZoneName} + Type: AAAA + CodeBuildServiceRole: Type: AWS::IAM::Role Properties: From 5df881a8d6bb7f4881c2194972e9fe1434d87bb7 Mon Sep 17 00:00:00 2001 From: RiceBowlJr Date: Mon, 21 May 2018 21:51:06 +0200 Subject: [PATCH 4/4] Some changes to try things out --- static/api/blog.json | 2 +- static/api/feed.json | 90 ++----------------- static/api/post/automated-static-blog.json | 13 +++ static/api/post/consequat-ut-nulla.json | 13 --- static/api/post/curabitur-gravida-nisi.json | 13 --- static/api/post/dolor-quis.json | 13 --- static/api/post/lacinia-eget-tincidunt.json | 13 --- .../api/post/neque-libero-convallis-eget.json | 13 --- static/api/post/nunc-commodo-placerat.json | 13 --- static/api/post/posuere-cubilia.json | 13 --- static/api/post/potenti-cras-in-purus.json | 13 --- static/api/post/pretium-nisl.json | 13 --- static/api/post/sapien-ut-nunc.json | 13 --- static/api/post/sit-amet-diam-in.json | 13 --- static/api/post/sit-amet-erat.json | 13 --- static/api/post/ultrices-mattis-odio.json | 13 --- static/api/post/ut-massa-quis-augue.json | 13 --- .../api/post/vivamus-tortor-duis-mattis.json | 13 --- static/api/post/who-am-i.json | 13 +++ 19 files changed, 33 insertions(+), 280 deletions(-) create mode 100644 static/api/post/automated-static-blog.json delete mode 100644 static/api/post/consequat-ut-nulla.json delete mode 100644 static/api/post/curabitur-gravida-nisi.json delete mode 100644 static/api/post/dolor-quis.json delete mode 100644 static/api/post/lacinia-eget-tincidunt.json delete mode 100644 static/api/post/neque-libero-convallis-eget.json delete mode 100644 static/api/post/nunc-commodo-placerat.json delete mode 100644 static/api/post/posuere-cubilia.json delete mode 100644 static/api/post/potenti-cras-in-purus.json delete mode 100644 static/api/post/pretium-nisl.json delete mode 100644 static/api/post/sapien-ut-nunc.json delete mode 100644 static/api/post/sit-amet-diam-in.json delete mode 100644 static/api/post/sit-amet-erat.json delete mode 100644 static/api/post/ultrices-mattis-odio.json delete mode 100644 static/api/post/ut-massa-quis-augue.json delete mode 100644 static/api/post/vivamus-tortor-duis-mattis.json create mode 100644 static/api/post/who-am-i.json diff --git a/static/api/blog.json b/static/api/blog.json index ee5a6e0..1d174d2 100644 --- a/static/api/blog.json +++ b/static/api/blog.json @@ -1,6 +1,6 @@ { "results": [{ - "title": "In Plain Vue", + "title": "A Cloud Enthousiast", "post_label": "Exit reading mode", "author_label": "View all authors" }] diff --git a/static/api/feed.json b/static/api/feed.json index da6909a..2eb30a8 100644 --- a/static/api/feed.json +++ b/static/api/feed.json @@ -1,93 +1,15 @@ { "results": [{ - "title": "neque libero convallis eget", + "title": "Who am I", "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/karl-magnuson.jpg", "published": "2017-09-14T18:17:00Z", - "author": "Michelle Blackford", - "id": "neque-libero-convallis-eget" + "author": "Alexandre Kervadec", + "id": "who-am-i" }, { - "title": "sit amet erat", + "title": "An automated static blog", "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/etienne-bosiger.jpg", "published": "2017-09-09T22:11:56Z", - "author": "Nathan Greave", - "id": "sit-amet-erat" - }, { - "title": "posuere cubilia", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/saksham-gangwar.jpg", - "published": "2017-09-05T00:55:44Z", - "author": "Hugo Curness", - "id": "posuere-cubilia" - }, { - "title": "consequat ut nulla", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/mona-eendra.jpg", - "published": "2017-07-28T18:31:01Z", - "author": "Derrik Yerrington", - "id": "consequat-ut-nulla" - }, { - "title": "curabitur gravida nisi", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/adam-krowitz.jpg", - "published": "2017-06-12T10:01:51Z", - "author": "Michelle Blackford", - "id": "curabitur-gravida-nisi" - }, { - "title": "pretium nisl", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/steven-pahel.jpg", - "published": "2017-06-02T03:22:11Z", - "author": "Nathan Greave", - "id": "pretium-nisl" - }, { - "title": "vivamus tortor duis mattis", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/simone-hutsch.jpg", - "published": "2017-05-27T00:05:26Z", - "author": "Tommi Filipson", - "id": "vivamus-tortor-duis-mattis" - }, { - "title": "potenti cras in purus", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/casey-horner.jpg", - "published": "2017-05-25T13:12:39Z", - "author": "Nathan Greave", - "id": "potenti-cras-in-purus" - }, { - "title": "ultrices mattis odio", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/nate-rayfield.jpg", - "published": "2017-05-10T13:57:35Z", - "author": "Nathan Greave", - "id": "ultrices-mattis-odio" - }, { - "title": "nunc commodo placerat", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/kimon-maritz.jpg", - "published": "2017-04-12T09:43:53Z", - "author": "Nathan Greave", - "id": "nunc-commodo-placerat" - }, { - "title": "sit amet diam in", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/shalom-mwenesi.jpg", - "published": "2017-04-03T22:21:22Z", - "author": "Derrik Yerrington", - "id": "sit-amet-diam-in" - }, { - "title": "sapien ut nunc", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/robson-hatsukami-morgan.jpg", - "published": "2017-03-10T21:11:06Z", - "author": "Derrik Yerrington", - "id": "sapien-ut-nunc" - }, { - "title": "ut massa quis augue", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/tom-barrett.jpg", - "published": "2016-12-15T23:29:56Z", - "author": "Nathan Greave", - "id": "ut-massa-quis-augue" - }, { - "title": "lacinia eget tincidunt", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/joshua-hibbert.jpg", - "published": "2016-11-02T02:21:18Z", - "author": "Martha Bonde", - "id": "lacinia-eget-tincidunt" - }, { - "title": "dolor quis", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/maarten-van-den-heuvel.jpg", - "published": "2016-10-27T09:42:32Z", - "author": "Tommi Filipson", - "id": "dolor-quis" + "author": "Alexandre Kervadec", + "id": "automated-static-blog" }] } diff --git a/static/api/post/automated-static-blog.json b/static/api/post/automated-static-blog.json new file mode 100644 index 0000000..361bab9 --- /dev/null +++ b/static/api/post/automated-static-blog.json @@ -0,0 +1,13 @@ +{ + "results": [{ + "id": "automated-static-blog", + "title": "A way to automate you blog on AWS", + "content": "Coming soon, a simple way to automate your blog on AWS for almost no costs.", + "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/etienne-bosiger.jpg", + "meta": { + "description": "Coming soon, a simple way to automate your blog on AWS for almost no costs.", + "published": "2017-09-09T22:11:56Z", + "author": "Alexandre Kervadec" + } + }] +} diff --git a/static/api/post/consequat-ut-nulla.json b/static/api/post/consequat-ut-nulla.json deleted file mode 100644 index e83ee8e..0000000 --- a/static/api/post/consequat-ut-nulla.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "results": [{ - "id": "consequat-ut-nulla", - "title": "consequat ut nulla", - "content": "Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.\n\nPraesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.\n\nCras mi pede, malesuada in, imperdiet et, commodo vulputate, justo. In blandit ultrices enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\n\nProin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.\n\nAenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum.\n\nCurabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/mona-eendra.jpg", - "meta": { - "description": "Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.", - "published": "2017-07-28T18:31:01Z", - "author": "Derrik Yerrington" - } - }] -} diff --git a/static/api/post/curabitur-gravida-nisi.json b/static/api/post/curabitur-gravida-nisi.json deleted file mode 100644 index 5138e4c..0000000 --- a/static/api/post/curabitur-gravida-nisi.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "results": [{ - "id": "curabitur-gravida-nisi", - "title": "curabitur gravida nisi", - "content": "Sed ante. Vivamus tortor. Duis mattis egestas metus.\n\nAenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.\n\nQuisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est. Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.\n\nVestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.\n\nIn congue. Etiam justo. Etiam pretium iaculis justo.\n\nIn hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/adam-krowitz.jpg", - "meta": { - "description": "Proin at turpis a pede posuere nonummy. Integer non velit. Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue.", - "published": "2017-06-12T10:01:51Z", - "author": "Michelle Blackford" - } - }] -} diff --git a/static/api/post/dolor-quis.json b/static/api/post/dolor-quis.json deleted file mode 100644 index fe8843e..0000000 --- a/static/api/post/dolor-quis.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "results": [{ - "id": "dolor-quis", - "title": "dolor quis", - "content": "Morbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem.\n\nFusce consequat. Nulla nisl. Nunc nisl.\n\nDuis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa. Donec dapibus. Duis at velit eu est congue elementum.\n\nIn hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/kimon-maritz.jpg", - "meta": { - "description": "Nunc nisl. Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa. Donec dapibus.", - "published": "2017-04-12T09:43:53Z", - "author": "Nathan Greave" - } - }] -} diff --git a/static/api/post/lacinia-eget-tincidunt.json b/static/api/post/lacinia-eget-tincidunt.json deleted file mode 100644 index 70830a4..0000000 --- a/static/api/post/lacinia-eget-tincidunt.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "results": [{ - "id": "lacinia-eget-tincidunt", - "title": "lacinia eget tincidunt", - "content": "Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.\n\nSed ante. Vivamus tortor. Duis mattis egestas metus.\n\nAenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.\n\nQuisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est. Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.\n\nVestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.\n\nIn congue. Etiam justo. Etiam pretium iaculis justo.\n\nIn hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.\n\nNulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/joshua-hibbert.jpg", - "meta": { - "description": "Nam dui. Proin leo odio, porttitor id, consequat in, consequat ut, nulla.", - "published": "2016-11-02T02:21:18Z", - "author": "Martha Bonde" - } - }] -} diff --git a/static/api/post/neque-libero-convallis-eget.json b/static/api/post/neque-libero-convallis-eget.json deleted file mode 100644 index 9408a98..0000000 --- a/static/api/post/neque-libero-convallis-eget.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "results": [{ - "id": "neque-libero-convallis-eget", - "title": "neque libero convallis eget", - "content": "In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.\n\nAliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.\n\nSed ante. Vivamus tortor. Duis mattis egestas metus.\n\nAenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/karl-magnuson.jpg", - "meta": { - "description": "Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.", - "published": "2017-09-14T18:17:00Z", - "author": "Michelle Blackford" - } - }] -} diff --git a/static/api/post/nunc-commodo-placerat.json b/static/api/post/nunc-commodo-placerat.json deleted file mode 100644 index b5adb07..0000000 --- a/static/api/post/nunc-commodo-placerat.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "results": [{ - "id": "nunc-commodo-placerat", - "title": "nunc commodo placerat", - "content": "In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.\n\nSuspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.\n\nMaecenas ut massa quis augue luctus tincidunt. Nulla mollis molestie lorem. Quisque ut erat.\n\nCurabitur gravida nisi at nibh. In hac habitasse platea dictumst. Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.\n\nInteger tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/robson-hatsukami-morgan.jpg", - "meta": { - "description": "Morbi non quam nec dui luctus rutrum. Nulla tellus. In sagittis dui vel nisl.", - "published": "2017-03-10T21:11:06Z", - "author": "Derrik Yerrington" - } - }] -} diff --git a/static/api/post/posuere-cubilia.json b/static/api/post/posuere-cubilia.json deleted file mode 100644 index 0c7e7e7..0000000 --- a/static/api/post/posuere-cubilia.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "results": [{ - "id": "posuere-cubilia", - "title": "posuere cubilia", - "content": "Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.\n\nPellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.\n\nCum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.\n\nEtiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.\n\nPraesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.\n\nCras mi pede, malesuada in, imperdiet et, commodo vulputate, justo. In blandit ultrices enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/saksham-gangwar.jpg", - "meta": { - "description": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin risus.", - "published": "2017-09-05T00:55:44Z", - "author": "Hugo Curness" - } - }] -} diff --git a/static/api/post/potenti-cras-in-purus.json b/static/api/post/potenti-cras-in-purus.json deleted file mode 100644 index 3382a45..0000000 --- a/static/api/post/potenti-cras-in-purus.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "results": [{ - "id": "potenti-cras-in-purus", - "title": "potenti cras in purus", - "content": "Sed ante. Vivamus tortor. Duis mattis egestas metus.\n\nAenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.\n\nQuisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est. Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.\n\nVestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.\n\nIn congue. Etiam justo. Etiam pretium iaculis justo.\n\nIn hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.\n\nNulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/casey-horner.jpg", - "meta": { - "description": "Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue.", - "published": "2017-05-25T13:12:39Z", - "author": "Nathan Greave" - } - }] -} diff --git a/static/api/post/pretium-nisl.json b/static/api/post/pretium-nisl.json deleted file mode 100644 index e46a3e8..0000000 --- a/static/api/post/pretium-nisl.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "results": [{ - "id": "pretium-nisl", - "title": "pretium nisl", - "content": "Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.\n\nCras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.\n\nQuisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.\n\nPhasellus in felis. Donec semper sapien a libero. Nam dui.", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/steven-pahel.jpg", - "meta": { - "description": "Nullam varius. Nulla facilisi. Cras non velit nec nisi vulputate nonummy.", - "published": "2017-06-02T03:22:11Z", - "author": "Nathan Greave" - } - }] -} diff --git a/static/api/post/sapien-ut-nunc.json b/static/api/post/sapien-ut-nunc.json deleted file mode 100644 index e7bae1e..0000000 --- a/static/api/post/sapien-ut-nunc.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "results": [{ - "id": "sapien-ut-nunc", - "title": "sapien ut nunc", - "content": "Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.\n\nAenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum.\n\nCurabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.\n\nPhasellus sit amet erat. Nulla tempus. Vivamus in felis eu sapien cursus vestibulum.", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/maarten-van-den-heuvel.jpg", - "meta": { - "description": "Morbi vel lectus in quam fringilla rhoncus. Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis. Integer aliquet, massa id lobortis convallis.", - "published": "2016-10-27T09:42:32Z", - "author": "Tommi Filipson" - } - }] -} diff --git a/static/api/post/sit-amet-diam-in.json b/static/api/post/sit-amet-diam-in.json deleted file mode 100644 index 1ee739e..0000000 --- a/static/api/post/sit-amet-diam-in.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "results": [{ - "id": "sit-amet-diam-in", - "title": "sit amet diam in", - "content": "Nullam porttitor lacus at turpis. Donec posuere metus vitae ipsum. Aliquam non mauris.\n\nMorbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.\n\nFusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.\n\nSed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/shalom-mwenesi.jpg", - "meta": { - "description": "Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.", - "published": "2017-04-03T22:21:22Z", - "author": "Derrik Yerrington" - } - }] -} diff --git a/static/api/post/sit-amet-erat.json b/static/api/post/sit-amet-erat.json deleted file mode 100644 index 9159dc7..0000000 --- a/static/api/post/sit-amet-erat.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "results": [{ - "id": "sit-amet-erat", - "title": "sit amet erat", - "content": "Maecenas tristique, est et tempus semper, est quam pharetra magna, ac consequat metus sapien ut nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam. Suspendisse potenti.\n\nNullam porttitor lacus at turpis. Donec posuere metus vitae ipsum. Aliquam non mauris.\n\nMorbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.\n\nFusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.\n\nSed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.\n\nPellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.\n\nCum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/etienne-bosiger.jpg", - "meta": { - "description": "Nulla facilisi. Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit.", - "published": "2017-09-09T22:11:56Z", - "author": "Nathan Greave" - } - }] -} diff --git a/static/api/post/ultrices-mattis-odio.json b/static/api/post/ultrices-mattis-odio.json deleted file mode 100644 index c33dacc..0000000 --- a/static/api/post/ultrices-mattis-odio.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "results": [{ - "id": "ultrices-mattis-odio", - "title": "ultrices mattis odio", - "content": "Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.\n\nQuisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est. Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.\n\nVestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.\n\nIn congue. Etiam justo. Etiam pretium iaculis justo.\n\nIn hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/nate-rayfield.jpg", - "meta": { - "description": "Proin at turpis a pede posuere nonummy. Integer non velit.", - "published": "2017-05-10T13:57:35Z", - "author": "Nathan Greave" - } - }] -} diff --git a/static/api/post/ut-massa-quis-augue.json b/static/api/post/ut-massa-quis-augue.json deleted file mode 100644 index 1931932..0000000 --- a/static/api/post/ut-massa-quis-augue.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "results": [{ - "id": "ut-massa-quis-augue", - "title": "ut massa quis augue", - "content": "Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.\n\nCras mi pede, malesuada in, imperdiet et, commodo vulputate, justo. In blandit ultrices enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\n\nProin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.\n\nAenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum.\n\nCurabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.\n\nPhasellus sit amet erat. Nulla tempus. Vivamus in felis eu sapien cursus vestibulum.", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/tom-barrett.jpg", - "meta": { - "description": "Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat. Praesent blandit.", - "published": "2016-12-15T23:29:56Z", - "author": "Nathan Greave" - } - }] -} diff --git a/static/api/post/vivamus-tortor-duis-mattis.json b/static/api/post/vivamus-tortor-duis-mattis.json deleted file mode 100644 index c269150..0000000 --- a/static/api/post/vivamus-tortor-duis-mattis.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "results": [{ - "id": "vivamus-tortor-duis-mattis", - "title": "vivamus tortor duis mattis", - "content": "Sed ante. Vivamus tortor. Duis mattis egestas metus.\n\nAenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.\n\nQuisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est. Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.\n\nVestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.\n\nIn congue. Etiam justo. Etiam pretium iaculis justo.\n\nIn hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.\n\nNulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.", - "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/simone-hutsch.jpg", - "meta": { - "description": "Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.", - "published": "2017-05-27T00:05:26Z", - "author": "Tommi Filipson" - } - }] -} diff --git a/static/api/post/who-am-i.json b/static/api/post/who-am-i.json new file mode 100644 index 0000000..2f3f358 --- /dev/null +++ b/static/api/post/who-am-i.json @@ -0,0 +1,13 @@ +{ + "results": [{ + "id": "who-am-i", + "title": "Who am I", + "content": "I am a cloud enthousiast currently working at Osones! More coming soon.", + "image": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/450744/karl-magnuson.jpg", + "meta": { + "description": "Quick description of who I am and what I do for a living.", + "published": "2017-09-14T18:17:00Z", + "author": "Alexandre Kervadec" + } + }] +}