diff --git a/blog/2025-03-26-deploying-defang-with-defang-part-2.md b/blog/2025-03-26-deploying-defang-with-defang-part-2.md index 3a30d3da8..729ee35b8 100644 --- a/blog/2025-03-26-deploying-defang-with-defang-part-2.md +++ b/blog/2025-03-26-deploying-defang-with-defang-part-2.md @@ -45,14 +45,14 @@ Some things we had to change: ```yaml domainname: defang.io networks: - public: + default: aliases: - www.defang.io ``` One other hiccup was that we used to do www to non-www redirects using S3. There are a few ways to switch that up, but for the time being we decided to use Next.js middleware. -Pretty soon after that, the site was up and running in an AWS account—with TLS, DNS, and both the `www` and root domains automatically configured. Pretty straightfoward! +Pretty soon after that, the site was up and running in an AWS account—with TLS, DNS, and both the `www` and root domains automatically configured. Pretty straightfoward! --- diff --git a/docs/concepts/compose.md b/docs/concepts/compose.md index a09e17b00..ab8edb5ac 100644 --- a/docs/concepts/compose.md +++ b/docs/concepts/compose.md @@ -6,8 +6,8 @@ sidebar_position: 150 # Compose -Defang allows you to use `compose.yaml` files to deploy your application to the cloud. -The `compose.yaml` file is a simple way to define and run multi-container applications. +Defang allows you to use `compose.yaml` files to deploy your application to the cloud. +The `compose.yaml` file is a simple way to define and run multi-container applications. This file format may look familiar to you if you've used [Docker](https://docker.com). The [Compose Specification](https://github.com/compose-spec/compose-spec/blob/main/spec.md#compose-file) lets you define a platform-agnostic application designed as a set of containers which are configured to run together with shared resources. These applications may be destined for any [OCI](https://opencontainers.org/) Container Runtime. Defang does the heavy lifting to deploy to your favourite cloud platform using this file. @@ -19,20 +19,19 @@ You can create a `compose.yaml` file in the root of your project, or use the [`d When you run `defang compose up`, Defang will read your `compose.yaml` file and [deploy](./deployments.md) the services named in that file to the cloud. ## Example of a Compose File -Here is a basic `compose.yaml` file that contains all the required properties for deployment in Defang. +Here is a basic `compose.yaml` file that contains all the required properties for deployment in Defang. ```yaml services: service-example: image: nginx:latest # use one of: image (shown on this line) or build (shown below) - # build: + # build: # context: . # dockerfile: Dockerfile - ports: - - mode: ingress # specify ports to expose - target: 8080 - published: 8080 # this is useful for running locally - + ports: + - mode: ingress # specify ports to expose + target: 8080 + published: 8080 # this is useful for running locally ``` ## Compose Top-level Properties @@ -41,7 +40,7 @@ Here are a list of top-level properties of the [Compose specification](https://d ### `services` (Required) -The services defined in your application. +The services defined in your application. ```yaml services: @@ -49,18 +48,18 @@ services: # add service-level properties here ``` -:::info +:::info Defang identifies a service based on your username, project name, and the service name you've defined under the `services` property. See our [Services](/docs/concepts/services) page for more about how Defang resolves service names. ::: ### `networks` (Optional) -The networks defined in your application. This is commonly added together with a [service-level `networks`](#networks-1) property. +The networks defined in your application. This is commonly added together with a [service-level `networks`](#networks-1) property. ```yaml networks: - public: + default: # the "default" network is always created even if not specified ``` See our [Networking](/docs/concepts/networking) page for more. @@ -76,7 +75,7 @@ The volume mounts for a container, reusable across services. This feature is not ``` :::warning -Defang does not support the `secrets` top-level property. Please read our [Configuration](/docs/concepts/configuration) page for more. +Defang does not support the `secrets` top-level property. Please read our [Configuration](/docs/concepts/configuration) page for more. ::: ## Compose Service-level Properties @@ -86,14 +85,14 @@ Here are a list of service-level properties of the [Compose specification](https Service-level means inside your `service`. A service-level property called `build` would look like: ```yaml service: - build: ... + build: ... ``` Note that in your Compose file, you will need a top-level property called `services` to contain all of your services. For example: ```yaml services: - service: - build: ... + service: + build: ... ``` ::: @@ -103,9 +102,9 @@ services: The [build configuration](https://github.com/compose-spec/compose-spec/blob/main/build.md). This property describes how to create an OCI container for this service. ```yaml -build: - context: . - dockerfile: ./Dockerfile + build: + context: . + dockerfile: ./Dockerfile ``` ### `image` @@ -114,7 +113,7 @@ build: [This property](https://github.com/compose-spec/compose-spec/blob/main/05-services.md#image) describes the image from which your container should start. ```yaml -image: nginx:latest + image: nginx:latest ``` ### `ports` @@ -123,23 +122,23 @@ image: nginx:latest The ports to expose. The default port mode is `ingress`. ```yaml -ports: - - mode: ingress - target: 80 - published: 80 + ports: + - mode: ingress + target: 80 + published: 80 ``` :::info -Defang ignores `published` ports in production. As such, it is common to make `target` and `published` ports the same when using Defang. However, it can be useful to include a `published` port for local development, such as Docker. +Defang ignores `published` ports in production. As such, it is common to make `target` and `published` ports the same when using Defang. However, it can be useful to include a `published` port for local development, such as Docker. ::: ### `command` (Optional) -The command which will be run to start your service. If left out, the command from the Docker image will be used. +The command which will be run to start your service. If left out, the command from the Docker image will be used. ```yaml -command: nginx -g 'daemon off;' + command: nginx -g 'daemon off;' ``` ### `deploy` @@ -148,21 +147,21 @@ command: nginx -g 'daemon off;' The [Deploy Specification](https://github.com/compose-spec/compose-spec/blob/main/deploy.md) describes the runtime constraints and requirements for how your services will be deployed and managed across different environments (e.g. memory reservations, replicas, number of CPUs, etc.). ```yaml -deploy: - replicas: 1 - reservations: - cpus: '0.5' - memory: 256M + deploy: + replicas: 1 + reservations: + cpus: '0.5' + memory: 256M ``` ### `depends_on` (Not yet supported) -This property describes startup dependencies between services. This feature is currently unsupported by Defang, but can be useful in local developments such as Docker. +This property describes startup dependencies between services. This feature currently has limited supported by Defang, but can be useful in local development with Docker. ```yaml -# depends_on: -# - db + # depends_on: + # - db ``` ### `environment` @@ -170,12 +169,12 @@ This property describes startup dependencies between services. This feature is c The environment variables to set. ```yaml -environment: - DATABASE_USER: someuser + environment: + DATABASE_USER: someuser ``` :::info For sensitive environment variables (or secret values), you should list the variable's name with a blank or `null` value, and then securely set their actual value with `defang config` in the CLI. See our [Configuration page](/docs/concepts/configuration) for more. - + For example: ```yaml - DATABASE_USER=someuser # env var loaded with this literal value @@ -191,54 +190,55 @@ For sensitive environment variables (or secret values), you should list the vari When using Defang, your Compose file must have a healthcheck if you want to expose an `ingress` port—even if your Dockerfile already contains one. :::note -`curl` is commonly used for containers with an Ubuntu-based image, and `wget` is used for containers with an `alpine`-based image. +`curl` is commonly used for containers with an Ubuntu-based image, and `wget` is used for containers with an `alpine`-based image. ::: ```yaml -healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/"] - interval: 30s - timeout: 90s - retries: 3 + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8080/"] + interval: 30s + timeout: 90s + retries: 3 ``` or ```yaml -healthcheck: - test: ["CMD", "wget", "--spider", "http://localhost:8080/"] - interval: 30s - timeout: 90s - retries: 3 + healthcheck: + test: ["CMD", "wget", "--spider", "http://localhost:8080/"] + interval: 30s + timeout: 90s + retries: 3 ``` ### `networks` (Optional) -The network configuration. Can be `public`, where Defang will assign a public IP address, or `private`, in which Defang will not. To avoid warnings, add this to the [top-level `networks`](#networks) property as well. +The service network configuration. By default, Compose will add services to the `default` network, which has external connectivity. +You can also add services to private networks. To avoid warnings, you should add them to the [top-level `networks`](#networks) property as well. ```yaml -networks: - public: + networks: + default: # when not specified, services are assigned to the "default" network ``` You can also assign an alias for a network by using `aliases`, as seen below: ```yaml -networks: - public: - aliases: - - app + networks: + default: + aliases: + - app ``` - + See our [Networking](/docs/concepts/networking) page for more. - + ### `restart` (Optional, but highly recommended) -The restart mode for a container. Defaults to `unless-stopped` unless otherwise specified. +The restart mode for a container. Defaults to `unless-stopped` unless otherwise specified. ```yaml -restart: unless-stopped + restart: unless-stopped ``` ### `volumes` @@ -247,6 +247,6 @@ restart: unless-stopped The volume mounts for a container, specific to a service. This feature is not currently supported by Defang. ```yaml -# volumes: -# - "./backend:/app" + # volumes: + # - "./backend:/app" ``` diff --git a/docs/concepts/networking.mdx b/docs/concepts/networking.mdx index 6b3c5cd99..f609f42fe 100644 --- a/docs/concepts/networking.mdx +++ b/docs/concepts/networking.mdx @@ -1,5 +1,5 @@ --- -title: Networking +title: Networking description: Defang helps you safely configure your services' networking. sidebar_position: 300 --- @@ -8,43 +8,102 @@ import TabItem from '@theme/TabItem'; # Networking -Defang configures Security Groups, deploys applications to a private subnet and uses an Application Load Balancer to route traffic to your services from the public internet only when required. +By default, Defang configures your application's networking and security groups to follow secure best practices. +We also configure load-balancers and public IP addresses when appropriate. The following sections describe how to configure different network and security group topologies. :::tip -This page is about internal networking only. If you want to configure your services to be accessible from the public internet, check the [Domains page](./domains.mdx). +This page is about complex networking. If you want to configure your services to be accessible from the public internet, check the [Domains page](./domains.mdx). ::: -## Internal Communication +## Networks -You can expose ports in your service definition to allow other services to communicate with it. Similar to public communication, you can use the `ports` section of your service definition, but set the `mode` to `host` instead of `ingress` to allow other services to communicate with it through the internal network. +The Compose spec has a notion of [networks](https://github.com/compose-spec/compose-spec/blob/main/06-networks.md). By default, each service gets added to the `default` network. +Services in the `default` network can have public IPs. Services in any other network will be in a private subnet. +These services cannot be reached from outside the network, but they can still make network requests to the public internet. -### Sample Configuration +```yaml +services: + frontend: + build: ./fe + ports: + - 80 # load-balanced, ie. mode: ingress + networks: + default: + private: + + backend: + build: ./be + ports: + - mode: host # no load balancer + target: 8080 + networks: + private: + +networks: + default: + private: + internal: true # no egress +``` + +### Public Services + +By default, services will be in the `default` network. By default these services are not accessible directly, but may be accessed through a public load-balancer, ie. exposed ports default to `mode: ingress`: - - ```yaml services: - # [...] - service1: - ports: - - mode: host - target: 3000 - app_protocol: http + web: + networks: + default: # this is the default, so no need to specify + ports: + - 80:80 # Defang will use a public load-Balancer ``` - - -```typescript -const service = new defang.DefangService("service1", { - // [...] - ports: [{ - target: 3000, - mode: "host", - protocol: "http", - }], -}); + +If you want a service to have a public IP address, ensure it's in the `default` network (the default) and +set the port to `mode: host`: + +```yaml +services; + web: + ports: + - target: 80 + mode: host # Defang will assign a public IP +``` + +### Private Services +If you want a service with exposed ports to not be accessible from the public internet, create a private network: + +```yaml +services: + web: # this service can receive public traffic and communicate to private services + ports: + - 80 + networks: + default: + private: + db: # this service can only receive traffic from other services in the same network + ports: + - 1234 + networks: + private: +networks: + private: # any network that's not "default" is considered private +``` + +The service's hostname will be the same as the service's name, in this case `db`. + +## Hostname Aliases + +By using network aliases, a service can be made available at multiple hostnames. + +```yaml +services: + web: + domainname: example.com + networks: + default: + aliases: + - www.example.com # a public alias ``` - - ### Internal DNS @@ -57,10 +116,12 @@ Internal communication between services in the Defang Playground follows the fol ``` http://-: ``` + +The Defang CLI applies the `` prefix when it detects service names in the values of environment variables. Internal communication between services in Defang BYOC follows the following pattern: - + ``` http://: ```