Endless Ebook, One Click Away – Start Downloading at ebookname.
com
Bootstrapping Microservices Second Edition With
Docker Kubernetes GitHub Actions and Terraform
Ashley Davis
https://ebookname.com/product/bootstrapping-microservices-
second-edition-with-docker-kubernetes-github-actions-and-
terraform-ashley-davis/
OR CLICK HERE
DOWLOAD EBOOK
Browse and Get More Ebook Downloads Instantly at https://ebookname.com
Click here to visit ebookname.com and download ebook now
Instant digital products (PDF, ePub, MOBI) available
Download now and explore formats that suit you...
GitHub Actions in Action MEAP V03 Michael Kaufmann
https://ebookname.com/product/github-actions-in-action-
meap-v03-michael-kaufmann/
Ultimate Microservices with RabbitMQ 1st Edition Peter
Morlion
https://ebookname.com/product/ultimate-microservices-with-
rabbitmq-1st-edition-peter-morlion/
The Tao of Microservices Second Edition MEAP V02
Richard Rodger
https://ebookname.com/product/the-tao-of-microservices-second-
edition-meap-v02-richard-rodger/
■■■■ ■■■■ The Essentials of the Transmittance of the
Mind Annotated Bilingual Juxtaposed Edition Ven. Cheng
Kuan
https://ebookname.com/product/%e5%82%b3%e5%bf%83%e6%b3%95%e8%a6%8
1-%e8%8b%b1%e6%bc%a2%e5%b0%8d%e7%85%a7-the-essentials-of-the-
transmittance-of-the-mind-annotated-bilingual-juxtaposed-edition-
Pleasure of Thinking 2nd Edition Wang Xiaobo
https://ebookname.com/product/pleasure-of-thinking-2nd-edition-
wang-xiaobo/
Lectures on the History of Moral and Political
Philosophy Jonathan Wolff
https://ebookname.com/product/lectures-on-the-history-of-moral-
and-political-philosophy-jonathan-wolff/
The Official Ubuntu Book 7th Edition Matthew Helmke
https://ebookname.com/product/the-official-ubuntu-book-7th-
edition-matthew-helmke/
Radio Frequency and Microwave Communication Circuits
Analysis and Design 2nd Edition Devendra K. Misra
https://ebookname.com/product/radio-frequency-and-microwave-
communication-circuits-analysis-and-design-2nd-edition-devendra-
k-misra/
Disorders of the respiratory tract common challenges in
primary care 1st Edition Matthew L. Mintz
https://ebookname.com/product/disorders-of-the-respiratory-tract-
common-challenges-in-primary-care-1st-edition-matthew-l-mintz/
Biomedical Photonics Handbook Volume 1 2nd Edition Vo-
Dinh
https://ebookname.com/product/biomedical-photonics-handbook-
volume-1-2nd-edition-vo-dinh/
Ashley Davis
MANNING SECOND EDITION
Development computer Changes made to the
code on the development
Docker runtime computer automatically
example-2
History docker-compose.yml flow through to the
usr history container.
src Dockerfile-dev
app Dockerfile-prod
node_modules node_modules
... ...
package-lock.json package.json
package.json package-lock.json
The source code for the
src src history microservice on
index.js index.js the development
README.MD computer
tree.txt
video-streaming
Dockerfile-dev
The source code directory Dockerfile-prod
node_modules
for the history microservice ...
within the container package.json
package-lock.json
The source code is shared between src
the container and the host. index.js
videos
...
To enable live reload on a larger scale, we must synchronize the code between our development computer
and the container so that changes to the code automatically propagate through to the container.
Dockerfile for packaging
the microservice for
chapter-8-example-3
production deployment
Dockerfile-prod
package.json
The workflow
configuration file
.github for the continuous
workflows deployment pipeline
deploy.yaml
scripts Shell scripts to build,
build-image.sh publish, and deploy
delete.sh the microservice
deploy.sh
push-image.sh Kubernetes
deployment
kubernetes configuration for
deploy.yaml the microservice
src
Code for the The placeholder
index.js microservice video that is
served by the
videos
video-streaming
SampleVideo_1280x720_1mb.mp4
microservice
An overview of the project for example-3
Praise for the first edition
Best resource to learn how to make a clean deployment using Docker, Kubernetes, and Terraform. Follow the
project to learn the technology; use the book as a great technical resource.
—Becky Huett, Senior Developer at Maxar Technologies
A must-read for any software professional wanting to get a quick understanding of Microservices, Docker,
Kubernetes, GitHub Actions, and Terraform. It is a highly insightful book that is packed with references, even
for the most seasoned software professional.
—Christopher Forbes, Senior Manager Software Engineering at OneSpan
This book has been an excellent introduction to microservices with a clear and extensive project that walks
you through the implementation of microservices on many of the current technologies with succinct and rele-
vant explanations at every stage of the build. Highly recommend this warmly written and enjoyable book.
—Frankie Thomas-Hockey, Endpoint and Device Engineer, UK Civil Service
In case you get bogged down with the term “microservices” and don’t know where to start, then look no fur-
ther than this book. A valuable resource, whether you are a beginner or a pro, that provides lots of working
examples and best practices.
—Prashant Dwivedi, Technical Architect at NIC
Bootstrapping Microservices,
Second Edition
WITH DOCKER, KUBERNETES, GITHUB ACTIONS, AND TERRAFORM
ASHLEY DAVIS
MANNING
SHELTER ISLAND
For online information and ordering of this and other Manning books, please visit
www.manning.com. The publisher offers discounts on this book when ordered in quantity.
For more information, please contact
Special Sales Department
Manning Publications Co.
20 Baldwin Road
PO Box 761
Shelter Island, NY 11964
Email: [email protected]
©2024 by Manning Publications Co. All rights reserved.
No part of this publication may be reproduced, stored in a retrieval system, or transmitted, in
any form or by means electronic, mechanical, photocopying, or otherwise, without prior written
permission of the publisher.
Many of the designations used by manufacturers and sellers to distinguish their products are
claimed as trademarks. Where those designations appear in the book, and Manning
Publications was aware of a trademark claim, the designations have been printed in initial caps
or all caps.
Recognizing the importance of preserving what has been written, it is Manning’s policy to have
the books we publish printed on acid-free paper, and we exert our best efforts to that end.
Recognizing also our responsibility to conserve the resources of our planet, Manning books are
printed on paper that is at least 15 percent recycled and processed without the use of elemental
chlorine.
The author and publisher have made every effort to ensure that the information in this book
was correct at press time. The author and publisher do not assume and hereby disclaim any
liability to any party for any loss, damage, or disruption caused by errors or omissions, whether
such errors or omissions result from negligence, accident, or any other cause, or from any usage
of the information herein.
Manning Publications Co. Development editor: Elesha Hyde
20 Baldwin Road Technical editor: Scott Ling
PO Box 761 Review editors: Adriana Sabo and Dunja Nikitović
Shelter Island, NY 11964 Production editor: Andy Marinkovich
Copy editor: Julie McNamee
Proofreader: Katie Tennant
Technical proofreader: Thorsten P. Weber
Typesetter: Gordan Salinovic
Cover designer: Marija Tudor
ISBN 9781633438569
Printed in the United States of America
brief contents
1 ■ Why microservices? 1
2 ■ Creating your first microservice 26
3 ■ Publishing your first microservice 57
4 ■ Data management for microservices 89
5 ■ Communication between microservices 129
6 ■ The road to production 169
7 ■ Infrastructure as code 203
8 ■ Continuous deployment 232
9 ■ Automated testing for microservices 266
10 ■ Shipping FlixTube 306
11 ■ Healthy microservices 344
12 ■ Pathways to scalability 381
v
contents
preface xvi
acknowledgments xviii
about this book xix
about the author xxiv
about the cover illustration xxv
1 Why microservices?
1.1 This book is practical
1
2
1.2 What will you learn? 5
1.3 What do you need to know? 6
1.4 Managing complexity 6
1.5 What is a microservice? 8
1.6 What is a microservices application? 9
1.7 What’s wrong with the monolith? 10
1.8 Why are microservices popular now? 13
1.9 Benefits of microservices 13
1.10 Drawbacks of microservices 15
Higher-level technical skills 15 Building distributed applications
■
is hard 16 Microservices have scalable difficulty 16 People
■ ■
often fear complexity 16 Bringing the pain forward 17
■
vi
CONTENTS vii
1.11 Modern tooling for microservices 17
1.12 Not just microservices 18
1.13 The spectrum of possibilities 19
1.14 Designing a microservices application 20
Software design 20 Design principles 20 Domain-driven
■ ■
design 21 Don’t repeat yourself 22 How much to put in each
■ ■
microservice 22 Learning more about design 23
■
1.15 An example application 23
2 Creating your first microservice
2.1 New tools 27
26
2.2 Getting the code 28
2.3 Why Node.js? 28
2.4 Our philosophy of development 30
2.5 Establishing our single-service development environment 33
Installing Git 34 Cloning the code repository
■
35 ■
Getting VS
Code 36 Installing Node.js 36
■
2.6 Building an HTTP server for video streaming 37
Creating a Node.js project 38 Installing Express 41
■
Creating the Express boilerplate 43 Running our simple
■
web server 44 Adding streaming video 45 Configuring
■ ■
our microservice 47 Setting up for production 50 Live
■ ■
reloading for fast iteration 51 Running the finished code
■
from this chapter 54
2.7 Node.js review 55
2.8 Continue your learning 56
3 Publishing your first microservice
3.1 New tool: Docker 58
57
3.2 Getting the code 58
3.3 What is a container? 58
3.4 What is an image? 59
3.5 Why Docker? 60
3.6 Why do we need Docker? 61
3.7 Adding Docker to our development environment 62
Installing Docker 63 ■
Checking your Docker installation 63
viii CONTENTS
3.8 Packaging our microservice 64
Creating a Dockerfile 64 Packaging and checking our Docker
■
image 66 Booting our microservice in a container 69
■
Debugging the container 72 Stopping the container 73
■
3.9 Publishing our microservice 73
Creating a private container registry 74 Pushing our ■
microservice to the registry 79 Booting our microservice
■
from the registry 83 Deleting your container registry 85
■
3.10 Docker review 86
3.11 Continue your learning 88
4 Data management for microservices
4.1 New tools 90
89
4.2 Getting the code 91
4.3 Developing microservices with Docker Compose 91
Why Docker Compose? 92 Creating our Docker Compose file 93
■
Booting our microservices application 96 Working with the ■
application 98 Shutting down the application 99 Why
■ ■
Docker Compose for development, but not production? 100
4.4 Adding file storage to our application 101
Using Azure Storage 102 Updating the video-streaming
■
microservice 111 Adding our new microservice to the Docker
■
Compose file 112 Testing the updated application 114
■
Cloud storage vs. cluster storage 116 What did we ■
achieve? 116
4.5 Adding a database to our application 117
Why MongoDB? 118 Adding a database server in
■
development 119 Adding a database server in production
■
124
Database-per-microservice or database-per-application? 125
What did we achieve? 126
4.6 Docker Compose review 126
4.7 Continue your learning 127
5 Communication between microservices
5.1 New and familiar tools 130
129
5.2 Getting the code 130
5.3 Getting our microservices talking 131
CONTENTS ix
5.4 Introducing the history microservice 132
5.5 Live reload for fast iterations 133
Creating a stub for the history microservice 134 Augmenting ■
the microservice for live reload 135 Splitting our Dockerfile for
■
development and production 136 Updating the Docker Compose
■
file for live reload 139 Trying out live reload 140 Testing
■ ■
production mode in development 142 What have we ■
achieved? 143
5.6 Methods of communication for microservices 143
Direct messaging 143 ■
Indirect messaging 144
5.7 Direct messaging with HTTP 145
Why HTTP? 146 Directly targeting messages at particular
■
microservices 146 Sending a message with HTTP POST 147
■
Receiving a message with HTTP POST 148 Testing the updated ■
application 149 Orchestrating behavior with direct
■
messages 150 What have we achieved? 151
■
5.8 Indirect messaging with RabbitMQ 151
Why RabbitMQ? 152 Indirectly targeting messages to
■
microservices 152 Creating a RabbitMQ server 154
■
Investigating the RabbitMQ dashboard 154 Connecting ■
our microservice to the message queue 156 Single-recipient
■
indirect messaging 158 Multiple-recipient messages 161
■
Emergent behavior with indirect messages 164 What have ■
we achieved? 165
5.9 Microservices communication review 166
5.10 Continue your learning 166
6 The road to production 169
6.1 New tools 170
6.2 Getting the code 170
6.3 Going to production 170
6.4 Hosting microservices on Kubernetes 171
Why Kubernetes? 172 Pods, nodes, and containers
■
173
Pods, deployments, and services 174
6.5 Enabling your local Kubernetes instance 176
6.6 Installing the Kubernetes CLI 178
6.7 Project structure 178
x CONTENTS
6.8 Deploying to the local Kubernetes instance 179
Building the image for the microservice 179 No container registry ■
needed (yet) 180 Creating configuration for deployment to a local
■
Kubernetes instance 180 Connecting kubectl to local Kubernetes 183
■
Deploying a microservice to local Kubernetes 184 Testing the locally ■
deployed microservice 185 Deleting the deployment 185 Why not
■ ■
use local Kubernetes for development? 186 What have we achieved? 187 ■
6.9 Creating a managed Kubernetes cluster in Azure 187
6.10 Working with the Azure CLI 191
Installing the Azure CLI 191 Authenticating the Azure ■
CLI 191 Connecting kubectl to Kubernetes 192
■
6.11 Deploying to the production cluster 193
Now we need a container registry 193 Publishing the image to the ■
container registry 193 Connecting the container registry to the
■
Kubernetes cluster 194 Creating a configuration for deployment to
■
Kubernetes 195 Deploying the microservice to Kubernetes 196
■
Testing the deployed microservice 197 Deleting the deployment 198 ■
Destroying your infrastructure 199 What have we achieved? 199 ■
6.12 Azure CLI tool review 199
6.13 Kubectl review 200
6.14 Continue your learning 201
7 Infrastructure as code
7.1 New tool 204
203
7.2 Getting the code 204
7.3 Prototyping our infrastructure 204
7.4 Infrastructure as code 205
7.5 Authenticate with your Azure account 206
7.6 Which version of Kubernetes? 206
7.7 Creating the infrastructure with Terraform 207
Why Terraform? 208 ■
Installing Terraform 208
Terraform project setup 209
7.8 Creating an Azure resource group for your application 210
Evolutionary architecture with Terraform 210 Scripting infrastructure ■
creation 211 Fixing provider version numbers 212 Initializing
■ ■
Terraform 212 By-products of Terraform initialization 213
■
Building your infrastructure 214 Understanding Terraform ■
state 215 Destroying and recreating our infrastructure 218
■
What have we achieved? 219
CONTENTS xi
7.9 Creating our container registry 220
Continuing the evolution of our infrastructure 220 Creating the ■
container registry 220 Terraform outputs 221 Outputting
■ ■
sensitive values from Terraform 222 Just don’t output sensitive
■
values 223 Getting the details of your container registry 223
■
What have we achieved? 223
7.10 Refactoring to share configuration data 224
Continuing the evolution of our infrastructure 224 ■
Introducing
Terraform variables 224
7.11 Creating our Kubernetes cluster 225
Scripting creation of your cluster 225 Attaching the registry to the
■
cluster 226 Building our cluster 226 What have we
■ ■
achieved? 227
7.12 Deploying to our cluster 228
7.13 Destroying our infrastructure 229
7.14 Terraform review 229
7.15 Continue your learning 230
8 Continuous deployment
8.1 New tool 233
232
8.2 Getting the code 233
8.3 Running the examples in this chapter 233
8.4 What is continuous integration? 235
8.5 What is continuous deployment? 236
8.6 Why automate deployment? 238
8.7 An introduction to automation with GitHub Actions 239
Why GitHub Actions? 239 What is a workflow? 239
■
Creating a new workflow 240 Example 1 overview 242
■
The “Hello World” shell script 242 The “Hello World”
■
workflow 243 Invoking commands inline 243
■
Triggering a workflow by code change 244 Workflow ■
history 245 Triggering a workflow through the UI 246
■
What have we achieved? 247
8.8 Implementing continuous integration 247
Example 2 overview 247 A workflow for automated tests
■
248
What have we achieved? 249
xii CONTENTS
8.9 Continuous deployment for a microservice 249
Example 3 overview 249 Templating our deployment ■
configuration 250 Manual deployment precedes automated
■
deployment 252 A workflow to deploy our microservice 255
■
Authenticating kubectl 257 Installing and configuring ■
kubectl 258 Environment variables from GitHub secrets 258
■
Environment variables from GitHub context variables 259
Adding GitHub secrets 259 Debugging your deployment ■
pipeline 262 Deploying directly to production is
■
dangerous 263 What have we achieved? 264
■
8.10 Continue your learning 264
9 Automated testing for microservices
9.1 New tools 267
266
9.2 Getting the code 267
9.3 Testing for microservices 268
9.4 Automated testing 268
9.5 Automated testing with Jest 270
Why Jest? 271 Setting up Jest 271 The math library to
■ ■
test 273 Our first Jest test 273 Running our first test 274
■ ■
Live reload with Jest 275 Interpreting test failures 275
■
Invoking Jest with npm 277 Populating our test suite 277 ■
Mocking with Jest 279 What have we achieved? 280■
9.6 Unit testing for microservices 280
The metadata microservice 282 Creating unit tests with Jest ■
283
Running the tests 286 What have we achieved? 286■
9.7 Integration testing 286
The code to test 287 Running a MongoDB database 287
■
Loading database fixtures 288 Creating an integration test with ■
Jest 289 Running the test 291 What have we
■ ■
achieved? 291
9.8 End-to-end testing 292
Why Playwright? 293 Installing Playwright 293 Setting up
■ ■
database fixtures 295 Booting your application 297
■
Creating an end-to-end test with Playwright 298 Invoking ■
Playwright with npm 301 What have we achieved? 301 ■
9.9 Automated testing in the CI/CD pipeline 302
9.10 Review of testing 303
9.11 Continue your learning 303
CONTENTS xiii
10 Shipping FlixTube
10.1 No new tools!
306
307
10.2 Getting the code 307
10.3 Revisiting essential skills 308
10.4 Overview of FlixTube 309
FlixTube microservices 309 Microservice project structure
■
310
The FlixTube monorepo 310
10.5 Running FlixTube in development 312
Booting an individual microservice 312 ■
Booting the entire
FlixTube application 314
10.6 Testing FlixTube in development 315
Testing a microservice with Jest 315 ■
Testing the application
with Playwright 316
10.7 FlixTube deep dive 317
Database fixtures 317 Mocking the storage microservice
■
319
The gateway 322 The FlixTube UI 324 Video
■ ■
streaming 326 Video upload 328
■
10.8 Deploying FlixTube to our local Kubernetes 332
Prerequisites for local deployment 333 Local deployment 333 ■
Testing the local deployment 334 Deleting the local deployment
■
334
10.9 Manually deploying FlixTube to production 334
Prerequisites for production deployment 335 Production ■
deployment 336 Testing the production deployment 336
■
Destroying the production deployment 337
10.10 Continuous deployment to production 337
Prerequisites for continuous deployment 338 Setting up your own ■
code repository 338 Deploying infrastructure 338 One CD
■ ■
pipeline per microservice 339 Testing the CD pipeline 340
■
10.11 FlixTube in the future 340
10.12 Continue your learning 341
11 Healthy microservices
11.1
344
Maintaining healthy microservices 345
11.2 Monitoring and managing microservices 346
Logging in development 347 Error handling 348 Logging
■ ■
with Docker Compose 351 Basic logging with Kubernetes 352
■
Kubernetes log aggregation 355 Enterprise logging, monitoring,
■
and alerts 356 Observability for microservices 357
■
Automatic restarts with Kubernetes health checks 358
xiv CONTENTS
11.3 Debugging microservices 361
The debugging process 361 ■
Debugging production
microservices 366
11.4 Reliability and recovery 370
Practicing defensive programming 370 Practicing defensive ■
testing 370 Protecting our data 370 Replication and
■ ■
redundancy 371 Fault isolation and graceful degradation 373
■
Simple techniques for fault tolerance 374 Advanced techniques for ■
fault tolerance 377
11.5 Continue your learning 379
12 Pathways to scalability
12.1 Our future is scalable
381
382
12.2 Scaling the development process 382
Multiple teams 383 Independent code repositories 384
■
Splitting the code repository 387 The meta-repo 388 ■
Creating multiple environments 389 Production ■
workflow 391 Separating application configuration
■
from microservices configuration 393
12.3 Scaling performance 394
Vertically scaling the cluster 395 Horizontally scaling the■
cluster 397 Horizontally scaling an individual
■
microservice 398 Elastic scaling for the cluster 399
■
Elastic scaling for an individual microservice 400 Scaling ■
the database 400 Don’t scale too early 402
■
12.4 Mitigating problems caused by changes 403
Automated testing and deployment 403 ■
Branch protection 404
Deploying to our test environment 404 ■
Rolling updates 404
Blue-green deployments 405
12.5 Basic security 407
Trust models 408 ■
Sensitive configuration 409
12.6 Refactoring to microservices 410
Do you really need microservices? 410 Plan your conversion and ■
involve everyone 411 Know your legacy code 411 Improve
■ ■
your automation 411 Build your microservices platform 412
■
Carve along natural seams 412 Prioritize the extraction 413
■
And repeat . . . 413
12.7 The spectrum of possibilities 414
It doesn’t have to be perfect 414 The diminishing return on
■
investment 415 The hybrid approach 416
■
Another Random Scribd Document
with Unrelated Content
THE LOVELY CHILD
Lilies are both pure and fair,
Growing ’midst the roses there—
Roses, too, both red and pink,
Are quite beautiful, I think.
But of all bright blossoms—best—
Purest—fairest—loveliest,—
Could there be a sweeter thing
Than a primrose, blossoming?
THE YELLOWBIRD
Hey! my little Yellowbird,
What you doing there?
Like a flashing sun-ray,
Flitting everywhere:
Dangling down the tall weeds
And the hollyhocks,
And the lordly sunflowers
Along the garden-walks.
Ho! my gallant Golden-bill,
Pecking ’mongst the weeds,
You must have for breakfast
Golden flower-seeds:
Won’t you tell a little fellow
What you have for tea?—
’Spect a peck o’ yellow, mellow
Pippin on the tree.
ENVOY
When but a little boy, it seemed
My dearest rapture ran
In fancy ever, when I dreamed
I was a man—a man!
Now—sad perversity!—my theme
Of rarest, purest joy
Is when, in fancy blest, I dream
I am a little boy.
*** END OF THE PROJECT GUTENBERG EBOOK ARMAZINDY ***
Updated editions will replace the previous one—the old editions
will be renamed.
Creating the works from print editions not protected by U.S.
copyright law means that no one owns a United States
copyright in these works, so the Foundation (and you!) can copy
and distribute it in the United States without permission and
without paying copyright royalties. Special rules, set forth in the
General Terms of Use part of this license, apply to copying and
distributing Project Gutenberg™ electronic works to protect the
PROJECT GUTENBERG™ concept and trademark. Project
Gutenberg is a registered trademark, and may not be used if
you charge for an eBook, except by following the terms of the
trademark license, including paying royalties for use of the
Project Gutenberg trademark. If you do not charge anything for
copies of this eBook, complying with the trademark license is
very easy. You may use this eBook for nearly any purpose such
as creation of derivative works, reports, performances and
research. Project Gutenberg eBooks may be modified and
printed and given away—you may do practically ANYTHING in
the United States with eBooks not protected by U.S. copyright
law. Redistribution is subject to the trademark license, especially
commercial redistribution.
START: FULL LICENSE
THE FULL PROJECT GUTENBERG LICENSE
PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK
To protect the Project Gutenberg™ mission of promoting the
free distribution of electronic works, by using or distributing this
work (or any other work associated in any way with the phrase
“Project Gutenberg”), you agree to comply with all the terms of
the Full Project Gutenberg™ License available with this file or
online at www.gutenberg.org/license.
Section 1. General Terms of Use and
Redistributing Project Gutenberg™
electronic works
1.A. By reading or using any part of this Project Gutenberg™
electronic work, you indicate that you have read, understand,
agree to and accept all the terms of this license and intellectual
property (trademark/copyright) agreement. If you do not agree
to abide by all the terms of this agreement, you must cease
using and return or destroy all copies of Project Gutenberg™
electronic works in your possession. If you paid a fee for
obtaining a copy of or access to a Project Gutenberg™
electronic work and you do not agree to be bound by the terms
of this agreement, you may obtain a refund from the person or
entity to whom you paid the fee as set forth in paragraph 1.E.8.
1.B. “Project Gutenberg” is a registered trademark. It may only
be used on or associated in any way with an electronic work by
people who agree to be bound by the terms of this agreement.
There are a few things that you can do with most Project
Gutenberg™ electronic works even without complying with the
full terms of this agreement. See paragraph 1.C below. There
are a lot of things you can do with Project Gutenberg™
electronic works if you follow the terms of this agreement and
help preserve free future access to Project Gutenberg™
electronic works. See paragraph 1.E below.
1.C. The Project Gutenberg Literary Archive Foundation (“the
Foundation” or PGLAF), owns a compilation copyright in the
collection of Project Gutenberg™ electronic works. Nearly all the
individual works in the collection are in the public domain in the
United States. If an individual work is unprotected by copyright
law in the United States and you are located in the United
States, we do not claim a right to prevent you from copying,
distributing, performing, displaying or creating derivative works
based on the work as long as all references to Project
Gutenberg are removed. Of course, we hope that you will
support the Project Gutenberg™ mission of promoting free
access to electronic works by freely sharing Project Gutenberg™
works in compliance with the terms of this agreement for
keeping the Project Gutenberg™ name associated with the
work. You can easily comply with the terms of this agreement
by keeping this work in the same format with its attached full
Project Gutenberg™ License when you share it without charge
with others.
1.D. The copyright laws of the place where you are located also
govern what you can do with this work. Copyright laws in most
countries are in a constant state of change. If you are outside
the United States, check the laws of your country in addition to
the terms of this agreement before downloading, copying,
displaying, performing, distributing or creating derivative works
based on this work or any other Project Gutenberg™ work. The
Foundation makes no representations concerning the copyright
status of any work in any country other than the United States.
1.E. Unless you have removed all references to Project
Gutenberg:
1.E.1. The following sentence, with active links to, or other
immediate access to, the full Project Gutenberg™ License must
appear prominently whenever any copy of a Project
Gutenberg™ work (any work on which the phrase “Project
Gutenberg” appears, or with which the phrase “Project
Gutenberg” is associated) is accessed, displayed, performed,
viewed, copied or distributed:
This eBook is for the use of anyone anywhere in the United
States and most other parts of the world at no cost and
with almost no restrictions whatsoever. You may copy it,
give it away or re-use it under the terms of the Project
Gutenberg License included with this eBook or online at
www.gutenberg.org. If you are not located in the United
States, you will have to check the laws of the country
where you are located before using this eBook.
1.E.2. If an individual Project Gutenberg™ electronic work is
derived from texts not protected by U.S. copyright law (does not
contain a notice indicating that it is posted with permission of
the copyright holder), the work can be copied and distributed to
anyone in the United States without paying any fees or charges.
If you are redistributing or providing access to a work with the
phrase “Project Gutenberg” associated with or appearing on the
work, you must comply either with the requirements of
paragraphs 1.E.1 through 1.E.7 or obtain permission for the use
of the work and the Project Gutenberg™ trademark as set forth
in paragraphs 1.E.8 or 1.E.9.
1.E.3. If an individual Project Gutenberg™ electronic work is
posted with the permission of the copyright holder, your use and
distribution must comply with both paragraphs 1.E.1 through
1.E.7 and any additional terms imposed by the copyright holder.
Additional terms will be linked to the Project Gutenberg™
License for all works posted with the permission of the copyright
holder found at the beginning of this work.
1.E.4. Do not unlink or detach or remove the full Project
Gutenberg™ License terms from this work, or any files
containing a part of this work or any other work associated with
Project Gutenberg™.
1.E.5. Do not copy, display, perform, distribute or redistribute
this electronic work, or any part of this electronic work, without
prominently displaying the sentence set forth in paragraph 1.E.1
with active links or immediate access to the full terms of the
Project Gutenberg™ License.
1.E.6. You may convert to and distribute this work in any binary,
compressed, marked up, nonproprietary or proprietary form,
including any word processing or hypertext form. However, if
you provide access to or distribute copies of a Project
Gutenberg™ work in a format other than “Plain Vanilla ASCII” or
other format used in the official version posted on the official
Project Gutenberg™ website (www.gutenberg.org), you must,
at no additional cost, fee or expense to the user, provide a copy,
a means of exporting a copy, or a means of obtaining a copy
upon request, of the work in its original “Plain Vanilla ASCII” or
other form. Any alternate format must include the full Project
Gutenberg™ License as specified in paragraph 1.E.1.
1.E.7. Do not charge a fee for access to, viewing, displaying,
performing, copying or distributing any Project Gutenberg™
works unless you comply with paragraph 1.E.8 or 1.E.9.
1.E.8. You may charge a reasonable fee for copies of or
providing access to or distributing Project Gutenberg™
electronic works provided that:
• You pay a royalty fee of 20% of the gross profits you derive
from the use of Project Gutenberg™ works calculated using the
method you already use to calculate your applicable taxes. The
fee is owed to the owner of the Project Gutenberg™ trademark,
but he has agreed to donate royalties under this paragraph to
the Project Gutenberg Literary Archive Foundation. Royalty
payments must be paid within 60 days following each date on
which you prepare (or are legally required to prepare) your
periodic tax returns. Royalty payments should be clearly marked
as such and sent to the Project Gutenberg Literary Archive
Foundation at the address specified in Section 4, “Information
about donations to the Project Gutenberg Literary Archive
Foundation.”
• You provide a full refund of any money paid by a user who
notifies you in writing (or by e-mail) within 30 days of receipt
that s/he does not agree to the terms of the full Project
Gutenberg™ License. You must require such a user to return or
destroy all copies of the works possessed in a physical medium
and discontinue all use of and all access to other copies of
Project Gutenberg™ works.
• You provide, in accordance with paragraph 1.F.3, a full refund of
any money paid for a work or a replacement copy, if a defect in
the electronic work is discovered and reported to you within 90
days of receipt of the work.
• You comply with all other terms of this agreement for free
distribution of Project Gutenberg™ works.
1.E.9. If you wish to charge a fee or distribute a Project
Gutenberg™ electronic work or group of works on different
terms than are set forth in this agreement, you must obtain
permission in writing from the Project Gutenberg Literary
Archive Foundation, the manager of the Project Gutenberg™
trademark. Contact the Foundation as set forth in Section 3
below.
1.F.
1.F.1. Project Gutenberg volunteers and employees expend
considerable effort to identify, do copyright research on,
transcribe and proofread works not protected by U.S. copyright
law in creating the Project Gutenberg™ collection. Despite these
efforts, Project Gutenberg™ electronic works, and the medium
on which they may be stored, may contain “Defects,” such as,
but not limited to, incomplete, inaccurate or corrupt data,
transcription errors, a copyright or other intellectual property
infringement, a defective or damaged disk or other medium, a
computer virus, or computer codes that damage or cannot be
read by your equipment.
1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except
for the “Right of Replacement or Refund” described in
paragraph 1.F.3, the Project Gutenberg Literary Archive
Foundation, the owner of the Project Gutenberg™ trademark,
and any other party distributing a Project Gutenberg™ electronic
work under this agreement, disclaim all liability to you for
damages, costs and expenses, including legal fees. YOU AGREE
THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT
LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT
EXCEPT THOSE PROVIDED IN PARAGRAPH 1.F.3. YOU AGREE
THAT THE FOUNDATION, THE TRADEMARK OWNER, AND ANY
DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE LIABLE
TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL,
PUNITIVE OR INCIDENTAL DAMAGES EVEN IF YOU GIVE
NOTICE OF THE POSSIBILITY OF SUCH DAMAGE.
1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you
discover a defect in this electronic work within 90 days of
receiving it, you can receive a refund of the money (if any) you
paid for it by sending a written explanation to the person you
received the work from. If you received the work on a physical
medium, you must return the medium with your written
explanation. The person or entity that provided you with the
defective work may elect to provide a replacement copy in lieu
of a refund. If you received the work electronically, the person
or entity providing it to you may choose to give you a second
opportunity to receive the work electronically in lieu of a refund.
If the second copy is also defective, you may demand a refund
in writing without further opportunities to fix the problem.
1.F.4. Except for the limited right of replacement or refund set
forth in paragraph 1.F.3, this work is provided to you ‘AS-IS’,
WITH NO OTHER WARRANTIES OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
MERCHANTABILITY OR FITNESS FOR ANY PURPOSE.
1.F.5. Some states do not allow disclaimers of certain implied
warranties or the exclusion or limitation of certain types of
damages. If any disclaimer or limitation set forth in this
agreement violates the law of the state applicable to this
agreement, the agreement shall be interpreted to make the
maximum disclaimer or limitation permitted by the applicable
state law. The invalidity or unenforceability of any provision of
this agreement shall not void the remaining provisions.
1.F.6. INDEMNITY - You agree to indemnify and hold the
Foundation, the trademark owner, any agent or employee of the
Foundation, anyone providing copies of Project Gutenberg™
electronic works in accordance with this agreement, and any
volunteers associated with the production, promotion and
distribution of Project Gutenberg™ electronic works, harmless
from all liability, costs and expenses, including legal fees, that
arise directly or indirectly from any of the following which you
do or cause to occur: (a) distribution of this or any Project
Gutenberg™ work, (b) alteration, modification, or additions or
deletions to any Project Gutenberg™ work, and (c) any Defect
you cause.
Section 2. Information about the Mission
of Project Gutenberg™
Project Gutenberg™ is synonymous with the free distribution of
electronic works in formats readable by the widest variety of
computers including obsolete, old, middle-aged and new
computers. It exists because of the efforts of hundreds of
volunteers and donations from people in all walks of life.
Volunteers and financial support to provide volunteers with the
assistance they need are critical to reaching Project
Gutenberg™’s goals and ensuring that the Project Gutenberg™
collection will remain freely available for generations to come. In
2001, the Project Gutenberg Literary Archive Foundation was
created to provide a secure and permanent future for Project
Gutenberg™ and future generations. To learn more about the
Project Gutenberg Literary Archive Foundation and how your
efforts and donations can help, see Sections 3 and 4 and the
Foundation information page at www.gutenberg.org.
Section 3. Information about the Project
Gutenberg Literary Archive Foundation
The Project Gutenberg Literary Archive Foundation is a non-
profit 501(c)(3) educational corporation organized under the
laws of the state of Mississippi and granted tax exempt status
by the Internal Revenue Service. The Foundation’s EIN or
federal tax identification number is 64-6221541. Contributions
to the Project Gutenberg Literary Archive Foundation are tax
deductible to the full extent permitted by U.S. federal laws and
your state’s laws.
The Foundation’s business office is located at 809 North 1500
West, Salt Lake City, UT 84116, (801) 596-1887. Email contact
links and up to date contact information can be found at the
Foundation’s website and official page at
www.gutenberg.org/contact
Section 4. Information about Donations to
the Project Gutenberg Literary Archive
Foundation
Project Gutenberg™ depends upon and cannot survive without
widespread public support and donations to carry out its mission
of increasing the number of public domain and licensed works
that can be freely distributed in machine-readable form
accessible by the widest array of equipment including outdated
equipment. Many small donations ($1 to $5,000) are particularly
important to maintaining tax exempt status with the IRS.
The Foundation is committed to complying with the laws
regulating charities and charitable donations in all 50 states of
the United States. Compliance requirements are not uniform
and it takes a considerable effort, much paperwork and many
fees to meet and keep up with these requirements. We do not
solicit donations in locations where we have not received written
confirmation of compliance. To SEND DONATIONS or determine
the status of compliance for any particular state visit
www.gutenberg.org/donate.
While we cannot and do not solicit contributions from states
where we have not met the solicitation requirements, we know
of no prohibition against accepting unsolicited donations from
donors in such states who approach us with offers to donate.
International donations are gratefully accepted, but we cannot
make any statements concerning tax treatment of donations
received from outside the United States. U.S. laws alone swamp
our small staff.
Please check the Project Gutenberg web pages for current
donation methods and addresses. Donations are accepted in a
number of other ways including checks, online payments and
credit card donations. To donate, please visit:
www.gutenberg.org/donate.
Section 5. General Information About
Project Gutenberg™ electronic works
Professor Michael S. Hart was the originator of the Project
Gutenberg™ concept of a library of electronic works that could
be freely shared with anyone. For forty years, he produced and
distributed Project Gutenberg™ eBooks with only a loose
network of volunteer support.
Project Gutenberg™ eBooks are often created from several
printed editions, all of which are confirmed as not protected by
copyright in the U.S. unless a copyright notice is included. Thus,
we do not necessarily keep eBooks in compliance with any
particular paper edition.
Most people start at our website which has the main PG search
facility: www.gutenberg.org.
This website includes information about Project Gutenberg™,
including how to make donations to the Project Gutenberg
Literary Archive Foundation, how to help produce our new
eBooks, and how to subscribe to our email newsletter to hear
about new eBooks.
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade
Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.
Let us accompany you on the journey of exploring knowledge and
personal growth!
ebookname.com