New Filestructure for Docker
This commit is contained in:
+10
-11
@@ -1,23 +1,22 @@
|
|||||||
config/.env.db
|
config/.env.db
|
||||||
config/.env.db-tables
|
|
||||||
config/.env.db-guest
|
config/.env.db-guest
|
||||||
config/.env.redis
|
config/.env.redis
|
||||||
config/.env.pw-encryption-key
|
config/.env.pw-encryption-key
|
||||||
config/.env.wk-id
|
|
||||||
config/.env.mail
|
config/.env.mail
|
||||||
config/.env.db-wkvs-user
|
config/.env.db-wkvs-user
|
||||||
|
config/.env.docker.db
|
||||||
websocket/node_modules
|
websocket/node_modules
|
||||||
composer/vendor
|
composer/vendor
|
||||||
private-files/rechnungen/*
|
private-files/rechnungen/*
|
||||||
private-files/config-uploads/*
|
private-files/config-uploads/*
|
||||||
.php-ini
|
.php-ini
|
||||||
.php-version
|
.php-version
|
||||||
www/externe-geraete/json/*
|
html/externe-geraete/json/*
|
||||||
www/files/ranglisten/*
|
html/files/ranglisten/*
|
||||||
www/sponsoren.php
|
html/sponsoren.php
|
||||||
www/css/sponsoren.css
|
html/css/sponsoren.css
|
||||||
www/scripts
|
html/scripts
|
||||||
www/files/music/*
|
html/files/music/*
|
||||||
!www/files/music/piep.mp3
|
!html/files/music/piep.mp3
|
||||||
www/.well-known
|
html/.well-known
|
||||||
www/intern/kampfrichter/ajax/ajax-neu_dynamic-rangliste.php
|
html/intern/kampfrichter/ajax/ajax-neu_dynamic-rangliste.php
|
||||||
+23
-93
@@ -1,125 +1,55 @@
|
|||||||
services:
|
services:
|
||||||
|
|
||||||
nginx:
|
nginx:
|
||||||
image: nginx:latest
|
image: nginx:latest
|
||||||
container_name: wkvs-nginx
|
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:8080:80"
|
- "127.0.0.1:8081:80"
|
||||||
- "127.0.0.1:8082:8082"
|
|
||||||
volumes:
|
|
||||||
- .:/var/wkvs
|
|
||||||
- ./config/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- apache
|
- apache
|
||||||
- node
|
- node
|
||||||
|
volumes:
|
||||||
|
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
|
||||||
networks:
|
networks:
|
||||||
- wkvs
|
- app-network
|
||||||
|
|
||||||
env-init:
|
|
||||||
build: ./config/apache
|
|
||||||
container_name: wkvs-env-init
|
|
||||||
volumes:
|
|
||||||
- .:/var/wkvs
|
|
||||||
working_dir: /var/wkvs
|
|
||||||
command: php setup/init-env.php
|
|
||||||
|
|
||||||
composer-init:
|
|
||||||
image: composer:latest
|
|
||||||
container_name: wkvs-composer-init
|
|
||||||
volumes:
|
|
||||||
- .:/app
|
|
||||||
working_dir: /app/composer
|
|
||||||
command: composer install --no-interaction --prefer-dist
|
|
||||||
depends_on:
|
|
||||||
env-init:
|
|
||||||
condition: service_completed_successfully
|
|
||||||
|
|
||||||
apache:
|
apache:
|
||||||
build: ./config/apache
|
build: ./docker/apache
|
||||||
container_name: wkvs-apache
|
|
||||||
volumes:
|
volumes:
|
||||||
- .:/var/wkvs
|
- .:/var/www/wkvs
|
||||||
- ./config/apache/php/custom.ini:/usr/local/etc/php/conf.d/custom.ini
|
|
||||||
depends_on:
|
|
||||||
db-init:
|
|
||||||
condition: service_completed_successfully
|
|
||||||
composer-init:
|
|
||||||
condition: service_completed_successfully
|
|
||||||
networks:
|
networks:
|
||||||
- wkvs
|
- app-network
|
||||||
|
|
||||||
mariadb:
|
mariadb:
|
||||||
image: mariadb:latest
|
image: mariadb:11
|
||||||
container_name: wkvs-mariadb
|
container_name: test-mariadb
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
env_file:
|
env_file:
|
||||||
- path: ./config/.env.db
|
- ./config/.env.docker.db
|
||||||
required: false
|
|
||||||
volumes:
|
volumes:
|
||||||
- db_data:/var/lib/mysql
|
- db_data:/var/lib/mysql
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "mariadb-admin", "ping", "-h", "127.0.0.1"]
|
|
||||||
interval: 5s
|
|
||||||
timeout: 5s
|
|
||||||
retries: 5
|
|
||||||
depends_on:
|
|
||||||
env-init:
|
|
||||||
condition: service_completed_successfully
|
|
||||||
networks:
|
networks:
|
||||||
- wkvs
|
- app-network
|
||||||
|
|
||||||
db-init:
|
node:
|
||||||
build: ./config/apache
|
build:
|
||||||
container_name: wkvs-db-init
|
context: .
|
||||||
|
dockerfile: docker/node/Dockerfile
|
||||||
|
expose:
|
||||||
|
- "8082"
|
||||||
volumes:
|
volumes:
|
||||||
- .:/var/wkvs
|
- .:/var/www/wkvs
|
||||||
working_dir: /var/wkvs
|
- /var/www/wkvs/websocket/node_modules
|
||||||
depends_on:
|
|
||||||
mariadb:
|
|
||||||
condition: service_healthy
|
|
||||||
env-init:
|
|
||||||
condition: service_completed_successfully
|
|
||||||
networks:
|
networks:
|
||||||
- wkvs
|
- app-network
|
||||||
command: php setup/database/init-db.php
|
|
||||||
|
|
||||||
redis:
|
redis:
|
||||||
image: redis:7
|
image: redis:7
|
||||||
container_name: wkvs-redis
|
container_name: wkvs-redis
|
||||||
restart: unless-stopped
|
|
||||||
env_file:
|
|
||||||
- path: ./config/.env.redis
|
|
||||||
required: false
|
|
||||||
command: ["sh", "-c", "exec redis-server --requirepass \"$REDDIS_PASSWORD\""]
|
|
||||||
depends_on:
|
|
||||||
env-init:
|
|
||||||
condition: service_completed_successfully
|
|
||||||
networks:
|
networks:
|
||||||
- wkvs
|
- app-network
|
||||||
|
|
||||||
node:
|
|
||||||
image: node:latest
|
|
||||||
container_name: wkvs-node
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- .:/var/wkvs
|
|
||||||
working_dir: /var/wkvs/websocket
|
|
||||||
env_file:
|
|
||||||
- path: ./config/.env.redis
|
|
||||||
required: false
|
|
||||||
environment:
|
|
||||||
- REDDIS_HOST=redis
|
|
||||||
command: sh -c "npm install && npm install -g pm2 && pm2-runtime start index.js --max-memory-restart 1G --node-args=\"--max-old-space-size=1024\" --name=\"WebSocket WKVS\""
|
|
||||||
depends_on:
|
|
||||||
redis:
|
|
||||||
condition: service_started
|
|
||||||
env-init:
|
|
||||||
condition: service_completed_successfully
|
|
||||||
networks:
|
|
||||||
- wkvs
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
db_data:
|
db_data:
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
wkvs:
|
app-network:
|
||||||
|
driver: bridge
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
# This Account must have have permissions SELECT, INSERT, UPDATE !
|
|
||||||
|
|
||||||
DB_USER=DB_GUESTUSER_USERNAME
|
|
||||||
DB_PASSWORD=DB_GUESTUSER_PASSWORD
|
|
||||||
DB_NAME=DATABASE_NAME # Same as .env.db-wkvs-user
|
|
||||||
DB_HOST=mariadb # Same as .env.db-wkvs-user, An IP without Port, often 127.0.0.1 or localhost
|
|
||||||
DB_PORT=3306 # default Port is 3306
|
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
DB_PREFIX=PREFIX
|
|
||||||
|
|
||||||
# Tabellennamen
|
# Tabellennamen
|
||||||
DB_TABLE_TEILNEHMENDE=teilnehmende
|
DB_TABLE_TEILNEHMENDE=teilnehmende
|
||||||
DB_TABLE_TEILNEHMENDE_GRUPPEN=teilnehmende_gruppen
|
DB_TABLE_TEILNEHMENDE_GRUPPEN=teilnehmende_gruppen
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
# This Account must have at least have permissions SELECT, INSERT, UPDATE, DELETE !
|
|
||||||
|
|
||||||
DB_USER=DB_USER_USERNAME
|
|
||||||
DB_PASSWORD=DB_USER_PASSWORD
|
|
||||||
DB_NAME=DATABASE_NAME
|
|
||||||
DB_HOST=mariadb # mariadb for Docker Use, otherwsie An IP with Port 127.0.0.1 or localhost
|
|
||||||
DB_PORT=3306 # default Port is 3306
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
MYSQL_ROOT_PASSWORD=YOUR_PASSWORD_FOR_ROOT
|
|
||||||
MYSQL_DATABASE=YOUR_DATABASE_NAME
|
|
||||||
MYSQL_HOST=localhost
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
PW_ENCRYPTION_KEY=YOUR_CUSTOM_PASSWORD_ENCRYPTION_KEY
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
REDDIS_PASSWORD=YOUR_REDDIS_PASSWORD
|
|
||||||
REDDIS_HOST=YOUR_REDDIS_IP # An IP, often 127.0.0.1 or localhost
|
|
||||||
REDDIS_PORT=YOUR_REDDIS_PORT # Default 6379
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
FROM php:8.3-apache
|
|
||||||
|
|
||||||
# Enable the rewrite module
|
|
||||||
RUN a2enmod rewrite
|
|
||||||
|
|
||||||
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
|
|
||||||
|
|
||||||
# Set Apache DocumentRoot to /var/wkvs/www
|
|
||||||
ENV APACHE_DOCUMENT_ROOT /var/wkvs/www
|
|
||||||
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf \
|
|
||||||
&& sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf \
|
|
||||||
&& sed -i 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
events {}
|
|
||||||
|
|
||||||
http {
|
|
||||||
server {
|
|
||||||
listen 80;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
proxy_pass http://apache:80;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /ws/ {
|
|
||||||
proxy_pass http://node:8082;
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
|
||||||
proxy_set_header Connection "Upgrade";
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
|
|
||||||
# Prevent WebSocket timeout
|
|
||||||
proxy_read_timeout 36000s; # 1 hour
|
|
||||||
proxy_send_timeout 36000s; # 1 hour
|
|
||||||
proxy_connect_timeout 75s; # optional
|
|
||||||
}
|
|
||||||
location ~ /\. {
|
|
||||||
deny all;
|
|
||||||
access_log off;
|
|
||||||
log_not_found off;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# 1. Reset containers and volumes
|
||||||
|
docker compose down -v
|
||||||
|
|
||||||
|
# Ensure the config directory exists
|
||||||
|
mkdir -p config
|
||||||
|
|
||||||
|
# 2. Generate Random Variables correctly using $(...)
|
||||||
|
MYSQL_USER=$(openssl rand -hex 16)
|
||||||
|
MYSQL_PASSWORD=$(openssl rand -base64 32)
|
||||||
|
MYSQL_DATABASE="wkvs_database"
|
||||||
|
MYSQL_ROOT_PASSWORD=$(openssl rand -base64 32)
|
||||||
|
|
||||||
|
cat <<EOF > config/.env.docker.db
|
||||||
|
MYSQL_ROOT_PASSWORD="$MYSQL_ROOT_PASSWORD"
|
||||||
|
MYSQL_DATABASE=$MYSQL_DATABASE
|
||||||
|
MYSQL_USER=$MYSQL_USER
|
||||||
|
MYSQL_PASSWORD="$MYSQL_PASSWORD"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 3. Handle Admin Hashing
|
||||||
|
KEYWORD=$(openssl rand -hex 16)
|
||||||
|
HASHED_KEYWORD=$(php -r "echo password_hash('$KEYWORD', PASSWORD_ARGON2ID);")
|
||||||
|
|
||||||
|
# Replace placeholder in SQL template
|
||||||
|
sed "s|__ARGON_HASH_PLACEHOLDER__|$HASHED_KEYWORD|g" docker/database/wkvs-database-template.sql > docker/database/db-sql.sql
|
||||||
|
|
||||||
|
# 1. Generate password
|
||||||
|
REDIS_PASSWORD=$(openssl rand -hex 32)
|
||||||
|
|
||||||
|
# 3. Save variables to your .env file
|
||||||
|
cat <<EOF > config/.env.redis
|
||||||
|
REDIS_PASSWORD="$REDIS_PASSWORD"
|
||||||
|
REDIS_HOST=redis
|
||||||
|
REDIS_PORT=6379
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 4. Start Docker Containers
|
||||||
|
docker compose up -d --build
|
||||||
|
|
||||||
|
# 5. Wait until MariaDB is fully up and accepting connections
|
||||||
|
echo "Waiting for MariaDB to start..."
|
||||||
|
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
until docker compose exec -T mariadb mariadb-admin ping -h localhost -u root -p"$MYSQL_ROOT_PASSWORD" --silent >/dev/null 2>&1; do
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
# 6. Execute Primary Schema Import
|
||||||
|
docker compose exec -T mariadb mariadb -u root -p"$MYSQL_ROOT_PASSWORD" "$MYSQL_DATABASE" < docker/database/db-sql.sql
|
||||||
|
rm docker/database/db-sql.sql
|
||||||
|
|
||||||
|
# 7. Generate Additional Application Users & Passwords
|
||||||
|
MYSQL_WKVS_USERNAME="wkvs_normal_user"
|
||||||
|
MYSQL_GUEST_USERNAME="wkvs_guest_user"
|
||||||
|
|
||||||
|
MYSQL_WKVS_PASSWORD=$(openssl rand -hex 32)
|
||||||
|
MYSQL_GUEST_PASSWORD=$(openssl rand -hex 16)
|
||||||
|
|
||||||
|
# Write app user configuration files
|
||||||
|
cat <<EOF > config/.env.db-wkvs-user
|
||||||
|
DB_USER=$MYSQL_WKVS_USERNAME
|
||||||
|
DB_PASSWORD="$MYSQL_WKVS_PASSWORD"
|
||||||
|
DB_NAME=$MYSQL_DATABASE
|
||||||
|
DB_HOST=mariadb
|
||||||
|
DB_PORT=3306
|
||||||
|
EOF
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cat <<EOF > config/.env.db-guest
|
||||||
|
DB_GUEST_USER=$MYSQL_GUEST_USERNAME
|
||||||
|
DB_GUEST_PASSWORD="$MYSQL_GUEST_PASSWORD"
|
||||||
|
DB_NAME=$MYSQL_DATABASE
|
||||||
|
DB_HOST=mariadb
|
||||||
|
DB_PORT=3306
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 8. Create Additional Users & Grant Permissions in MariaDB
|
||||||
|
echo "Creating application users and setting permissions..."
|
||||||
|
|
||||||
|
docker compose exec -T mariadb mariadb -u root -p"$MYSQL_ROOT_PASSWORD" <<EOF
|
||||||
|
-- Create Normal User
|
||||||
|
CREATE USER IF NOT EXISTS '$MYSQL_WKVS_USERNAME'@'%' IDENTIFIED BY '$MYSQL_WKVS_PASSWORD';
|
||||||
|
GRANT SELECT, INSERT, UPDATE, DELETE ON \`$MYSQL_DATABASE\`.* TO '$MYSQL_WKVS_USERNAME'@'%';
|
||||||
|
|
||||||
|
-- Create Guest User
|
||||||
|
CREATE USER IF NOT EXISTS '$MYSQL_GUEST_USERNAME'@'%' IDENTIFIED BY '$MYSQL_GUEST_PASSWORD';
|
||||||
|
GRANT SELECT, INSERT, UPDATE ON \`$MYSQL_DATABASE\`.* TO '$MYSQL_GUEST_USERNAME'@'%';
|
||||||
|
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
EOF
|
||||||
|
|
||||||
|
SERVICE_NAME="apache"
|
||||||
|
COMPOSER_DIR="/var/www/wkvs/composer"
|
||||||
|
|
||||||
|
echo "Running Composer setup via Docker Compose..."
|
||||||
|
|
||||||
|
# 1. Download Composer inside the service container if not installed globally
|
||||||
|
docker compose exec "$SERVICE_NAME" bash -c '
|
||||||
|
if ! command -v composer &> /dev/null && [ ! -f "composer.phar" ]; then
|
||||||
|
php -r "copy('\''https://getcomposer.org/installer'\'', '\''composer-setup.php'\'');"
|
||||||
|
php composer-setup.php --quiet
|
||||||
|
php -r "unlink('\''composer-setup.php'\'');"
|
||||||
|
fi
|
||||||
|
'
|
||||||
|
|
||||||
|
# 2. Run composer install against the specified directory
|
||||||
|
docker compose exec "$SERVICE_NAME" bash -c "
|
||||||
|
COMPOSER_CMD=\$(command -v composer || echo \"php \$(pwd)/composer.phar\")
|
||||||
|
TARGET_DIR=\"$COMPOSER_DIR\"
|
||||||
|
|
||||||
|
if [ -f \"\$TARGET_DIR/composer.lock\" ] || [ -f \"\$TARGET_DIR/composer.json\" ]; then
|
||||||
|
\$COMPOSER_CMD install --working-dir=\"\$TARGET_DIR\" --no-interaction --prefer-dist --quiet
|
||||||
|
else
|
||||||
|
echo \"Error: Neither composer.json nor composer.lock found in '\$TARGET_DIR'.\" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
"
|
||||||
|
|
||||||
|
echo "Konfiguriere Redis..."
|
||||||
|
|
||||||
|
# 2. Set password in the currently running Redis container
|
||||||
|
docker compose exec redis redis-cli CONFIG SET requirepass "$REDIS_PASSWORD"
|
||||||
|
|
||||||
|
PASSWORD_KEY=openssl rand -base64 32
|
||||||
|
|
||||||
|
cat <<EOF > config/.env.pw-encryption-key
|
||||||
|
PW_ENCRYPTION_KEY=$PASSWORD_KEY
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "------------------------------------------------------"
|
||||||
|
echo "Setup Complete!"
|
||||||
|
echo "Admin Plain Keyword: $KEYWORD"
|
||||||
|
echo "------------------------------------------------------"
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
FROM php:8.5-apache
|
||||||
|
|
||||||
|
# Enable Apache rewrite module
|
||||||
|
RUN a2enmod rewrite
|
||||||
|
|
||||||
|
# Install system dependencies, PHP extensions, and clean up apt cache
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
unzip \
|
||||||
|
libzip-dev \
|
||||||
|
libicu-dev \
|
||||||
|
git \
|
||||||
|
&& docker-php-ext-install \
|
||||||
|
bcmath \
|
||||||
|
mysqli \
|
||||||
|
pdo_mysql \
|
||||||
|
zip \
|
||||||
|
intl \
|
||||||
|
&& pecl install redis \
|
||||||
|
&& docker-php-ext-enable redis \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Update Apache DocumentRoot to /var/www/wkvs/html/ and enable .htaccess overrides
|
||||||
|
ENV APACHE_DOCUMENT_ROOT=/var/www/wkvs/html/
|
||||||
|
|
||||||
|
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf \
|
||||||
|
&& sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf \
|
||||||
|
&& sed -i 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf
|
||||||
@@ -0,0 +1,335 @@
|
|||||||
|
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
||||||
|
START TRANSACTION;
|
||||||
|
SET time_zone = "+00:00";
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `audiofiles`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `audiofiles` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`file_name` varchar(1024) NOT NULL,
|
||||||
|
`file_path` varchar(1024) NOT NULL,
|
||||||
|
`edited_by` int(11) DEFAULT NULL,
|
||||||
|
`timestamp` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `disziplinen`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `disziplinen` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` varchar(1024) DEFAULT NULL,
|
||||||
|
`start_index` int(11) DEFAULT NULL,
|
||||||
|
`color_kampfrichter` char(7) NOT NULL DEFAULT '#424242',
|
||||||
|
`audiofile` tinyint(1) DEFAULT NULL,
|
||||||
|
`audiofile_max_duration` int(11) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `einmal_links`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `einmal_links` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`url` varchar(1000) DEFAULT NULL,
|
||||||
|
`user_id` int(11) NOT NULL DEFAULT 0,
|
||||||
|
`type` enum('login','pwreset','create_profile','') NOT NULL,
|
||||||
|
`timestamp` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||||
|
`expires_at` timestamp NULL DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `url` (`url`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE TRIGGER `before_insert_login_tokens`
|
||||||
|
BEFORE INSERT ON `einmal_links`
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
IF NEW.url IS NULL THEN
|
||||||
|
SET NEW.url = HEX(RANDOM_BYTES(32));
|
||||||
|
END IF;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `gruppen`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `gruppen` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` varchar(100) NOT NULL DEFAULT 'KEIN NAME',
|
||||||
|
`order_index` int(11) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `gruppen_zeiten`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `gruppen_zeiten` (
|
||||||
|
`zeitplan_id` int(11) NOT NULL,
|
||||||
|
`start_time` time NOT NULL,
|
||||||
|
`end_time` time DEFAULT NULL,
|
||||||
|
`abt_id` int(11) NOT NULL,
|
||||||
|
UNIQUE KEY `unique_index` (`zeitplan_id`,`abt_id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `intern_benutzende`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `intern_benutzende` (
|
||||||
|
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`username` varchar(191) DEFAULT NULL,
|
||||||
|
`name_person` varchar(255) DEFAULT NULL,
|
||||||
|
`password_hash` varchar(255) DEFAULT NULL,
|
||||||
|
`password_cipher` text DEFAULT NULL,
|
||||||
|
`created_at` datetime NOT NULL DEFAULT current_timestamp(),
|
||||||
|
`updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
|
||||||
|
`edited_by` varchar(20) NOT NULL DEFAULT '0',
|
||||||
|
`freigabe` varchar(500) NOT NULL DEFAULT 'keine',
|
||||||
|
`login_active` tinyint(1) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `username_page_unique` (`username`,`password_hash`) USING BTREE,
|
||||||
|
KEY `indexFreigabe` (`freigabe`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- Admin Seed Entry (Uses Argon2id placeholder for replacement via bash sed script)
|
||||||
|
INSERT INTO `intern_benutzende` (`username`, `password_hash`, `password_cipher`, `freigabe`, `login_active`)
|
||||||
|
VALUES ('admin', '__ARGON_HASH_PLACEHOLDER__', 'not_set', '{"types":["wk_leitung","trainer","kampfrichter"],"freigabenTrainer":["admin"],"freigabenKampfrichter":["A"]}', 1);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `kategorien`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `kategorien` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`programm` text NOT NULL,
|
||||||
|
`order_index` int(11) DEFAULT NULL,
|
||||||
|
`preis` decimal(10,2) DEFAULT 0.00,
|
||||||
|
`aktiv` tinyint(1) NOT NULL DEFAULT 0,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `tabellen_konfiguration`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `tabellen_konfiguration` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`type_slug` varchar(128) NOT NULL,
|
||||||
|
`json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`json`)),
|
||||||
|
`all_noten_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`all_noten_json`)),
|
||||||
|
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||||
|
`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
|
||||||
|
`created_by` int(11) DEFAULT NULL,
|
||||||
|
`updated_by` int(11) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `unique_slug` (`type_slug`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `teilnehmende`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `teilnehmende` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`wk_id` int(11) DEFAULT NULL,
|
||||||
|
`name` text NOT NULL,
|
||||||
|
`vorname` text NOT NULL,
|
||||||
|
`geburtsdatum` date NOT NULL,
|
||||||
|
`programm` text NOT NULL,
|
||||||
|
`verein` text NOT NULL,
|
||||||
|
`bezahlt` int(11) NOT NULL DEFAULT 1,
|
||||||
|
`bezahltoverride` int(11) NOT NULL DEFAULT 0,
|
||||||
|
`betrag_bezahlt` decimal(12,2) NOT NULL DEFAULT 0.00,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `wk_index` (`wk_id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `teilnehmende_audiofiles`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `teilnehmende_audiofiles` (
|
||||||
|
`person_id` int(7) NOT NULL,
|
||||||
|
`geraet_id` int(7) NOT NULL,
|
||||||
|
`audiofile_id` int(7) NOT NULL,
|
||||||
|
UNIQUE KEY `unique_combo` (`person_id`,`geraet_id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `teilnehmende_gruppen`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `teilnehmende_gruppen` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`turnerin_id` int(11) NOT NULL,
|
||||||
|
`abteilung_id` int(11) NOT NULL,
|
||||||
|
`geraet_id` int(11) NOT NULL,
|
||||||
|
`turnerin_index` int(11) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `unique_turnerin` (`turnerin_id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `variables`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `variables` (
|
||||||
|
`name` varchar(255) NOT NULL DEFAULT 'NaN',
|
||||||
|
`value` varchar(255) DEFAULT NULL,
|
||||||
|
UNIQUE KEY `uniqueIndex` (`name`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `verbuchte_startgebueren`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `verbuchte_startgebueren` (
|
||||||
|
`order_id` int(11) NOT NULL,
|
||||||
|
`order_type` varchar(100) DEFAULT NULL,
|
||||||
|
`preis` float DEFAULT NULL,
|
||||||
|
`user_id` int(11) NOT NULL,
|
||||||
|
`item_ids` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL CHECK (json_valid(`item_ids`)),
|
||||||
|
`used_verein_konten` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
|
||||||
|
`order_status` int(11) NOT NULL DEFAULT 0,
|
||||||
|
`timestamp` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||||
|
`edited_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
|
||||||
|
PRIMARY KEY (`order_id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `verbuchte_startgebueren_log`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `verbuchte_startgebueren_log` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`order_id` int(11) NOT NULL,
|
||||||
|
`old_order_status` int(11) NOT NULL,
|
||||||
|
`new_order_status` int(11) NOT NULL,
|
||||||
|
`edited_by` int(11) NOT NULL,
|
||||||
|
`edited_at` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `vereine`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `vereine` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`verein` text NOT NULL,
|
||||||
|
`email` varchar(100) NOT NULL DEFAULT 'forms@testseite-fh.ch',
|
||||||
|
`konto` decimal(12,2) NOT NULL DEFAULT 0.00,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `indexturnerinnen` (`id`,`verein`(31))
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `warenkorb_startgebueren`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `warenkorb_startgebueren` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`user_id` bigint(20) UNSIGNED NOT NULL,
|
||||||
|
`item_id` int(11) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `basket_items_ibfk_1` (`user_id`),
|
||||||
|
KEY `basket_items_ibfk_2` (`item_id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `wertungen`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `wertungen` (
|
||||||
|
`person_id` int(11) NOT NULL,
|
||||||
|
`note_bezeichnung_id` int(11) NOT NULL,
|
||||||
|
`geraet_id` int(11) NOT NULL,
|
||||||
|
`wk_id` int(11) NOT NULL,
|
||||||
|
`run_number` tinyint(3) NOT NULL DEFAULT 1,
|
||||||
|
`value` float DEFAULT NULL,
|
||||||
|
`is_public` tinyint(1) DEFAULT NULL,
|
||||||
|
`public_value` float DEFAULT NULL,
|
||||||
|
`timestamp` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||||
|
UNIQUE KEY `uniquePersonNoteJahrGereat` (`person_id`,`note_bezeichnung_id`,`wk_id`,`geraet_id`,`run_number`) USING BTREE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `wertungen_log`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `wertungen_log` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`person_id` int(11) NOT NULL,
|
||||||
|
`note_bezeichnung_id` int(11) NOT NULL,
|
||||||
|
`geraet_id` int(11) NOT NULL,
|
||||||
|
`wk_id` int(11) NOT NULL,
|
||||||
|
`run_number` tinyint(3) NOT NULL DEFAULT 1,
|
||||||
|
`old_value` float DEFAULT NULL,
|
||||||
|
`new_value` float DEFAULT NULL,
|
||||||
|
`edited_by` int(11) NOT NULL,
|
||||||
|
`timestamp` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `wertungstypen`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `wertungstypen` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` varchar(255) NOT NULL,
|
||||||
|
`default_value` float DEFAULT NULL,
|
||||||
|
`type` enum('input','berechnung') NOT NULL DEFAULT 'input',
|
||||||
|
`berechnung` varchar(255) DEFAULT NULL,
|
||||||
|
`berechnung_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`berechnung_json`)),
|
||||||
|
`max_value` float DEFAULT NULL,
|
||||||
|
`min_value` float DEFAULT NULL,
|
||||||
|
`pro_geraet` tinyint(1) NOT NULL DEFAULT 1,
|
||||||
|
`anzahl_laeufe_json` text DEFAULT NULL,
|
||||||
|
`geraete_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '[]',
|
||||||
|
`zeige_auf_rangliste` float DEFAULT NULL,
|
||||||
|
`groesse_auf_rangliste` int(11) NOT NULL DEFAULT 0,
|
||||||
|
`nullstellen` int(11) NOT NULL DEFAULT 2,
|
||||||
|
`display_string` varchar(63) NOT NULL DEFAULT '${note}',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `uniqueName` (`name`) USING BTREE,
|
||||||
|
KEY `indexMaxValue` (`max_value`),
|
||||||
|
KEY `indexMinValue` (`min_value`),
|
||||||
|
KEY `indexBerechnungJson` (`berechnung_json`(768)),
|
||||||
|
KEY `indexDefaultValue` (`default_value`),
|
||||||
|
KEY `indexType` (`type`),
|
||||||
|
KEY `indexNullstellen` (`nullstellen`) USING BTREE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `wettkaempfe`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `wettkaempfe` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` varchar(256) NOT NULL,
|
||||||
|
`slug` varchar(64) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `slug` (`slug`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Tabellenstruktur für Tabelle `zeitplan_types`
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE `zeitplan_types` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` varchar(2048) NOT NULL,
|
||||||
|
`has_endtime` tinyint(1) DEFAULT NULL,
|
||||||
|
`display_index` int(11) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
# Dynamically set Connection header (handles 'upgrade' and 'Upgrade')
|
||||||
|
map $http_upgrade $connection_upgrade {
|
||||||
|
default upgrade;
|
||||||
|
'' close;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
|
||||||
|
# Standard HTTP Proxy to Apache
|
||||||
|
location / {
|
||||||
|
proxy_pass http://apache:80;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
# WebSocket Proxy to Node
|
||||||
|
location /ws/ {
|
||||||
|
# Note: Add trailing slash if you want Nginx to strip '/ws/' before reaching Node
|
||||||
|
proxy_pass http://node:8082/;
|
||||||
|
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection $connection_upgrade; # Dynamic connection header
|
||||||
|
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
# Keep-alive settings for long-lived WebSocket connections
|
||||||
|
proxy_read_timeout 36000s;
|
||||||
|
proxy_send_timeout 36000s;
|
||||||
|
proxy_connect_timeout 75s;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Block access to hidden files (.htaccess, .git, .env, etc.)
|
||||||
|
location ~ /\. {
|
||||||
|
deny all;
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
FROM node:20-alpine
|
||||||
|
|
||||||
|
WORKDIR /var/www/wkvs/websocket
|
||||||
|
|
||||||
|
# Install pm2 globally
|
||||||
|
RUN npm install -g pm2
|
||||||
|
|
||||||
|
# Copy package files from the websocket folder
|
||||||
|
COPY websocket/package*.json ./
|
||||||
|
|
||||||
|
# Install dependencies strictly following lockfile
|
||||||
|
RUN npm ci
|
||||||
|
|
||||||
|
# Copy the rest of the application source code from websocket folder
|
||||||
|
COPY websocket/ ./
|
||||||
|
|
||||||
|
# Change ownership to the non-root node user for security
|
||||||
|
RUN chown -R node:node /var/www/wkvs/websocket
|
||||||
|
USER node
|
||||||
|
|
||||||
|
EXPOSE 3000
|
||||||
|
|
||||||
|
CMD ["pm2-runtime", "start", "index.js"]
|
||||||
Vendored
BIN
Binary file not shown.
+91
-91
@@ -1,91 +1,91 @@
|
|||||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
This license is copied below, and is also available with a FAQ at:
|
This license is copied below, and is also available with a FAQ at:
|
||||||
https://openfontlicense.org
|
https://openfontlicense.org
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
-----------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
|
|
||||||
PREAMBLE
|
PREAMBLE
|
||||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
development of collaborative font projects, to support the font creation
|
development of collaborative font projects, to support the font creation
|
||||||
efforts of academic and linguistic communities, and to provide a free and
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
open framework in which fonts may be shared and improved in partnership
|
open framework in which fonts may be shared and improved in partnership
|
||||||
with others.
|
with others.
|
||||||
|
|
||||||
The OFL allows the licensed fonts to be used, studied, modified and
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
redistributed freely as long as they are not sold by themselves. The
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
fonts, including any derivative works, can be bundled, embedded,
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
redistributed and/or sold with any software provided that any reserved
|
redistributed and/or sold with any software provided that any reserved
|
||||||
names are not used by derivative works. The fonts and derivatives,
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
however, cannot be released under any other type of license. The
|
however, cannot be released under any other type of license. The
|
||||||
requirement for fonts to remain under this license does not apply
|
requirement for fonts to remain under this license does not apply
|
||||||
to any document created using the fonts or their derivatives.
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
DEFINITIONS
|
DEFINITIONS
|
||||||
"Font Software" refers to the set of files released by the Copyright
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
Holder(s) under this license and clearly marked as such. This may
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
include source files, build scripts and documentation.
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
"Reserved Font Name" refers to any names specified as such after the
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
copyright statement(s).
|
copyright statement(s).
|
||||||
|
|
||||||
"Original Version" refers to the collection of Font Software components as
|
"Original Version" refers to the collection of Font Software components as
|
||||||
distributed by the Copyright Holder(s).
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
or substituting -- in part or in whole -- any of the components of the
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
Original Version, by changing formats or by porting the Font Software to a
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
new environment.
|
new environment.
|
||||||
|
|
||||||
"Author" refers to any designer, engineer, programmer, technical
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
writer or other person who contributed to the Font Software.
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
PERMISSION & CONDITIONS
|
PERMISSION & CONDITIONS
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
redistribute, and sell modified and unmodified copies of the Font
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
Software, subject to the following conditions:
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
1) Neither the Font Software nor any of its individual components,
|
1) Neither the Font Software nor any of its individual components,
|
||||||
in Original or Modified Versions, may be sold by itself.
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
2) Original or Modified Versions of the Font Software may be bundled,
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
redistributed and/or sold with any software, provided that each copy
|
redistributed and/or sold with any software, provided that each copy
|
||||||
contains the above copyright notice and this license. These can be
|
contains the above copyright notice and this license. These can be
|
||||||
included either as stand-alone text files, human-readable headers or
|
included either as stand-alone text files, human-readable headers or
|
||||||
in the appropriate machine-readable metadata fields within text or
|
in the appropriate machine-readable metadata fields within text or
|
||||||
binary files as long as those fields can be easily viewed by the user.
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
3) No Modified Version of the Font Software may use the Reserved Font
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
Name(s) unless explicit written permission is granted by the corresponding
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
Copyright Holder. This restriction only applies to the primary font name as
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
presented to the users.
|
presented to the users.
|
||||||
|
|
||||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
Software shall not be used to promote, endorse or advertise any
|
Software shall not be used to promote, endorse or advertise any
|
||||||
Modified Version, except to acknowledge the contribution(s) of the
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
permission.
|
permission.
|
||||||
|
|
||||||
5) The Font Software, modified or unmodified, in part or in whole,
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
must be distributed entirely under this license, and must not be
|
must be distributed entirely under this license, and must not be
|
||||||
distributed under any other license. The requirement for fonts to
|
distributed under any other license. The requirement for fonts to
|
||||||
remain under this license does not apply to any document created
|
remain under this license does not apply to any document created
|
||||||
using the Font Software.
|
using the Font Software.
|
||||||
|
|
||||||
TERMINATION
|
TERMINATION
|
||||||
This license becomes null and void if any of the above conditions are
|
This license becomes null and void if any of the above conditions are
|
||||||
not met.
|
not met.
|
||||||
|
|
||||||
DISCLAIMER
|
DISCLAIMER
|
||||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
Vendored
BIN
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user