docs: update README with Docker examples and Cloudflare HTTPS note
- Replace podman with docker in all example commands - Add note that podman works as drop-in replacement - Document HTTPS architecture (Cloudflare proxy → Gordon HTTP) - Clarify Cloudflare is required for HTTPS (no Let's Encrypt yet) - Update setup guide header to mention Docker compatibility
- commit
- 87f65150cfa8ab5bef5a34ee6c838bbb8bd1f25e
- author
- brice · · 2026-01-12 20:46 UTC
- committer
- brice · · 2026-01-12 20:48 UTC
- parent
- d7f7c17
- signature
- unsigned
1 file · +27 -22
M README.md +27 -22
| @@ -33,17 +33,19 @@ Gordon is a lightweight deployment system that turns any VPS into a container ho | |||
| 33 | 33 | ## How It Works | |
| 34 | 34 | ||
| 35 | 35 | ```bash | |
| 36 | - | # 1. Build & test locally | |
| 37 | - | podman build -t myapp . | |
| 38 | - | podman run -p 8080:8080 myapp # Works? Great! | |
| 36 | + | # 1. Build & test locally (Docker or Podman) | |
| 37 | + | docker build -t myapp . | |
| 38 | + | docker run -p 8080:8080 myapp # Works? Great! | |
| 39 | 39 | ||
| 40 | 40 | # 2. Push to deploy | |
| 41 | - | podman tag myapp registry.mydomain.com/myapp:latest | |
| 42 | - | podman push registry.mydomain.com/myapp:latest | |
| 41 | + | docker tag myapp registry.mydomain.com/myapp:latest | |
| 42 | + | docker push registry.mydomain.com/myapp:latest | |
| 43 | 43 | ||
| 44 | 44 | # 3. That's it. Gordon handles the rest. | |
| 45 | 45 | ``` | |
| 46 | 46 | ||
| 47 | + | > **Note:** All examples use `docker` commands, but `podman` works as a drop-in replacement. Just substitute `docker` with `podman` in any command. | |
| 48 | + | ||
| 47 | 49 | **Your machine is the build server. If it runs locally, it runs in production.** | |
| 48 | 50 | ||
| 49 | 51 | ## Quick Start (5 minutes) | |
| @@ -51,7 +53,9 @@ podman push registry.mydomain.com/myapp:latest | |||
| 51 | 53 | ### Prerequisites | |
| 52 | 54 | - Ubuntu/Debian VPS with root access | |
| 53 | 55 | - Domain pointing to your VPS | |
| 54 | - | - Cloudflare account (free tier works) | |
| 56 | + | - Cloudflare account (free tier works) - **Required for HTTPS** | |
| 57 | + | ||
| 58 | + | > **HTTPS Architecture:** Cloudflare terminates HTTPS and proxies to Gordon over HTTP internally. Gordon doesn't handle TLS certificates directly (no Let's Encrypt support yet). | |
| 55 | 59 | ||
| 56 | 60 | ### Installation | |
| 57 | 61 | ||
| @@ -79,13 +83,13 @@ Your dev machine likely has 8-16 cores and 16-32GB RAM. Your VPS has 1-2 cores a | |||
| 79 | 83 | ### Push-to-Deploy Workflow | |
| 80 | 84 | ```bash | |
| 81 | 85 | # Initial deployment | |
| 82 | - | podman build -t myapp . | |
| 83 | - | podman push registry.mydomain.com/myapp:latest | |
| 86 | + | docker build -t myapp . | |
| 87 | + | docker push registry.mydomain.com/myapp:latest | |
| 84 | 88 | # Visit https://app.mydomain.com | |
| 85 | 89 | ||
| 86 | 90 | # Update deployment | |
| 87 | - | podman build -t myapp . | |
| 88 | - | podman push registry.mydomain.com/myapp:latest | |
| 91 | + | docker build -t myapp . | |
| 92 | + | docker push registry.mydomain.com/myapp:latest | |
| 89 | 93 | # Zero-downtime update applied automatically | |
| 90 | 94 | ``` | |
| 91 | 95 | ||
| @@ -151,8 +155,9 @@ password = "your-secure-password" | |||
| 151 | 155 | ||
| 152 | 156 | See [examples/](examples/) for advanced configurations including network groups and more. | |
| 153 | 157 | ||
| 154 | - | ## Detailed Setup Guide (Using podman in rootless mode) | |
| 155 | - | Note: Refer to Quick Start for the binary installation. | |
| 158 | + | ## Detailed Setup Guide (Podman Rootless Mode) | |
| 159 | + | ||
| 160 | + | > **Note:** This guide uses Podman in rootless mode for enhanced security. Docker users can follow similar steps - Gordon works with any OCI-compatible runtime. Refer to Quick Start for the binary installation. | |
| 156 | 161 | ||
| 157 | 162 | ### 1. VPS Preparation | |
| 158 | 163 | ```bash | |
| @@ -235,14 +240,14 @@ systemctl --user status gordon | |||
| 235 | 240 | ### Simple Deployment | |
| 236 | 241 | ```bash | |
| 237 | 242 | # Build locally | |
| 238 | - | podman build -t myapp . | |
| 243 | + | docker build -t myapp . | |
| 239 | 244 | ||
| 240 | 245 | # Test locally | |
| 241 | - | podman run -p 8080:8080 myapp | |
| 246 | + | docker run -p 8080:8080 myapp | |
| 242 | 247 | ||
| 243 | 248 | # Push to registry | |
| 244 | - | podman tag myapp registry.mydomain.com/myapp:latest | |
| 245 | - | podman push registry.mydomain.com/myapp:latest | |
| 249 | + | docker tag myapp registry.mydomain.com/myapp:latest | |
| 250 | + | docker push registry.mydomain.com/myapp:latest | |
| 246 | 251 | ||
| 247 | 252 | # Profit! | |
| 248 | 253 | ``` | |
| @@ -250,8 +255,8 @@ podman push registry.mydomain.com/myapp:latest | |||
| 250 | 255 | ### Versioned Deployment | |
| 251 | 256 | ```bash | |
| 252 | 257 | # Deploy specific version | |
| 253 | - | podman tag myapp:v1.2.0 registry.mydomain.com/myapp:v1.2.0 | |
| 254 | - | podman push registry.mydomain.com/myapp:v1.2.0 | |
| 258 | + | docker tag myapp:v1.2.0 registry.mydomain.com/myapp:v1.2.0 | |
| 259 | + | docker push registry.mydomain.com/myapp:v1.2.0 | |
| 255 | 260 | ||
| 256 | 261 | # Update route in gordon.toml | |
| 257 | 262 | # "app.mydomain.com" = "myapp:v1.2.0" | |
| @@ -261,10 +266,10 @@ podman push registry.mydomain.com/myapp:v1.2.0 | |||
| 261 | 266 | ```bash | |
| 262 | 267 | # Deploy with metadata | |
| 263 | 268 | export VERSION=v1.2.0 | |
| 264 | - | podman manifest create myapp:latest | |
| 265 | - | podman manifest add myapp:latest registry.mydomain.com/myapp:$VERSION | |
| 266 | - | podman manifest annotate myapp:latest --annotation version=$VERSION registry.mydomain.com/myapp:$VERSION | |
| 267 | - | podman manifest push myapp:latest registry.mydomain.com/myapp:latest | |
| 269 | + | docker manifest create myapp:latest | |
| 270 | + | docker manifest add myapp:latest registry.mydomain.com/myapp:$VERSION | |
| 271 | + | docker manifest annotate myapp:latest --annotation version=$VERSION registry.mydomain.com/myapp:$VERSION | |
| 272 | + | docker manifest push myapp:latest registry.mydomain.com/myapp:latest | |
| 268 | 273 | ``` | |
| 269 | 274 | ||
| 270 | 275 | ## Community | |
| @@ -33,17 +33,19 @@ Gordon is a lightweight deployment system that turns any VPS into a container ho | |||||
| 33 | ## How It Works | 33 | ## How It Works | ||
| 34 | 34 | ||||
| 35 | ```bash | 35 | ```bash | ||
| 36 | - | # 1. Build & test locally | 36 | + | # 1. Build & test locally (Docker or Podman) |
| 37 | - | podman build -t myapp . | 37 | + | docker build -t myapp . |
| 38 | - | podman run -p 8080:8080 myapp # Works? Great! | 38 | + | docker run -p 8080:8080 myapp # Works? Great! |
| 39 | 39 | ||||
| 40 | # 2. Push to deploy | 40 | # 2. Push to deploy | ||
| 41 | - | podman tag myapp registry.mydomain.com/myapp:latest | 41 | + | docker tag myapp registry.mydomain.com/myapp:latest |
| 42 | - | podman push registry.mydomain.com/myapp:latest | 42 | + | docker push registry.mydomain.com/myapp:latest |
| 43 | 43 | ||||
| 44 | # 3. That's it. Gordon handles the rest. | 44 | # 3. That's it. Gordon handles the rest. | ||
| 45 | ``` | 45 | ``` | ||
| 46 | 46 | ||||
| 47 | + | > **Note:** All examples use `docker` commands, but `podman` works as a drop-in replacement. Just substitute `docker` with `podman` in any command. | |||
| 48 | + | ||||
| 47 | **Your machine is the build server. If it runs locally, it runs in production.** | 49 | **Your machine is the build server. If it runs locally, it runs in production.** | ||
| 48 | 50 | ||||
| 49 | ## Quick Start (5 minutes) | 51 | ## Quick Start (5 minutes) | ||
| @@ -51,7 +53,9 @@ podman push registry.mydomain.com/myapp:latest | |||||
| 51 | ### Prerequisites | 53 | ### Prerequisites | ||
| 52 | - Ubuntu/Debian VPS with root access | 54 | - Ubuntu/Debian VPS with root access | ||
| 53 | - Domain pointing to your VPS | 55 | - Domain pointing to your VPS | ||
| 54 | - | - Cloudflare account (free tier works) | 56 | + | - Cloudflare account (free tier works) - **Required for HTTPS** |
| 57 | + | ||||
| 58 | + | > **HTTPS Architecture:** Cloudflare terminates HTTPS and proxies to Gordon over HTTP internally. Gordon doesn't handle TLS certificates directly (no Let's Encrypt support yet). | |||
| 55 | 59 | ||||
| 56 | ### Installation | 60 | ### Installation | ||
| 57 | 61 | ||||
| @@ -79,13 +83,13 @@ Your dev machine likely has 8-16 cores and 16-32GB RAM. Your VPS has 1-2 cores a | |||||
| 79 | ### Push-to-Deploy Workflow | 83 | ### Push-to-Deploy Workflow | ||
| 80 | ```bash | 84 | ```bash | ||
| 81 | # Initial deployment | 85 | # Initial deployment | ||
| 82 | - | podman build -t myapp . | 86 | + | docker build -t myapp . |
| 83 | - | podman push registry.mydomain.com/myapp:latest | 87 | + | docker push registry.mydomain.com/myapp:latest |
| 84 | # Visit https://app.mydomain.com | 88 | # Visit https://app.mydomain.com | ||
| 85 | 89 | ||||
| 86 | # Update deployment | 90 | # Update deployment | ||
| 87 | - | podman build -t myapp . | 91 | + | docker build -t myapp . |
| 88 | - | podman push registry.mydomain.com/myapp:latest | 92 | + | docker push registry.mydomain.com/myapp:latest |
| 89 | # Zero-downtime update applied automatically | 93 | # Zero-downtime update applied automatically | ||
| 90 | ``` | 94 | ``` | ||
| 91 | 95 | ||||
| @@ -151,8 +155,9 @@ password = "your-secure-password" | |||||
| 151 | 155 | ||||
| 152 | See [examples/](examples/) for advanced configurations including network groups and more. | 156 | See [examples/](examples/) for advanced configurations including network groups and more. | ||
| 153 | 157 | ||||
| 154 | - | ## Detailed Setup Guide (Using podman in rootless mode) | 158 | + | ## Detailed Setup Guide (Podman Rootless Mode) |
| 155 | - | Note: Refer to Quick Start for the binary installation. | 159 | + | |
| 160 | + | > **Note:** This guide uses Podman in rootless mode for enhanced security. Docker users can follow similar steps - Gordon works with any OCI-compatible runtime. Refer to Quick Start for the binary installation. | |||
| 156 | 161 | ||||
| 157 | ### 1. VPS Preparation | 162 | ### 1. VPS Preparation | ||
| 158 | ```bash | 163 | ```bash | ||
| @@ -235,14 +240,14 @@ systemctl --user status gordon | |||||
| 235 | ### Simple Deployment | 240 | ### Simple Deployment | ||
| 236 | ```bash | 241 | ```bash | ||
| 237 | # Build locally | 242 | # Build locally | ||
| 238 | - | podman build -t myapp . | 243 | + | docker build -t myapp . |
| 239 | 244 | ||||
| 240 | # Test locally | 245 | # Test locally | ||
| 241 | - | podman run -p 8080:8080 myapp | 246 | + | docker run -p 8080:8080 myapp |
| 242 | 247 | ||||
| 243 | # Push to registry | 248 | # Push to registry | ||
| 244 | - | podman tag myapp registry.mydomain.com/myapp:latest | 249 | + | docker tag myapp registry.mydomain.com/myapp:latest |
| 245 | - | podman push registry.mydomain.com/myapp:latest | 250 | + | docker push registry.mydomain.com/myapp:latest |
| 246 | 251 | ||||
| 247 | # Profit! | 252 | # Profit! | ||
| 248 | ``` | 253 | ``` | ||
| @@ -250,8 +255,8 @@ podman push registry.mydomain.com/myapp:latest | |||||
| 250 | ### Versioned Deployment | 255 | ### Versioned Deployment | ||
| 251 | ```bash | 256 | ```bash | ||
| 252 | # Deploy specific version | 257 | # Deploy specific version | ||
| 253 | - | podman tag myapp:v1.2.0 registry.mydomain.com/myapp:v1.2.0 | 258 | + | docker tag myapp:v1.2.0 registry.mydomain.com/myapp:v1.2.0 |
| 254 | - | podman push registry.mydomain.com/myapp:v1.2.0 | 259 | + | docker push registry.mydomain.com/myapp:v1.2.0 |
| 255 | 260 | ||||
| 256 | # Update route in gordon.toml | 261 | # Update route in gordon.toml | ||
| 257 | # "app.mydomain.com" = "myapp:v1.2.0" | 262 | # "app.mydomain.com" = "myapp:v1.2.0" | ||
| @@ -261,10 +266,10 @@ podman push registry.mydomain.com/myapp:v1.2.0 | |||||
| 261 | ```bash | 266 | ```bash | ||
| 262 | # Deploy with metadata | 267 | # Deploy with metadata | ||
| 263 | export VERSION=v1.2.0 | 268 | export VERSION=v1.2.0 | ||
| 264 | - | podman manifest create myapp:latest | 269 | + | docker manifest create myapp:latest |
| 265 | - | podman manifest add myapp:latest registry.mydomain.com/myapp:$VERSION | 270 | + | docker manifest add myapp:latest registry.mydomain.com/myapp:$VERSION |
| 266 | - | podman manifest annotate myapp:latest --annotation version=$VERSION registry.mydomain.com/myapp:$VERSION | 271 | + | docker manifest annotate myapp:latest --annotation version=$VERSION registry.mydomain.com/myapp:$VERSION |
| 267 | - | podman manifest push myapp:latest registry.mydomain.com/myapp:latest | 272 | + | docker manifest push myapp:latest registry.mydomain.com/myapp:latest |
| 268 | ``` | 273 | ``` | ||
| 269 | 274 | ||||
| 270 | ## Community | 275 | ## Community | ||