Sign inSign up

jonyrh/online_answer

By jonyrh

•Updated 3 months ago

Image
0

401

jonyrh/online_answer repository overview

1. Перед запуском требуется установить зависимости и подготовить окружение:

# для ALT Linux
su -
control sudowheel enabled
control newuidmap public
control newgidmap public
exit

sudo apt-get update && sudo apt-get dist-upgrade

# для docker
sudo apt-get install docker.io

# для podman
sudo apt-get install podman

sudo apt-get install docker-compose-v2 openssl sed grep gawk nano
sudo groupadd docker
sudo usermod -aG docker $USER

# для docker
sudo systemctl enable docker
sudo systemctl start docker

# для podman (rootless)
sudo touch /etc/containers/nodocker
sudo sysctl -w kernel.unprivileged_userns_clone=1
echo "kernel.unprivileged_userns_clone=1" | sudo tee /etc/sysctl.d/99-podman.conf
sudo usermod --add-subuids 100000-165535 $USER
sudo usermod --add-subgids 100000-165535 $USER
echo 'export DOCKER_HOST="unix://$(podman info -f "{{.Host.RemoteSocket.Path}}")"' >> ~/.bashrc
echo "alias docker=podman" >> ~/.bashrc
source ~/.bashrc
loginctl enable-linger $USER
sudo systemctl enable podman.service
sudo systemctl start podman.service
systemctl --user enable --now podman.socket
podman system migrate

sudo reboot

2. В каталоге /opt/online_answer создайте файл docker-compose.yaml, но не запускайте его!

sudo mkdir -p /opt/online_answer
sudo chmod 777 /opt/online_answer
cd /opt/online_answer
nano docker-compose.yaml

Файл docker-compose.yaml

name: online_answer

services:
  app:
    image: jonyrh/online_answer:latest
    container_name: online_answer_app
    stdin_open: true
    tty: true
    environment:
      - ONLINE_ANSWER_PASSWORD=${ONLINE_ANSWER_PASSWORD}
      - ONLINE_ANSWER_TZ=${ONLINE_ANSWER_TZ}
    networks:
      - network
    ports:
      - "9010:9010"
    volumes:
      - ./data/backups:/root/online_answer/backups
      - ./data/out:/root/online_answer/out
      - ./data/settings.ini:/root/online_answer/settings.ini
      - ./data/webapp.pem:/root/online_answer/webapp.pem
      - ./data/ignore_ip_addresses.txt:/root/online_answer/ignore_ip_addresses.txt
      - db_tmp:/var/online_answer:Z
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy

  db:
    image: mariadb:lts
    container_name: online_answer_db
    environment:
      - MARIADB_ROOT_PASSWORD=${ONLINE_ANSWER_PASSWORD}
      - MARIADB_ROOT_HOST=%
      - TZ=${ONLINE_ANSWER_TZ}
    networks:
      - network
    volumes:
      - db_data:/var/lib/mysql
      - db_tmp:/var/online_answer:Z
    command: >
      sh -c "mkdir -p /var/online_answer &&
             chmod 777 -R /var/online_answer &&
             exec docker-entrypoint.sh mariadbd --default-time-zone=\"\$$TZ\""
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      start_period: 30s
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  db_data:
    name: online_answer_db
  db_tmp:
    name: online_answer_tmp

networks:
  network:
    driver: bridge

3. Для настройки окружения, в каталоге /opt/online_answer с файлом docker-compose.yaml, создайте файл-скрипт prepare_online.sh и запустите его:

nano prepare_online.sh
chmod +x prepare_online.sh && ./prepare_online.sh

Файл prepare_online.sh

#!/bin/bash
set -e

ask_confirm() {
    read -p "$1 (y/n + Enter): " -r
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        echo "Canceled..."
        exit 1
    fi
}

echo
echo "********************************************"
echo "*** Preparing for install Online Answer ***"
echo "********************************************"
echo

ask_confirm "Remove ALL DATA and prepare to new installation?"
ask_confirm "You a shure?"

sudo -v
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &

echo "[installing] Remove docker data..."
echo
docker compose down -v --rmi local 2>/dev/null || true
echo

echo "[installing] Recreating directories and setting permissions..."
sudo rm -R ./data 2>/dev/null || true
mkdir ./data
mkdir -p ./data/backups ./data/out
echo "empty" > ./data/ignore_ip_addresses.txt

ONLINE_ANSWER_PASSWORD=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 16)
ONLINE_ANSWER_TZ=$(readlink /etc/localtime | sed 's|.*/zoneinfo/||')

echo
read -p "Enter DB Password: [$ONLINE_ANSWER_PASSWORD]: " READ_PASSWORD
READ_PASSWORD=${READ_PASSWORD:-"$ONLINE_ANSWER_PASSWORD"}

while true; do
    read -p "Enter TimeZone: [$ONLINE_ANSWER_TZ]: " READ_TZ
    READ_TZ=${READ_TZ:-"$ONLINE_ANSWER_TZ"}
    if [ -f "/usr/share/zoneinfo/$READ_TZ" ]; then
        break
    else
        echo "Error: '$READ_TZ' is not a valid timezone."
        echo "Available examples: Europe/Moscow, Asia/Yekaterinburg"
    fi
done

ONLINE_ANSWER_PASSWORD=$READ_PASSWORD
ONLINE_ANSWER_TZ=$READ_TZ

cat <<EOF > .env
ONLINE_ANSWER_PASSWORD=$ONLINE_ANSWER_PASSWORD
ONLINE_ANSWER_TZ=$ONLINE_ANSWER_TZ
EOF

ONLINE_ANSWER_IP=$(ip -4 addr show scope global | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1)
ONLINE_ANSWER_IPS=$(ip -4 addr show scope global | awk '/inet / {print $2}' | cut -d/ -f1 | sed 's/^/IP:/' | paste -sd "," -)
ONLINE_ANSWER_HOST=$(hostname -f 2>/dev/null | grep -vE 'localhost|localdomain' || hostname)

echo
echo "Host IP: $ONLINE_ANSWER_IP"
echo "Host Name: $ONLINE_ANSWER_HOST"
echo
read -p "USB KEY HOST: [$ONLINE_ANSWER_IP]: " ONLINE_ANSWER_USB
ONLINE_ANSWER_USB=${ONLINE_ANSWER_USB:-"$ONLINE_ANSWER_IP"}

echo "[installing] Generating SSL certificate..."
echo
openssl req -x509 -newkey rsa:2048 -nodes -days 3650 \
  -keyout ./key.pem -out ./cert.pem \
  -subj "/CN=$ONLINE_ANSWER_HOST" \
  -addext "subjectAltName = DNS:$ONLINE_ANSWER_HOST, $ONLINE_ANSWER_IPS"
cat ./key.pem ./cert.pem > ./data/webapp.pem
rm -f ./key.pem ./cert.pem 2>/dev/null || true
echo
echo "[installing] Creating settings.ini..."
cat <<EOF > ./data/settings.ini
[license]
grd_usbkey_host=$ONLINE_ANSWER_USB

[database]
db_engine=mariadb
db_library=/usr/lib/x86_64-linux-gnu/libmariadb.so.3
db_tmp_path=/var/online_answer/
db_host=db
db_port=3306
db_base=online_answer
db_user=root
db_password=
EOF

find ./data -type d -exec chmod 777 {} +
find ./data -type f -exec chmod 666 {} +

echo "[installing] Loading images to docker..."
docker compose pull

echo
echo "[installing] Success! Run: docker compose up -d"
echo
echo "[installing] URL: https://$ONLINE_ANSWER_IP:9010"
echo "[installing] URL: https://$ONLINE_ANSWER_HOST:9010"
echo

4. Запуск контейнеров. Для Podman (rootless), в каталоге пользователя, необходимо создать файл сервиса online_answer.service для автоматического запуска:

# для docker
docker compose up -d

# для podman (rootless)
mkdir -p ~/.config/systemd/user/
nano ~/.config/systemd/user/online_answer.service
systemctl --user daemon-reload
systemctl --user enable --now online_answer.service

Файл online_answer.service

[Unit]
Description=Online Answer Podman Compose
After=network-online.target
Requires=podman.socket
After=podman.socket

[Service]
Type=simple
WorkingDirectory=/opt/online_answer
ExecStart=/usr/bin/podman compose up
ExecStop=/usr/bin/podman compose down
Restart=always

[Install]
WantedBy=default.target

Tag summary

Content type

Image

Digest

sha256:80026ae19…

Size

158 MB

Last updated

3 months ago

docker pull jonyrh/online_answer