first spin
This commit is contained in:
@@ -1,134 +1,57 @@
|
|||||||
#/bin/bash
|
#!/bin/bash
|
||||||
echo "Start container ODOO_18: $UUID""
|
|
||||||
|
# Load functions
|
||||||
|
source /4server/sbin/start/ODOO_18.lib
|
||||||
|
|
||||||
|
# Config variables
|
||||||
|
UUID="${UUID:-default}"
|
||||||
|
BRANCH="${BRANCH:-main}"
|
||||||
|
STAGING="${STAGING:-false}"
|
||||||
|
|
||||||
|
POSTGRES_HOST="${POSTGRES_HOST:-beedb}"
|
||||||
|
POSTGRES_PORT="${POSTGRES_PORT:-5432}"
|
||||||
|
POSTGRES_ADMIN_USER="${POSTGRES_ADMIN_USER:-1gtT0sf8klB9lDbYZD9}"
|
||||||
|
POSTGRES_ADMIN_PASSWORD="${POSTGRES_ADMIN_PASSWORD:-ZpSwWNafyy9GhY2gzHw}"
|
||||||
|
ODOO_DB_USER="${UUID}"
|
||||||
|
export ODOO_DB_PASSWORD=$(echo "$SECRET" | jq -r '.psql')
|
||||||
|
|
||||||
|
BASEURL="${BASEURL:-/4SERVER/data/$UUID}"
|
||||||
|
DATA_DIR="$BASEURL/odoo/"
|
||||||
|
CUSTOM_DIR="$BASEURL/git/$UUID/custom/"
|
||||||
|
ENTERPRISE_DIR="$BASEURL/git/$UUID/enterprise/"
|
||||||
|
LOGS_DIR="$BASEURL/logs/"
|
||||||
|
CONFIG_DIR="$BASEURL/config/"
|
||||||
|
CC_DIR="$BASEURL/cc/"
|
||||||
|
BACKUP_DIR="/BACKUP/$UUID"
|
||||||
|
GIT_DIR="$BASEURL/git-server/"
|
||||||
|
ETC_DIR="$BASEURL/etc/"
|
||||||
|
INSTALL_DIR="$BASEURL/install/"
|
||||||
|
SSH_DIR="$BASEURL/.ssh/"
|
||||||
|
HUGO_DIR="$BASEURL/git-server/local/hugo"
|
||||||
|
|
||||||
export PATH=/4SERVER/sbin:$PATH
|
|
||||||
SERVER_IP=$(ip -4 addr show eth0 | awk '/inet/ {print $2}' | cut -d/ -f1)
|
SERVER_IP=$(ip -4 addr show eth0 | awk '/inet/ {print $2}' | cut -d/ -f1)
|
||||||
echo "SERVER_IP $SERVER_IP"
|
|
||||||
|
|
||||||
if [ -z "$1" ]; then
|
dump_config
|
||||||
exit 0
|
|
||||||
else
|
# Main flow
|
||||||
BASEURL="/4SERVER/data/$1/"
|
check_and_create_db
|
||||||
fi
|
|
||||||
|
DOMAIN_LABEL=$(check_domains "$UUID.odoo4projects.com" "$SERVER_IP")
|
||||||
|
DOMAIN_LABEL="$UUID.odoo4projects.com"
|
||||||
|
|
||||||
|
|
||||||
DOMAIN="$UUID.odoo4projects.com $DOMAIN"
|
PORT=$((RANDOM%1000+2200))
|
||||||
CLIENT_DOMAIN=$(cat ${BASEURL}etc/domain)
|
|
||||||
echo "CLIENT_DOMAIN: $CLIENT_DOMAIN"
|
|
||||||
echo ""
|
|
||||||
if [[ -n "$CLIENT_DOMAIN" ]]; then
|
|
||||||
DOMAIN+=" www.$CLIENT_DOMAIN $CLIENT_DOMAIN"
|
|
||||||
fi
|
|
||||||
echo "Domains: $DOMAIN"
|
|
||||||
|
|
||||||
|
|
||||||
NEW=0
|
|
||||||
if [ ! -d "$BASEURL" ]; then
|
|
||||||
echo "NEW CLIENT !!!"
|
|
||||||
echo "Wait for DNS to update"
|
|
||||||
|
|
||||||
WAIT=true
|
|
||||||
START_TIME=$(date +%s)
|
|
||||||
while $WAIT; do
|
|
||||||
nslookup "$1.odoo4projects.com" > /dev/null 2>&1
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
echo "Domain $DOMAIN resolved successfully."
|
|
||||||
WAIT=false
|
|
||||||
fi
|
|
||||||
|
|
||||||
CURRENT_TIME=$(date +%s)
|
|
||||||
ELAPSED_TIME=$((CURRENT_TIME - START_TIME))
|
|
||||||
if [ $ELAPSED_TIME -ge 120 ]; then
|
|
||||||
echo "Timeout reached. Domain $DOMAIN could not be resolved."
|
|
||||||
WAIT=false
|
|
||||||
fi
|
|
||||||
sleep 5
|
|
||||||
done
|
|
||||||
NEW=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Get valid DNS entries:"
|
|
||||||
filtered_domains=""
|
|
||||||
|
|
||||||
for domain in $DOMAIN; do
|
|
||||||
nslookup_output=$(nslookup "$domain" 2>/dev/null)
|
|
||||||
status=$?
|
|
||||||
|
|
||||||
echo "DOMAIN: $domain $status"
|
|
||||||
if [[ $status -eq 0 ]]; then
|
|
||||||
#ns_ip=$(echo "$nslookup_output" | grep 'Address:' | tail -n1 | awk '{print $2}')
|
|
||||||
ns_ip=$(echo "$nslookup_output" | grep -Eo 'Address: ([0-9]{1,3}\.){3}[0-9]{1,3}' | awk '{print $2}' | tail -n1)
|
|
||||||
|
|
||||||
echo "NS IP $ns_ip"
|
|
||||||
if [[ "$ns_ip" == "$SERVER_IP" ]]; then
|
|
||||||
filtered_domains+=" $domain"
|
|
||||||
echo "Domain added $filtered_domains"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "Failed to nslookup $domain -- $ns_ip"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
filtered_domains=$(echo "$filtered_domains" | xargs)
|
|
||||||
echo "Filtered domains: $filtered_domains"
|
|
||||||
|
|
||||||
|
|
||||||
DOMAIN_LABEL=""
|
|
||||||
|
|
||||||
for domain in $filtered_domains; do
|
|
||||||
if [ -z "$DOMAIN_LABEL" ]; then
|
|
||||||
DOMAIN_LABEL="traefik.http.routers.$1.rule=Host(\`$domain\`)"
|
|
||||||
else
|
|
||||||
DOMAIN_LABEL+=" || Host(\`$domain\`)"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
echo $DOMAIN_LABEL
|
|
||||||
|
|
||||||
echo "end domains"
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
echo "BASEURL: $BASEURL"
|
|
||||||
PORT=$((CONTRACT_ID + 2200))
|
|
||||||
echo "CREATING PORT $PORT"
|
|
||||||
UUID="${1:-default}"
|
|
||||||
DATA_DIR="${BASEURL}odoo/"
|
|
||||||
CUSTOM_DIR="${BASEURL}git/$UUID/custom/"
|
|
||||||
ENTERPRISE_DIR="${BASEURL}git/$UUID/enterprise/"
|
|
||||||
LOGS_DIR="${BASEURL}logs/"
|
|
||||||
CONFIG_DIR="${BASEURL}config/"
|
|
||||||
CC_DIR="${BASEURL}cc/"
|
|
||||||
BACKUP_DIR="/BACKUP/$1"
|
|
||||||
GIT_DIR="${BASEURL}git-server/"
|
|
||||||
ETC_DIR="${BASEURL}etc/"
|
|
||||||
INSTALL_DIR="${BASEURL}install/"
|
|
||||||
SSH_DIR="${BASEURL}.ssh/"
|
|
||||||
HUGO_DIR="${BASEURL}git-server/local/hugo"
|
|
||||||
|
|
||||||
log restoreODOO "DOMAIN_LABEL $DOMAIN_LABEL"
|
|
||||||
|
|
||||||
log restoreODOO "CREATING CONTAINER $UUID"
|
|
||||||
|
|
||||||
echo "Stopping and Deleting Contianer"
|
|
||||||
d stop $UUID
|
|
||||||
d container rm $UUID
|
|
||||||
echo "Done Stopping & Deleting containers Errors above are OK"
|
|
||||||
|
|
||||||
|
doas docker stop "$UUID" 2>/dev/null
|
||||||
|
doas docker rm "$UUID" 2>/dev/null
|
||||||
|
|
||||||
EXTRA_DOCKER_PARAMETER=""
|
EXTRA_DOCKER_PARAMETER=""
|
||||||
if [ -d "$HUGO_DIR" ]; then
|
if [ -d "$HUGO_DIR" ]; then
|
||||||
EXTRA_DOCKER_PARAMETER="-v $HUGO_DIR:/mnt/hugo"
|
EXTRA_DOCKER_PARAMETER="-v $HUGO_DIR:/mnt/hugo"
|
||||||
fi
|
fi
|
||||||
echo "******************"
|
|
||||||
echo $EXTRA_DOCKER_PARAMETER
|
doas docker run -d --name "$UUID" \
|
||||||
echo $HUGO_DIR
|
--network 4server_4projects \
|
||||||
echo ***********************""
|
|
||||||
# start container - check done in checkContractsBee
|
|
||||||
sudo docker run -d --name "$UUID" \
|
|
||||||
--network docker-compose_4projects \
|
|
||||||
--restart=always \
|
--restart=always \
|
||||||
$EXTRA_DOCKER_PARAMETER \
|
$EXTRA_DOCKER_PARAMETER \
|
||||||
-v "$DATA_DIR/odoo-web-data:/var/lib/odoo" \
|
-v "$DATA_DIR/odoo-web-data:/var/lib/odoo" \
|
||||||
@@ -143,41 +66,12 @@ echo ***********************""
|
|||||||
-v "$INSTALL_DIR:/mnt/install" \
|
-v "$INSTALL_DIR:/mnt/install" \
|
||||||
-v "$SSH_DIR:/etc/sshkey" \
|
-v "$SSH_DIR:/etc/sshkey" \
|
||||||
-p "$PORT:22" \
|
-p "$PORT:22" \
|
||||||
-e HOST=beedb \
|
-e HOST="$POSTGRES_HOST" \
|
||||||
-e USER=$UUID \
|
-e USER="$ODOO_DB_USER" \
|
||||||
-e PASSWORD=$UUID \
|
-e PASSWORD="$ODOO_DB_PASSWORD" \
|
||||||
-e STAGING=$STAGING \
|
-e STAGING="$STAGING" \
|
||||||
--label "$DOMAIN_LABEL" \
|
--label "$DOMAIN_LABEL" \
|
||||||
--label "traefik.http.services.$1.loadbalancer.server.port=8069" \
|
--label "traefik.http.services.$UUID.loadbalancer.server.port=8069" \
|
||||||
--label "traefic.http.routers.$1.entrypoints=web, websecure" \
|
|
||||||
--label "traefik.http.routers.$1.tls.certresolver=production" \
|
|
||||||
--label "traefik.http.routers.$1.tls=true" \
|
|
||||||
--label "traefik.http.routers.$1.service=$1" \
|
|
||||||
--label "traefik.http.routers.$1_S.entrypoints=web,websecure" \
|
|
||||||
--label "traefik.http.routers.$1_S.rule=Host(\`s.$1.odoo4projects.com\`)" \
|
|
||||||
--label "traefik.http.routers.$1_S.tls.certresolver=production" \
|
|
||||||
--label "traefik.http.routers.$1_S.tls=true" \
|
|
||||||
--label "traefik.http.services.$1_S.loadbalancer.server.port=8070" \
|
|
||||||
--label "traefik.http.routers.$1_S.service=$1_S" \
|
|
||||||
docker.odoo4projects.com/4projects/odoo_18:$BRANCH
|
docker.odoo4projects.com/4projects/odoo_18:$BRANCH
|
||||||
sudo chmod 777 $DATA_DIR/odoo-web-data
|
|
||||||
sudo mkdir $ETC_DIR
|
|
||||||
sudo chmod 777 $ETC_DIR
|
|
||||||
sudo chmod 777 $INSTALL_DIR
|
|
||||||
sudo cp /4PROJECTS/config/odoo_18/odoo.conf $CONFIG_DIR
|
|
||||||
sudo cp /4PROJECTS/config/odoo_18/staging.conf $CONFIG_DIR
|
|
||||||
echo "git clone ssh://git@$1.odoo4projects.com:$PORT/git-server/repos/odoo.git" > $ETC_DIR/gitpath
|
|
||||||
echo "$1" > $ETC_DIR/uuid
|
|
||||||
d exec -it $1 chown -R odoo /mnt
|
|
||||||
d exec -it $1 chgrp -R odoo /mnt/
|
|
||||||
d exec -it $1 chown -R git /git-server
|
|
||||||
d exec -it $1 chgrp -R git /git-server
|
|
||||||
d exec -it $1 chmod -R g+rw /git-server
|
|
||||||
if [ "$NEW" -eq 1 ]; then
|
|
||||||
restoreODOO $1 default.zip
|
|
||||||
echo "here"
|
|
||||||
restoreODOO ${1}_ default.zip
|
|
||||||
echo "there"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
110
app/sbin/start/ODOO_18.lib
Normal file
110
app/sbin/start/ODOO_18.lib
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
dump_config (){
|
||||||
|
echo "========== Odoo Container Configuration =========="
|
||||||
|
echo "UUID: $UUID"
|
||||||
|
echo "BRANCH: $BRANCH"
|
||||||
|
echo "STAGING: $STAGING"
|
||||||
|
echo
|
||||||
|
echo "PostgreSQL Host: $POSTGRES_HOST"
|
||||||
|
echo "PostgreSQL Port: $POSTGRES_PORT"
|
||||||
|
echo "PostgreSQL Admin: $POSTGRES_ADMIN_USER / $POSTGRES_ADMIN_PASSWORD"
|
||||||
|
echo "ODOO DB User: $ODOO_DB_USER"
|
||||||
|
echo "ODOO DB Password: $ODOO_DB_PASSWORD"
|
||||||
|
echo
|
||||||
|
echo "BASEURL: $BASEURL"
|
||||||
|
echo "DATA_DIR: $DATA_DIR"
|
||||||
|
echo "CUSTOM_DIR: $CUSTOM_DIR"
|
||||||
|
echo "ENTERPRISE_DIR: $ENTERPRISE_DIR"
|
||||||
|
echo "LOGS_DIR: $LOGS_DIR"
|
||||||
|
echo "CONFIG_DIR: $CONFIG_DIR"
|
||||||
|
echo "CC_DIR: $CC_DIR"
|
||||||
|
echo "BACKUP_DIR: $BACKUP_DIR"
|
||||||
|
echo "GIT_DIR: $GIT_DIR"
|
||||||
|
echo "ETC_DIR: $ETC_DIR"
|
||||||
|
echo "INSTALL_DIR: $INSTALL_DIR"
|
||||||
|
echo "SSH_DIR: $SSH_DIR"
|
||||||
|
echo "HUGO_DIR: $HUGO_DIR"
|
||||||
|
echo
|
||||||
|
echo "SERVER_IP: $SERVER_IP"
|
||||||
|
echo "=================================================="
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------
|
||||||
|
# Function: Create PostgreSQL user
|
||||||
|
# -----------------------------
|
||||||
|
|
||||||
|
check_and_create_db() {
|
||||||
|
|
||||||
|
echo "Connecting as $POSTGRES_ADMIN_USER to $POSTGRES_HOST:$POSTGRES_PORT"
|
||||||
|
|
||||||
|
# -----------------------------
|
||||||
|
# Check if user exists
|
||||||
|
# -----------------------------
|
||||||
|
USER_EXISTS=$(PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='$ODOO_DB_USER';" | grep -q 1 && echo "yes" || echo "no")
|
||||||
|
if [ "$USER_EXISTS" = "no" ]; then
|
||||||
|
echo "Creating PostgreSQL user $ODOO_DB_USER..."
|
||||||
|
PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres -c "CREATE USER \"$ODOO_DB_USER\" WITH PASSWORD '$ODOO_DB_PASSWORD';"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# -----------------------------
|
||||||
|
# Check if database exists
|
||||||
|
# -----------------------------
|
||||||
|
DB_EXISTS=$(PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres -tAc "SELECT 1 FROM pg_database WHERE datname='$UUID';" | grep -q 1 && echo "yes" || echo "no")
|
||||||
|
|
||||||
|
if [ "$DB_EXISTS" = "no" ]; then
|
||||||
|
echo "Creating PostgreSQL database $UUID owned by $ODOO_DB_USER..."
|
||||||
|
PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres -c "CREATE DATABASE \"$UUID\" OWNER \"$ODOO_DB_USER\";"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PGPASSWORD="${POSTGRES_ADMIN_PASSWORD}" psql -h "${POSTGRES_HOST}" -U "${POSTGRES_ADMIN_USER}" -p "${POSTGRES_PORT}" -d postgres <<EOF
|
||||||
|
DO
|
||||||
|
\$do\$
|
||||||
|
BEGIN
|
||||||
|
IF NOT EXISTS (
|
||||||
|
SELECT
|
||||||
|
FROM pg_catalog.pg_user
|
||||||
|
WHERE usename = '${ODOO_DB_USER}') THEN
|
||||||
|
|
||||||
|
CREATE USER ${ODOO_DB_USER} WITH PASSWORD '${ODOO_DB_PASSWORD}';
|
||||||
|
END IF;
|
||||||
|
END
|
||||||
|
\$do\$;
|
||||||
|
EOF
|
||||||
|
echo "User '${ODOO_DB_USER}' created (or already exists)."
|
||||||
|
}
|
||||||
|
|
||||||
|
# -----------------------------
|
||||||
|
# Function: Check DNS and build Traefik labels
|
||||||
|
# -----------------------------
|
||||||
|
check_domains() {
|
||||||
|
local domains="$1"
|
||||||
|
local server_ip="$2"
|
||||||
|
|
||||||
|
echo "Checking DNS resolution for domains: $domains"
|
||||||
|
local filtered_domains=""
|
||||||
|
for domain in $domains; do
|
||||||
|
ns_ip=$(nslookup "$domain" 2>/dev/null | grep -Eo 'Address: ([0-9]{1,3}\.){3}[0-9]{1,3}' | awk '{print $2}' | tail -n1)
|
||||||
|
if [[ "$ns_ip" == "$server_ip" ]]; then
|
||||||
|
filtered_domains+=" $domain"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
filtered_domains=$(echo "$filtered_domains" | xargs)
|
||||||
|
|
||||||
|
DOMAIN_LABEL=""
|
||||||
|
for domain in $filtered_domains; do
|
||||||
|
if [ -z "$DOMAIN_LABEL" ]; then
|
||||||
|
DOMAIN_LABEL="traefik.http.routers.$UUID.rule=Host(\`$domain\`)"
|
||||||
|
else
|
||||||
|
DOMAIN_LABEL+=" || Host(\`$domain\`)"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "$DOMAIN_LABEL"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -5,11 +5,13 @@ services:
|
|||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
- POSTGRES_DB=postgres
|
- POSTGRES_DB=postgres
|
||||||
- POSTGRES_PASSWORD=deradmin
|
- POSTGRES_PASSWORD=ZpSwWNafyy9GhY2gzHw
|
||||||
- POSTGRES_USER=deradmin1
|
- POSTGRES_USER=1gtT0sf8klB9lDbYZD9
|
||||||
volumes:
|
volumes:
|
||||||
- /4server/data/postgres:/var/lib/postgresql/data/
|
- /4server/data/postgres/data/:/var/lib/postgresql/data/
|
||||||
- /4server/data/pg_backup/:/BACKUP/
|
- /4server/data/postgres/pg_backup/:/BACKUP/
|
||||||
|
- /4server/data/postgres/etc/:/etc/postgresql/16/main/
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
4projects:
|
4projects:
|
||||||
ipv4_address: 10.5.0.200
|
ipv4_address: 10.5.0.200
|
||||||
|
|||||||
3
app/templates/pg_hba.conf
Normal file
3
app/templates/pg_hba.conf
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Example: allow your host to connect to all DBs as any user with password
|
||||||
|
host all all 10.5.0.1/32 md5
|
||||||
|
|
||||||
14
app/update
14
app/update
@@ -7,6 +7,11 @@ rex doas chown 4server:4server /4server
|
|||||||
rex mkdir -p /4server/data/log
|
rex mkdir -p /4server/data/log
|
||||||
template templates/hosts /etc/hosts
|
template templates/hosts /etc/hosts
|
||||||
|
|
||||||
|
### BACKUP DIR
|
||||||
|
rex doas mkdir -p /BACKUP
|
||||||
|
rex doas chmod 777 /BACKUP
|
||||||
|
rex doas chown 4server:4server /BACKUP
|
||||||
|
|
||||||
template templates/.profile /home/4server/.profile
|
template templates/.profile /home/4server/.profile
|
||||||
|
|
||||||
### PACKAGES
|
### PACKAGES
|
||||||
@@ -20,6 +25,12 @@ rex doas pip install --root-user-action ignore --break-system-packages --no-cach
|
|||||||
echo "Running prsync ./sbin"
|
echo "Running prsync ./sbin"
|
||||||
prsync -h "/app/host_vars/hosts" -avz ./sbin/ /4server/sbin/
|
prsync -h "/app/host_vars/hosts" -avz ./sbin/ /4server/sbin/
|
||||||
|
|
||||||
|
### POSTGRESS
|
||||||
|
rex mkdir -p /4server/data/postgres/etc
|
||||||
|
template templates/pq_hba.conf /4server/data/postgres/etc/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### API
|
### API
|
||||||
|
|
||||||
@@ -42,6 +53,9 @@ rex doas rc-service docker start
|
|||||||
rex doas rc-update add docker boot
|
rex doas rc-update add docker boot
|
||||||
|
|
||||||
|
|
||||||
|
#LOGIN ODOO4PROJECTS DOCKER REPO
|
||||||
|
rex "echo 'Airbus12docker' | doas docker login docker.odoo4projects.com -u admin --password-stdin"
|
||||||
|
|
||||||
|
|
||||||
rex mkdir -p /4server/data/traefik/etc
|
rex mkdir -p /4server/data/traefik/etc
|
||||||
template templates/traefik.yaml /4server/data/traefik/etc/traefik.yaml
|
template templates/traefik.yaml /4server/data/traefik/etc/traefik.yaml
|
||||||
|
|||||||
Reference in New Issue
Block a user