I am using DDEV as my local hosting environment, and many of my projects implement front end automation via Gulp. Browsersync is a major component to our front end set-up, and requires ports to be exposed by the DDEV container to the host machine. The problem at hand is two fold, what is the best way to expose a port to the host machine from the container, and what is the best set-up for a Browser-Sync Gulp task in a DDEV environment?
Edit 2024-08-20: Most people use the excellent ddev-browsersync add-on these days to work with Browsersync, and skip all of the below.
They also normally use the web_extra_exposed_ports
feature of DDEV instead of fiddling with HTTPS_EXPOSE.
(Original answer follows)
Part one of this situation requires using a Docker Compose file to expose your container's port to the hose machine. Based on this Answer you need to create a docker-compose.browsersync.yaml
file in your .ddev
directory.
An example of that file for Browser-Sync would be as follows:
# Override the web container's standard HTTP_EXPOSE and HTTPS_EXPOSE
# This is to expose the browsersync port.
services:
web:
# ports are a list of exposed *container* ports
expose:
- '3000'
environment:
- HTTP_EXPOSE=${DDEV_ROUTER_HTTP_PORT}:80,${DDEV_MAILHOG_PORT}:8025,3001:3000
- HTTPS_EXPOSE=${DDEV_ROUTER_HTTPS_PORT}:80,${DDEV_MAILHOG_HTTPS_PORT}:8025,3000:3000
We expose Port 3000 here because it is the default for Browser-Sync, but could be updated to reflect the needs of your projects.
Note: After adding this file to your .ddev
directory you should restart your ddev project.
For more information on defining new services with docker compose, read the DDEV docs.
This assumes you have a working gulpfile.js
ready to do with your other required packages included already. If you're not fully familiar with Browser-Sync and Gulp, please refer to their docs for full details.
const browserSync = require('browser-sync').create();
/*
* Set 'url' (the host and proxy hostnames) to match the canonical url of your ddev project.
* Do not include the http/s protocol in the url. The ddev-router will route the
* host machine's request to the appropriate protocol.
*
* ex: yoursite.ddev.site
*/
const url = 'yoursite.ddev.site';
/*
* This function only includes the most basic browser-sync settings needed
* to get a watch server running. Please refer to the browser-sync docs for other
* available options.
*/
const startServer = function (done) {
// Initialize BrowserSync
browserSync.init({
proxy: url,
host: url,
port: 3000,
});
done();
};
exports.startServer = startServer;
You can test this using gulp startServer
after initial set-up. Gulp will output a http
as the External URL for testing. However thanks to the ddev-router it can be accessed via http
or https
.