From 8a849ceb43a859e244d2f28d371a89ac959eb384 Mon Sep 17 00:00:00 2001 From: Azreyo <58790873+Azreyo@users.noreply.github.com> Date: Sat, 20 Dec 2025 23:46:45 +0100 Subject: [PATCH] feat: add entrypoint script for Carbon Web Server configuration and startup --- .gitignore | 1 - entrypoint.sh | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 entrypoint.sh diff --git a/.gitignore b/.gitignore index 8da261c..0a8cd91 100644 --- a/.gitignore +++ b/.gitignore @@ -58,5 +58,4 @@ ssl/* !.github/workflows/ src/bin docker-push.sh -entrypoint.sh .idea \ No newline at end of file diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..becff04 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,147 @@ +#!/bin/sh +set -e + +# Carbon Web Server - Docker Entrypoint Script +# This script handles configuration and startup of the Carbon server + +CONFIG_FILE="/app/server.conf" + +# Helper: normalize boolean env vars (true/false/yes/no/1/0 -> true/false) +normalize_bool() { + case "$(echo "$1" | tr '[:upper:]' '[:lower:]')" in + true|yes|on|1) echo "true" ;; + *) echo "false" ;; + esac +} + +# Normalize environment variables +USE_HTTPS=$(normalize_bool "${USE_HTTPS:-false}") +ENABLE_HTTP2=$(normalize_bool "${ENABLE_HTTP2:-false}") +ENABLE_WEBSOCKET=$(normalize_bool "${ENABLE_WEBSOCKET:-false}") + +# Validate configuration constraints +validate_config() { + # HTTP/2 requires HTTPS + if [ "$ENABLE_HTTP2" = "true" ] && [ "$USE_HTTPS" != "true" ]; then + echo "ERROR: HTTP/2 requires HTTPS to be enabled" + echo "Set USE_HTTPS=true or disable HTTP/2 with ENABLE_HTTP2=false" + exit 1 + fi +} + +# Generate server.conf from environment variables +generate_config() { + # Skip generation if user mounted a custom config and KEEP_CONFIG is set + if [ -f "$CONFIG_FILE" ] && [ "${KEEP_CONFIG:-false}" = "true" ]; then + echo "Using existing server.conf (KEEP_CONFIG=true)" + return 0 + fi + + echo "Generating server.conf from environment variables..." + cat > "$CONFIG_FILE" << EOF +# Carbon Web Server Configuration (Auto-generated) +# Generated at: $(date -u +"%Y-%m-%d %H:%M:%S UTC") + +running = true + +# Network configuration +port = ${PORT:-8080} +use_https = ${USE_HTTPS} +enable_http2 = ${ENABLE_HTTP2} +enable_websocket = ${ENABLE_WEBSOCKET} +server_name = ${SERVER_NAME:-0.0.0.0} + +# Performance configuration +max_threads = ${MAX_THREADS:-4} +max_connections = ${MAX_CONNECTIONS:-1024} + +# Logging configuration +log_file = /app/log/server.log +log_mode = ${LOG_MODE:-classic} + +# Path configuration +www_path = /app/www + +# SSL configuration (if HTTPS enabled) +ssl_cert_path = ${SSL_CERT_PATH:-/app/ssl/cert/cert.pem} +ssl_key_path = ${SSL_KEY_PATH:-/app/ssl/key/key.key} +EOF + + if [ $? -ne 0 ]; then + echo "ERROR: Failed to write configuration file" + exit 1 + fi +} + +# Validate SSL certificates if HTTPS is enabled +validate_ssl() { + if [ "$USE_HTTPS" = "true" ]; then + CERT_PATH="${SSL_CERT_PATH:-/app/ssl/cert/cert.pem}" + KEY_PATH="${SSL_KEY_PATH:-/app/ssl/key/key.key}" + + if [ ! -f "$CERT_PATH" ]; then + echo "ERROR: SSL certificate not found at $CERT_PATH" + echo "Please mount your SSL certificate or set SSL_CERT_PATH" + exit 1 + fi + + if [ ! -r "$CERT_PATH" ]; then + echo "ERROR: SSL certificate at $CERT_PATH is not readable" + exit 1 + fi + + if [ ! -f "$KEY_PATH" ]; then + echo "ERROR: SSL key not found at $KEY_PATH" + echo "Please mount your SSL key or set SSL_KEY_PATH" + exit 1 + fi + + if [ ! -r "$KEY_PATH" ]; then + echo "ERROR: SSL key at $KEY_PATH is not readable" + exit 1 + fi + + echo "SSL certificates validated successfully" + fi +} + +# Create necessary directories +setup_directories() { + mkdir -p /app/log 2>/dev/null || true + mkdir -p /app/www 2>/dev/null || true +} + +# Print startup banner +print_banner() { + echo "========================================" + echo " Carbon Web Server" + echo "========================================" + echo " Port: ${PORT:-8080}" + echo " HTTPS: ${USE_HTTPS}" + echo " HTTP/2: ${ENABLE_HTTP2}" + echo " WebSocket: ${ENABLE_WEBSOCKET}" + echo " Log Mode: ${LOG_MODE:-classic}" + echo "========================================" +} + +# Main entry point +main() { + setup_directories + validate_config + generate_config + validate_ssl + print_banner + + # Verify server binary exists and is executable + if [ ! -x /app/server ]; then + echo "ERROR: Server binary not found or not executable at /app/server" + exit 1 + fi + + echo "Starting Carbon server..." + + # Execute the server (replaces shell process) + exec /app/server +} + +main "$@"