Personal fork of the littlelink project
README.md

Docker for LittleLink #

Docker configuration to run LittleLink in a container.

File Structure #

  • Dockerfile: Defines how the image is built using nginx:alpine
  • compose.yaml: Configuration for Docker Compose with volumes for development
  • .dockerignore: Excludes unnecessary files from the image

Technical Details #

Base Image #

  • Uses nginx:alpine for minimal image size (~20MB)
  • Includes gzip compression for static files
  • Optimized cache configuration for CSS, JavaScript, and images
  • Configured to forward nginx logs to Docker log collector

Volumes and Ports #

  • Mounts the project root directory as a volume for live development
  • Exposes port 80 in the container, mapped to 8080 on the host

Common Use Cases #

One of the main advantages of this Docker setup is how easily you can create multiple personalized instances of LittleLink:

# Clone the repository
git clone https://github.com/sethcottle/littlelink.git littlelink-john

# Customize the content for John
cd littlelink-john
# Edit index.html with John's links, customize images, etc.

# Build a Docker image for John's page
docker build -f docker/Dockerfile -t littlelink-john .

# Run John's page on port 8080
docker run -d --name john-links -p 8080:80 littlelink-john

For additional pages:

# Similarly for another person
git clone https://github.com/sethcottle/littlelink.git littlelink-jane
cd littlelink-jane
# Customize for Jane...

# Build and run on a different port
docker build -f docker/Dockerfile -t littlelink-jane .
docker run -d --name jane-links -p 8081:80 littlelink-jane

This approach allows you to:

  • Maintain separate customized sites for different people
  • Run multiple instances on different ports
  • Update each site independently
  • Easily deploy to various environments

Development vs. Production #

There are two main ways to use Docker with LittleLink:

Development Workflow #

In development, we use Docker Compose with mounted volumes to allow for live editing:

# Start development environment
docker compose -f docker/compose.yaml up

This configuration:

  • Mounts local files as a volume, so changes are reflected immediately
  • Requires manual browser refresh to see changes
  • Is ideal for testing and development

Production Workflow #

For production, you have two options:

Option 1: Production with Docker Compose #

Create a production-specific docker-compose file:

# docker/compose.prod.yaml

services:
  web:
    image: yourname/littlelink:latest
    restart: always
    ports:
      - "8080:80"
    # Optional volume for customizable content
    volumes:
      - /path/on/server/custom-content:/usr/share/nginx/html

Deploy using:

# Build and tag the image
docker build -f docker/Dockerfile -t yourname/littlelink:latest .

# Run in production with compose
docker compose -f docker/compose.prod.yaml up -d

Option 2: Production with Docker Run #

# Build a production image
docker build -f docker/Dockerfile -t yourname/littlelink:latest .

# Run in production (no volumes mounted)
docker run -d --name littlelink -p 80:80 --restart always yourname/littlelink:latest

Using Volumes in Production #

You can customize the content in production by mounting a local directory:

# Prepare a directory with your custom content
mkdir -p /path/on/server/custom-content
cp -r index.html css/ images/ /path/on/server/custom-content/

# Run with the custom content mounted
docker run -d --name littlelink -p 80:80 \
  -v /path/on/server/custom-content:/usr/share/nginx/html \
  yourname/littlelink:latest

With Docker Compose:

services:
  web:
    image: yourname/littlelink:latest
    ports:
      - "80:80"
    volumes:
      - /path/on/server/custom-content:/usr/share/nginx/html

This approach:

  • Allows content customization without rebuilding the image
  • Makes it easy to update content independently of the container

Docker Commands Reference #

Development Commands #

# Start in development mode
docker compose -f docker/compose.yaml up

# Start in background
docker compose -f docker/compose.yaml up -d

# Stop container
docker compose -f docker/compose.yaml down

# View logs (including HTTP request logs)
docker compose -f docker/compose.yaml logs -f

Production Commands #

# Build production image
docker build -f docker/Dockerfile -t yourname/littlelink:latest .

# Run production container
docker run -d --name littlelink -p 80:80 yourname/littlelink:latest

# View logs for the running container
docker logs -f littlelink

Customization #

Change Port #

Edit docker/compose.yaml for development:

ports:
  - "8081:80"  # Change 8080 to desired port

Or specify port when running production container:

docker run -p 8081:80 yourname/littlelink:latest

Additional nginx Configuration #

To modify the nginx configuration, you can edit the Dockerfile and add your own configuration:

# Example: add custom configuration
COPY docker/nginx.conf /etc/nginx/conf.d/default.conf

Deploying to Production #

Docker on VPS #

# Pull image
docker pull yourname/littlelink:latest

# Run container
docker run -d --name littlelink -p 80:80 yourname/littlelink:latest

# With restart policy for auto-recovery
docker run -d --name littlelink --restart unless-stopped -p 80:80 yourname/littlelink:latest

Multiple Sites on One Server #

You can run multiple LittleLink instances on the same server:

# Run first site on port 8080
docker run -d --name site1 -p 8080:80 littlelink-site1

# Run second site on port 8081
docker run -d --name site2 -p 8081:80 littlelink-site2