From 824f0554e43f838d415604ceee023d01446acf4c Mon Sep 17 00:00:00 2001 From: Tygozwolle Date: Fri, 24 Jul 2026 12:51:51 +0200 Subject: [PATCH] feat: consolidate FreeRADIUS and web controller into a single Docker image with unified entrypoint orchestration --- README.md | 55 ++++++++++++++-------------------- docker-compose.yml | 23 +++++--------- radiuscontroller/Dockerfile | 32 +++++++++++++++++--- radiuscontroller/entrypoint.sh | 38 +++++++++++++++++++++++ 4 files changed, 95 insertions(+), 53 deletions(-) create mode 100644 radiuscontroller/entrypoint.sh diff --git a/README.md b/README.md index 6d21861..5f666ee 100644 --- a/README.md +++ b/README.md @@ -7,24 +7,21 @@ This project provides a complete **RADIUS Authentication & Accounting Controller ## πŸ—οΈ System Architecture ``` -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” UDP 1812/1813 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ UniFi AP / β”‚ ◄───────────────────────► β”‚ FreeRADIUS β”‚ -β”‚ Dream Machine β”‚ β”‚ (Port 1812/13) β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ β”‚ - β”‚ Wi-Fi 802.1X / β”‚ SQL Queries - β”‚ Guest Auth β–Ό - β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” - β”‚ β”‚ PostgreSQL β”‚ - β”‚ β”‚ (Radius DB) β”‚ - β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β–²β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ β”‚ - β”‚ HTTP/8080 β”‚ EF Core - β–Ό β”‚ -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ -β”‚ Guests / Admins β”‚ β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ -β”‚ (Web Portal) β”‚ RadiusController Web App -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” UDP 1812/1813 (RADIUS) +β”‚ UniFi AP / β”‚ ◄────────────────────────────────┐ +β”‚ Dream Machine β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” HTTP 8080 (Web UI) β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Guests / Admins β”‚ ◄────────────────────────► β”‚ Combined Application Container β”‚ +β”‚ (Browser) β”‚ β”‚ (FreeRADIUS + Web Controller) β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ PostgreSQL + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ PostgreSQL β”‚ + β”‚ (Database) β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- @@ -51,21 +48,6 @@ services: - /mnt/user/appdata/radiuscontroller/pgdata:/var/lib/postgresql/data - /mnt/user/appdata/radiuscontroller/sql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro - freeradius: - image: freeradius/freeradius-server:latest - container_name: radius_freeradius - restart: always - depends_on: - - postgres - ports: - - "1812:1812/udp" - - "1813:1813/udp" - environment: - - DB_NAME=radius - - DB_HOST=postgres - - DB_USER=radius - - DB_PASS=radpass - radiuscontroller: image: cablon.vanolst.tech/tygozwolle/radius:latest container_name: radius_web_controller @@ -74,7 +56,14 @@ services: - postgres ports: - "8080:8080" + - "1812:1812/udp" + - "1813:1813/udp" environment: + - DB_HOST=postgres + - DB_PORT=5432 + - DB_USER=radius + - DB_PASS=radpass + - DB_NAME=radius - ConnectionStrings__DefaultConnection=Host=postgres;Port=5432;Database=radius;Username=radius;Password=radpass; - ASPNETCORE_ENVIRONMENT=Production ``` diff --git a/docker-compose.yml b/docker-compose.yml index 8224d5c..88e6d9b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,21 +15,6 @@ services: - /mnt/user/appdata/radiuscontroller/pgdata:/var/lib/postgresql/data - /mnt/user/appdata/radiuscontroller/sql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro - freeradius: - image: freeradius/freeradius-server:latest - container_name: radius_freeradius - restart: always - depends_on: - - postgres - ports: - - "1812:1812/udp" - - "1813:1813/udp" - environment: - - DB_NAME=radius - - DB_HOST=postgres - - DB_USER=radius - - DB_PASS=radpass - radiuscontroller: image: cablon.vanolst.tech/tygozwolle/radius:latest container_name: radius_web_controller @@ -38,7 +23,13 @@ services: - postgres ports: - "8080:8080" + - "1812:1812/udp" + - "1813:1813/udp" environment: + - DB_HOST=postgres + - DB_PORT=5432 + - DB_USER=radius + - DB_PASS=radpass + - DB_NAME=radius - ConnectionStrings__DefaultConnection=Host=postgres;Port=5432;Database=radius;Username=radius;Password=radpass; - ASPNETCORE_ENVIRONMENT=Production - diff --git a/radiuscontroller/Dockerfile b/radiuscontroller/Dockerfile index 178ef90..56579d1 100644 --- a/radiuscontroller/Dockerfile +++ b/radiuscontroller/Dockerfile @@ -1,8 +1,21 @@ -ο»ΏFROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base -USER $APP_UID +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base +USER root + +# Install FreeRADIUS, PostgreSQL module, and utility packages +RUN apt-get update && apt-get install -y --no-install-recommends \ + freeradius \ + freeradius-postgresql \ + freeradius-utils \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# Create symlink so both /etc/raddb and /etc/freeradius/3.0 work +RUN ln -sf /etc/freeradius/3.0 /etc/raddb + WORKDIR /app EXPOSE 8080 -EXPOSE 8081 +EXPOSE 1812/udp +EXPOSE 1813/udp FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build ARG BUILD_CONFIGURATION=Release @@ -19,5 +32,16 @@ RUN dotnet publish "./radiuscontroller.csproj" -c $BUILD_CONFIGURATION -o /app/p FROM base AS final WORKDIR /app + +# Copy pre-configured FreeRADIUS PostgreSQL rules & EAP authentication config +COPY raddb/clients.conf /etc/freeradius/3.0/clients.conf +COPY raddb/mods-enabled/sql /etc/freeradius/3.0/mods-enabled/sql +COPY raddb/sites-enabled/default /etc/freeradius/3.0/sites-enabled/default +COPY raddb/sites-enabled/inner-tunnel /etc/freeradius/3.0/sites-enabled/inner-tunnel + +# Copy published application and entrypoint script COPY --from=publish /app/publish . -ENTRYPOINT ["dotnet", "radiuscontroller.dll"] +COPY radiuscontroller/entrypoint.sh /app/entrypoint.sh +RUN chmod +x /app/entrypoint.sh + +ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/radiuscontroller/entrypoint.sh b/radiuscontroller/entrypoint.sh new file mode 100644 index 0000000..4d6bc78 --- /dev/null +++ b/radiuscontroller/entrypoint.sh @@ -0,0 +1,38 @@ +#!/bin/sh +set -e + +# Default environment variables +DB_HOST="${DB_HOST:-postgres}" +DB_PORT="${DB_PORT:-5432}" +DB_USER="${DB_USER:-radius}" +DB_PASS="${DB_PASS:-radpass}" +DB_NAME="${DB_NAME:-radius}" + +echo "=================================================" +echo " Starting RADIUS Controller & FreeRADIUS Stack" +echo " DB Host: $DB_HOST:$DB_PORT | Database: $DB_NAME" +echo "=================================================" + +# Dynamically update FreeRADIUS SQL configuration with DB settings +SQL_CONF="/etc/freeradius/3.0/mods-enabled/sql" +if [ -f "$SQL_CONF" ]; then + sed -i "s/server = .*/server = \"$DB_HOST\"/" "$SQL_CONF" + sed -i "s/port = .*/port = $DB_PORT/" "$SQL_CONF" + sed -i "s/login = .*/login = \"$DB_USER\"/" "$SQL_CONF" + sed -i "s/password = .*/password = \"$DB_PASS\"/" "$SQL_CONF" + sed -i "s/radius_db = .*/radius_db = \"$DB_NAME\"/" "$SQL_CONF" +fi + +# Ensure correct permissions for FreeRADIUS config directory +chown -R freerad:freerad /etc/freeradius/3.0/ || true + +# Start FreeRADIUS daemon in background +echo "Starting FreeRADIUS service..." +freeradius -x & + +# Wait briefly for FreeRADIUS to initialize +sleep 2 + +# Start ASP.NET Core Application +echo "Starting ASP.NET Core Web Controller..." +exec dotnet radiuscontroller.dll