Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions .github/workflows/build-ova.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
name: Build OVF Image

on:
push:
branches:
- add-dockge
workflow_dispatch:
inputs:
core_tag:
Expand Down Expand Up @@ -63,24 +66,29 @@ jobs:
env:
PACKER_LOG: 1
run: |
CORE_TAG="${{ github.event.inputs.core_tag || '2.0.0-alpha2' }}"
PROXY_TAG="${{ github.event.inputs.proxy_tag || '2.0.0-alpha2' }}"
GATEWAY_TAG="${{ github.event.inputs.gateway_tag || '2.0.0-alpha2' }}"
packer build \
-var "iso_url=file://$PWD/ubuntu-24.04.4-live-server-amd64.iso" \
-var "core_tag=${{ github.event.inputs.core_tag }}" \
-var "proxy_tag=${{ github.event.inputs.proxy_tag }}" \
-var "gateway_tag=${{ github.event.inputs.gateway_tag }}" \
-var "core_tag=${CORE_TAG}" \
-var "proxy_tag=${PROXY_TAG}" \
-var "gateway_tag=${GATEWAY_TAG}" \
defguard.pkr.hcl

- name: Upload OVA to S3
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: eu-central-1
CORE_TAG: ${{ github.event.inputs.core_tag }}
PROXY_TAG: ${{ github.event.inputs.proxy_tag }}
GATEWAY_TAG: ${{ github.event.inputs.gateway_tag }}
CORE_TAG: ${{ github.event.inputs.core_tag || '2.0.0-alpha2' }}
PROXY_TAG: ${{ github.event.inputs.proxy_tag || '2.0.0-alpha2' }}
GATEWAY_TAG: ${{ github.event.inputs.gateway_tag || '2.0.0-alpha2' }}
run: |
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
FILENAME="defguard_${TIMESTAMP}_core-${CORE_TAG}_edge-${PROXY_TAG}_gateway-${GATEWAY_TAG}.ova"
ls -lh output/defguard/defguard.ova
aws s3 cp output/defguard/defguard.ova "s3://defguard-downloads/ova/${FILENAME}"
echo "Uploaded: s3://defguard-downloads/ova/${FILENAME}"
aws s3 cp output/defguard/defguard.ova "s3://defguard-downloads/ova/defguard-latest.ova" \
--cache-control "no-cache"
22 changes: 11 additions & 11 deletions ova/defguard.pkr.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -95,21 +95,21 @@ build {
provisioner "shell" {
inline = [
"sudo bash /tmp/docker-setup.sh",
"sudo mkdir -p /opt/defguard",
"sudo mv /tmp/docker-compose.yaml /opt/defguard/docker-compose.yaml",
"sudo mv /tmp/docker-compose.standalone.yaml /opt/defguard/docker-compose.standalone.yaml",
"sudo mv /tmp/generate-env.sh /opt/defguard/generate-env.sh",
"sudo chmod +x /opt/defguard/generate-env.sh",
"sudo mv /tmp/start.sh /opt/defguard/start.sh",
"sudo chmod +x /opt/defguard/start.sh",
"echo 'DEFGUARD_CORE_TAG=${var.core_tag}' | sudo tee /opt/defguard/.image-tags > /dev/null",
"echo 'DEFGUARD_PROXY_TAG=${var.proxy_tag}' | sudo tee -a /opt/defguard/.image-tags > /dev/null",
"echo 'DEFGUARD_GATEWAY_TAG=${var.gateway_tag}' | sudo tee -a /opt/defguard/.image-tags > /dev/null",
"sudo mkdir -p /opt/stacks/defguard",
"sudo mv /tmp/docker-compose.yaml /opt/stacks/defguard/docker-compose.yaml",
"sudo mv /tmp/docker-compose.standalone.yaml /opt/stacks/defguard/docker-compose.standalone.yaml",
"sudo mv /tmp/generate-env.sh /opt/stacks/defguard/generate-env.sh",
"sudo chmod +x /opt/stacks/defguard/generate-env.sh",
"sudo mv /tmp/start.sh /opt/stacks/defguard/start.sh",
"sudo chmod +x /opt/stacks/defguard/start.sh",
"echo 'DEFGUARD_CORE_TAG=${var.core_tag}' | sudo tee /opt/stacks/defguard/.image-tags > /dev/null",
"echo 'DEFGUARD_PROXY_TAG=${var.proxy_tag}' | sudo tee -a /opt/stacks/defguard/.image-tags > /dev/null",
"echo 'DEFGUARD_GATEWAY_TAG=${var.gateway_tag}' | sudo tee -a /opt/stacks/defguard/.image-tags > /dev/null",
"sudo mv /tmp/99-defguard.cfg /etc/cloud/cloud.cfg.d/99-defguard.cfg",
"sudo mv /tmp/defguard-init.service /etc/systemd/system/defguard-init.service",
"sudo systemctl daemon-reload",
"sudo systemctl enable docker.service",
"sudo chown -R ubuntu:ubuntu /opt/defguard",
"sudo chown -R ubuntu:ubuntu /opt/stacks/defguard",
"sudo rm -f /etc/netplan/00-installer-config.yaml /etc/netplan/50-cloud-init.yaml",
"sudo cloud-init clean --logs",
"sudo rm -f /etc/ssh/ssh_host_*",
Expand Down
6 changes: 3 additions & 3 deletions ova/files/defguard-init.service
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ Wants=network-online.target docker.service

[Service]
Type=oneshot
WorkingDirectory=/opt/defguard
WorkingDirectory=/opt/stacks/defguard
StandardOutput=append:/var/log/defguard-startup.log
StandardError=append:/var/log/defguard-startup.log
ExecStart=/bin/bash /opt/defguard/generate-env.sh
ExecStart=/bin/bash /opt/defguard/start.sh
ExecStart=/bin/bash /opt/stacks/defguard/generate-env.sh
ExecStart=/bin/bash /opt/stacks/defguard/start.sh
13 changes: 13 additions & 0 deletions ova/files/docker-compose.standalone.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,19 @@ services:
- ./.volumes/npm/data:/data
- ./.volumes/npm/letsencrypt:/etc/letsencrypt

dockge:
image: louislam/dockge:1
restart: unless-stopped
profiles: [dockge]
ports:
- "5001:5001"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./.volumes/dockge:/app/data
- /opt/stacks:/opt/stacks
environment:
DOCKGE_STACKS_DIR: /opt/stacks

db:
restart: always
profiles: [core]
Expand Down
13 changes: 13 additions & 0 deletions ova/files/docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,19 @@ services:
- ./.volumes/npm/data:/data
- ./.volumes/npm/letsencrypt:/etc/letsencrypt

dockge:
image: louislam/dockge:1
restart: unless-stopped
profiles: [dockge]
ports:
- "5001:5001"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./.volumes/dockge:/app/data
- /opt/stacks:/opt/stacks
environment:
DOCKGE_STACKS_DIR: /opt/stacks

db:
restart: always
image: postgres:18-alpine
Expand Down
8 changes: 4 additions & 4 deletions ova/files/generate-env.sh
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#!/bin/bash
# Generates /opt/defguard/.env with random secrets on first boot.
# Generates /opt/stacks/defguard/.env with random secrets on first boot.
# If .env already exists (e.g. provided via cloud-init), this script does nothing.

ENV_FILE="/opt/defguard/.env"
ENV_FILE="/opt/stacks/defguard/.env"

if [ -f "$ENV_FILE" ]; then
echo "DefGuard: .env already exists, skipping generation."
Expand All @@ -17,8 +17,8 @@ DEFGUARD_GATEWAY_SECRET=$(openssl rand -hex 32)
DEFGUARD_YUBIBRIDGE_SECRET=$(openssl rand -hex 32)
DB_PASSWORD=$(openssl rand -hex 16)

if [ -f "/opt/defguard/.image-tags" ]; then
source "/opt/defguard/.image-tags"
if [ -f "/opt/stacks/defguard/.image-tags" ]; then
source "/opt/stacks/defguard/.image-tags"
fi

: "${DEFGUARD_CORE_TAG:?DEFGUARD_CORE_TAG is required}"
Expand Down
44 changes: 38 additions & 6 deletions ova/files/start.sh
Original file line number Diff line number Diff line change
@@ -1,21 +1,53 @@
#!/bin/bash
# Starts defguard via docker compose.
# Default (no active-profiles file): starts the full all-in-one stack.
# To select specific components, create /opt/defguard/active-profiles with a
# To select specific components, create /opt/stacks/defguard/active-profiles with a
# space or newline-separated list of profiles: core, gateway, edge
#
# To enable the Dockge docker management UI (port 5001), create the file:
# /opt/stacks/defguard/enable-docker-management
# Example cloud-init:
# write_files:
# - path: /opt/stacks/defguard/enable-docker-management
# content: ""

PROFILES_FILE="/opt/defguard/active-profiles"
PROFILES_FILE="/opt/stacks/defguard/active-profiles"
ENABLE_DOCKER_MGMT_FILE="/opt/stacks/defguard/enable-docker-management"

# Append the dockge profile if the opt-in flag file is present
_maybe_add_dockge() {
local profiles="$1"
if [ -f "$ENABLE_DOCKER_MGMT_FILE" ]; then
if [ -z "$profiles" ]; then
echo "dockge"
else
echo "${profiles},dockge"
fi
else
echo "$profiles"
fi
}

if [ ! -f "$PROFILES_FILE" ]; then
docker compose -f /opt/defguard/docker-compose.yaml up -d
COMPOSE_PROFILES=$(_maybe_add_dockge "")
if [ -n "$COMPOSE_PROFILES" ]; then
export COMPOSE_PROFILES
fi
docker compose -f /opt/stacks/defguard/docker-compose.yaml up -d
else
COMPOSE_PROFILES=$(tr '[:space:]' ',' < "$PROFILES_FILE" | tr -s ',' | sed 's/,$//')
if [ -z "$COMPOSE_PROFILES" ]; then
echo "Warning: $PROFILES_FILE is empty or contains only whitespace; starting full all-in-one stack."
unset COMPOSE_PROFILES
docker compose -f /opt/defguard/docker-compose.yaml up -d
COMPOSE_PROFILES=$(_maybe_add_dockge "")
if [ -n "$COMPOSE_PROFILES" ]; then
export COMPOSE_PROFILES
else
unset COMPOSE_PROFILES
fi
docker compose -f /opt/stacks/defguard/docker-compose.yaml up -d
else
COMPOSE_PROFILES=$(_maybe_add_dockge "$COMPOSE_PROFILES")
export COMPOSE_PROFILES
docker compose -f /opt/defguard/docker-compose.standalone.yaml up -d
docker compose -f /opt/stacks/defguard/docker-compose.standalone.yaml up -d
fi
fi
Loading