Задать вопрос
  • Как исправить ошибку загрузки файлов assets при открытии yii2 проекта запущенного с docker compose?

    @Programep Автор вопроса
    mureevms, переделал nginx.conf, теперь видно стартовую страницу yii2, но похоже параметры url не передаются в php-fpm контейнер, чтобы yii2 разбирал запросы вида `/api/controller/method`
    nginx.conf:
    server {
        listen      80;
        server_name _;
    
        access_log /var/log/nginx/bld_gui_access.log;
        error_log /var/log/nginx/bld_gui_error.log;
    
        root   /var/www;
        index  index.html;
    
        location / {
            try_files  $uri $uri/ /index.html;
        }
    
        location /api_v1/ {
            # root /var/www/html/api_v1/web;
            # rewrite ^/api_v1/(.*)$ /var/www/html/web/index.php?r=$1;
            # index  index.php;
            try_files $uri $uri/ /var/www/html/web/index.php$is_args$args;
            # try_files $uri $uri/ /var/www/html/web/index.php?$query_string;
        }
    
        # location ~ [^/]\.php(/|$) {
        location ~ \.php$ {
            include fastcgi_params;
            # fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            fastcgi_split_path_info  ^(.+\.php)(.*)$;
            fastcgi_pass bld-fpm:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
            # try_files $uri =404;
        }
    }

    У вас в php-fpm контейнере работает один скрипт php или php фреймворк?
  • Как исправить ошибку загрузки файлов assets при открытии yii2 проекта запущенного с docker compose?

    @Programep Автор вопроса
    mureevms, переделал почти как у вас, но почему-то nginx не отправляет полный путь запроса в fpm-контейнер.
    Конфиг nginx:
    server {
        listen      80;
        server_name _;
    
        access_log /var/log/nginx/bld_gui_access.log;
        error_log /var/log/nginx/bld_gui_error.log;
    
        root   /var/www;
        index  index.html;
    
        location / {
            try_files  $uri $uri/ /index.html;
        }
    
        location /api_v1/ {
            # root /var/www/html/api_v1/web;
            rewrite ^/api_v1/(.*)$ /var/www/html/api_v1/web/index.php?r=$1;
            # index  index.php;
            # try_files $uri $uri/ /var/www/html/api_v1/web/index.php$is_args$args;
            # try_files $uri $uri/ /index.php$is_args$args;
        }
    
        location ~ [^/]\.php(/|$) {
        # location ~ \.php$ {
            root /var/www/html/web;
            include fastcgi_params;
            # fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            fastcgi_pass bld-fpm:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /var/www/html/web$fastcgi_script_name;
            # try_files $uri =404;
        }
    }

    В php-fpm.conf добавил:
    chdir = /var/www/html/web

    Access log nginx показывает ошибку:
    172.31.0.1 - - [30/Dec/2022:18:58:33 +0000] "GET /api_v1/game/list HTTP/1.1" 404 36 "http://127.0.0.1:8080/list" "Mozilla/5.0 (X11; Linux x86_64; rv:107.0) Gecko/20100101 Firefox/107.0"


    Error log nginx:
    2022/12/30 18:58:33 [error] 31#31: *1 FastCGI sent in stderr: "Unable to open primary script: /var/www/html/web/var/www/html/api_v1/web/index.php (No such file or directory)" while reading response header from upstream, client: 172.31.0.1, server: _, request: "GET /api_v1/game/list HTTP/1.1", upstream: "fastcgi://172.31.0.4:9000", host: "127.0.0.1:8080", referrer: "http://127.0.0.1:8080/list"


    Access log php-fpm:
    127.0.0.1 -  30/Dec/2022:18:58:33 +0000 "GET /var/www/html/api_v1/web/index.php" 404
  • Как исправить ошибку загрузки файлов assets при открытии yii2 проекта запущенного с docker compose?

    @Programep Автор вопроса
    mureevms, текущий конфиг nginx:
    server {
        listen 80;
    
        root /var/www/html/backend/web;
        index index.php;
        access_log  /var/www/html/access.log;
        error_log   /var/www/html/error.log;
    
        location / {
            try_files $uri $uri/ /index.php$is_args$args;
        }
    
        location ~ \.php$ {
            include fastcgi_params;
            fastcgi_pass yii2-fpm:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        }
    }

    конфиг создавался на базе того, что указан в руководстве https://www.yiiframework.com/doc/guide/1.1/ru/quic....
    У вас получалось настроить работу приложения при работе nginx, php-fpm в разных docker контейнерах?
    Как я понял assets формируются при запросе в php-fpm контейнере, и если не использовать общий volume для nginx, php-fpm контейнеров, то контейнер nginx не получит доступ к сгенерированным внутри контейнера php-fpm файлам assets, т.к. внутри php-fpm контейнера запускается только процесс php-fpm, который обрабатывает php-код.
  • Как исправить ошибку загрузки файлов assets при открытии yii2 проекта запущенного с docker compose?

    @Programep Автор вопроса
    mureevms, конфиг nginx?
    Настроил так что volume с assets у контейнера с nginx и php-fpm общий.
  • Как использовать Gitlab runner SaaS на самом gitlab.com?

    @Programep Автор вопроса
    Ваш пример работает, только мне нужно запустить сборку apk.
    Последний запуск pipeline выдает такой лог:
    Running with gitlab-runner 15.2.0~beta.17.g34ae4a68 (34ae4a68)
      on blue-3.shared.runners-manager.gitlab.com/default zxwgkjAP
    Preparing the "docker+machine" executor 00:11
    Using Docker executor with image docker:20.10.16 ...
    Pulling docker image docker:20.10.16 ...
    Using docker image sha256:2a153cb5c7c52610ceb46876231f1c7ab8d2a0926aaeb5283994ef3d6f78def9 for docker:20.10.16 with digest docker@sha256:5bc07a93c9b28e57a58d57fbcf437d1551ff80ae33b4274fb60a1ade2d6c9da4 ...
    Preparing environment 00:03
    Running on runner-zxwgkjap-project-30457055-concurrent-0 via runner-zxwgkjap-shared-1658524451-af2d1fff...
    Getting source from Git repository 00:02
    $ eval "$CI_PRE_CLONE_SCRIPT"
    Fetching changes with git depth set to 50...
    Initialized empty Git repository in /builds/taxivek/takivek-ionic/.git/
    Created fresh repository.
    Checking out d98c03ac as test_simple_gitlabci...
    Skipping Git submodules setup
    Executing "step_script" stage of the job script 00:00
    Using docker image sha256:2a153cb5c7c52610ceb46876231f1c7ab8d2a0926aaeb5283994ef3d6f78def9 for docker:20.10.16 with digest docker@sha256:5bc07a93c9b28e57a58d57fbcf437d1551ff80ae33b4274fb60a1ade2d6c9da4 ...
    $ echo "${ACCESS_TOKEN}" || docker login -u Deployer --password-stdin registry.gitlab.com
    $ docker build -t my-docker-image -f ./docker/Dockerfile .
    error during connect: Post "http://docker:2375/v1.24/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=docker%2FDockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=my-docker-image&target=&ulimits=null&version=1": dial tcp: lookup docker on 169.254.169.254:53: no such host
    Cleaning up project directory and file based variables 00:01
    ERROR: Job failed: exit code 1

    .gitlab-ci.yml такой:
    image: docker:20.10.16
    
    build:
      before_script:
        - echo "${ACCESS_TOKEN}" || docker login -u Deployer --password-stdin registry.gitlab.com
      script:
        - docker build -t my-docker-image -f ./docker/Dockerfile .
      artifacts:
        paths:
          - workdir/android/app/build/outputs/apk/debug/*.apk

    а Dockerfile такой:
    FROM ubuntu:18.04 as prepare
    
    ARG JAVA_VERSION=11
    ARG NODEJS_VERSION=16
    ARG ANDROID_SDK_VERSION=8512546
    ARG ANDROID_BUILD_TOOLS_VERSION=31.0.0
    ARG ANDROID_PLATFORMS_VERSION=29
    ARG ANDROID_CMDLINE_TOOLS_FOLDER=cmdline-tools
    ARG GRADLE_VERSION=7.0
    
    RUN apt-get update -q
    
    # General packages
    RUN apt-get install -qy \
      curl \
      unzip \
      openjdk-${JAVA_VERSION}-jre \
      openjdk-${JAVA_VERSION}-jdk
    
    # Install Gradle
    ENV GRADLE_HOME=/opt/gradle
    RUN mkdir $GRADLE_HOME \
      && curl -sL https://downloads.gradle-dn.com/distributions/gradle-${GRADLE_VERSION}-bin.zip -o gradle-${GRADLE_VERSION}-bin.zip \
      && unzip -d $GRADLE_HOME gradle-${GRADLE_VERSION}-bin.zip
    ENV PATH=$PATH:/opt/gradle/gradle-${GRADLE_VERSION}/bin
    
    # Install Android SDK tools
    ENV ANDROID_HOME=/opt/android-sdk
    RUN curl -sL https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_VERSION}_latest.zip -o commandlinetools-linux-${ANDROID_SDK_VERSION}_latest.zip \
      && unzip commandlinetools-linux-${ANDROID_SDK_VERSION}_latest.zip \
      && mkdir $ANDROID_HOME && mv ${ANDROID_CMDLINE_TOOLS_FOLDER} $ANDROID_HOME \
      && yes | $ANDROID_HOME/${ANDROID_CMDLINE_TOOLS_FOLDER}/bin/sdkmanager --sdk_root=$ANDROID_HOME --licenses \
      && $ANDROID_HOME/${ANDROID_CMDLINE_TOOLS_FOLDER}/bin/sdkmanager --sdk_root=$ANDROID_HOME "platform-tools" "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" "platforms;android-${ANDROID_PLATFORMS_VERSION}"
    ENV PATH=$PATH:${ANDROID_HOME}/${ANDROID_CMDLINE_TOOLS_FOLDER}:${ANDROID_HOME}/platform-tools
    
    # Install NodeJS
    RUN curl -sL https://deb.nodesource.com/setup_${NODEJS_VERSION}.x | bash - \
      && apt-get update -q && apt-get install -qy nodejs
    ENV NPM_CONFIG_PREFIX=${HOME}/.npm-global
    ENV PATH=$PATH:${HOME}/.npm-global/bin
    
    # Clean up
    RUN apt-get autoremove -y \
      && apt-get clean -y \
      && rm -rf /var/lib/apt/lists/* \
      && rm -rf /tmp/*
    
    WORKDIR /workdir
    
    COPY . /workdir/
    
    RUN npm install -g @ionic/cli
    RUN npm install @capacitor/core
    RUN npm install @capacitor/cli --save-dev
    RUN npm install --save
    
    RUN ionic capacitor copy android
  • Как сделать автокоррекцию timer в RxJS?

    @Programep Автор вопроса
    Антон Швец, поэтому я задал вопрос.) Вы сталкивались с этим, можете подсказать какой оператор использовать? Сегодня пробовал такое решение, но оно естественно не работает. Также нашел оператор expand, но пока не понял подойдет он для решения или нет.
    import { Component, OnInit } from '@angular/core';
    import { timer, pipe } from 'rxjs';
    import { tap, takeWhile } from 'rxjs/operators';
    
    @Component({
      selector: 'app-root',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.css']
    })
    export class AppComponent implements OnInit {
      title = 'test-timers';
      latency = 5000;
      time1onoff = true;
      timer1;
      time2onoff = false;
      timer2;
    
      ngOnInit(){
        console.log('init');
        this.timer1 = timer(0, this.latency).pipe(      
          takeWhile( val => this.time1onoff )
        ).subscribe((val) => {
          if (val == 10){        
            this.latency = this.latency * 2;
            this.time1onoff = false;
            this.time2onoff = true;
          }
          console.log(val)
        });
        this.timer2 = timer(0, this.latency).pipe(      
          takeWhile( val => this.time2onoff )
        ).subscribe((val) => {
          if (val == 10){
            this.latency = this.latency * 2;
            this.time1onoff = true;
            this.time2onoff = false;
          }
          console.log(val)
        });
      }
    }
  • Как сделать автокоррекцию timer в RxJS?

    @Programep Автор вопроса
    Антон Швец, я хочу сдвигать следующий вызов таймера на N мс. Например задержка сети 20мс и нужно сдвигать следующих запуск таймера на это время. Пример того, что нужно JavaScript: цикличные таймеры с автокоррекцией
    :
    var start = new Date().getTime(),
        time = 0,
        elapsed = '0.0';
    
    function instance()
    {
        time += 100;
    
        elapsed = Math.floor(time / 100) / 10;
        if(Math.round(elapsed) == elapsed) { elapsed += '.0'; }
    
        document.title = elapsed;
    
        var diff = (new Date().getTime() - start) - time;
        window.setTimeout(instance, (100 - diff));
    }
    
    window.setTimeout(instance, 100);
  • Как сделать паузу и запуск intrerval в RxJS?

    @Programep Автор вопроса
    Антон Швец,
    Создание нового потока путем слияния двух интервалов, и складирование подписок в одну для удобной отписки всех скопом.
    Но при слиянии потов ведь тоже будет одна подписка, только, как я понимаю, логику придется писать в одном subscribe вместо нескольких, как это работает сейчас.
    А filter это фильтр, фильтрует поток по условию, не понял какая тут может быть пауза.
    Изначально я хотел сделать что-то похожее на это:
    if (need_start_timer){
    timer_step.start();
    } else {
    timer_step.pause();
    }
  • Как сделать паузу и запуск intrerval в RxJS?

    @Programep Автор вопроса
    Антон Швец, не совсем понял в чем разница двух решений. Как понимаю в первом варианте будет по сути одна подписка, а во втором две объединены в одну. По сути получается один и тот же результат. Сейчас у меня два таймера: 1-й таймер обновляет информацию от сервера, а 2-й таймер обновляет счетчик обратного отсчета времени. Посмотрев пример из статью Укрощение Змейки с помощью реактивных потоков , подумал может быть имеет смысл объединить потоки в какой-то один глобальный, чтобы при необходимости можно остановить только глобальный поток, а не писать unsubscribe для каждого потока. Сейчас у меня сделано так, может быть можно улучшить?
    this.reloadGameInfoSubscription = this.reloadGameInfo$
          .pipe(
            mergeMap((x) => this.gameService.getInfoGame(this.current_game.auth_key)
              .pipe(
                map((game: Game) => {
                  return { tick: x, game: game };
                })
              )
            )
          ).subscribe((response: { tick: number, game: Game }) => {
            /*
            логика обработки
            */
          });
        this.stepTimerSubscription = this.stepTimer$
          .pipe(
            filter(() => this.current_game.current_seconds_for_step > 0
              && this.field.start_word.length > 0
              && this.current_game.status_id == gameStatusCode.two_player_in_game),
          ).subscribe(() => {
            if (--this.current_game.current_seconds_for_step == 0) {
              this.gameService.skipStep(this.current_game.auth_key)
                .pipe(
                  mergeMap((skipStepResponse) => this.gameService.getInfoGame(this.current_game.auth_key)
                    .pipe(
                      map((game: Game) => {
                        return { skipStepResponse: skipStepResponse, game: game };
                      }))
                  )
                )
                .subscribe(
                  (response) => {
                    if (response.skipStepResponse.success) {
                      this.current_game.current_seconds_for_step = this.current_game.default_seconds_for_step;
                      this.gameService.setInfoGame(response.game);
                    }
                  }
                );
            }
          });

    И еще один вопрос, правильно ли я понимаю что filter фактически не делает никакую реальную паузу, а только не дает выполнится коду который написан в subscribe() в примере ниже:
    this.stepTimer$
          .pipe(
            filter(() => this.current_game.current_seconds_for_step > 0
              && this.field.start_word.length > 0
              && this.current_game.status_id == gameStatusCode.two_player_in_game),
          ).subscribe();
  • Как сделать паузу и запуск intrerval в RxJS?

    @Programep Автор вопроса
    Антон Швец, спасибо! Разобрался теперь как это работает. Подскажите, пожалуйста, а как можно объединить два interval в одну подписку, чтобы не делать unsubscribe на для каждого inverval? Пробовал через mergeMap, но получается создаются лишние interval.
  • Как сделать паузу и запуск intrerval в RxJS?

    @Programep Автор вопроса
    Спасибо! Только сделал немного по-другому (в вашем примере reloadGameInfo будет стоят до тех пор пока this.second_to_event не будет снова больше 0, но его останавливать не нужно было, а нужно останавливать stepTimer):
    reloadGameInfo = interval(10000);
    stepTimer = interval(1000);
    second_to_event = 100;
    this.reloadGameInfoSubscription = this.reloadGameInfo.subscribe(() => {      
          this.gameService.getInfoGame(this.current_game.auth_key)
            .subscribe((response: Game) => {          
              /* update game info */
            });
        });
        this.stepTimerSubscription = this.stepTimer
          .pipe(filter(() => this.current_game.current_seconds_for_step > 0))
          .subscribe(() => {
            if (--this.current_game.current_seconds_for_step == 0) {
              this.gameService.skipStep(this.current_game.auth_key).subscribe(
                (response: any) => {
                  if (response.success) {
                    this.current_game.current_seconds_for_step = this.current_game.default_seconds_for_step;
                  }
                }
              );
            }
          });

    Помогите, пожалуйста, разобраться еще в нескольких вопросах.
    1. Скажите, пожалуйста, правильно ли я понимаю что pipe с RxJS 5.5 добавили
    для возможности замены такого кода
    of(1,2,3).map(x => x + 1).filter(x => x > 2);
    на такой:
    of(1,2,3).pipe(
      map(x => x + 1),
      filter(x => x > 2)
    );
    ? Или это сделано для другого?
    2. Я просмотрел статью Укрощение Змейки с помощью реактивных потоков - увидел там пример что можно объединять подписки с помощью оператора combineLatest. Получается мне нужно убрать .subscribe() у this.stepTimer, this.reloadGameInfo и объединить их с помощью combineLatest, или как вы говорили flatMap(он же mergeMap)? Но не пойму где тогда указать то, что сейчас делается внутри subscribe.
    3. Как вы думаете, какой лучше оператор использовать mergeMap/flatMap или combineLatest для объединения stepTimer и reloadGameInfo? Из документации понял что разница между mergeMap/flatMap и combineLatest, в том что при combineLatest будет содержать последние данные из stepTimer И reloadGameInfo, а при mergeMap/flatMap будут данные либо из stepTimer, либо из reloadGameInfo.
  • Почему местоположенение меняется с большой разницей в расстоянии?

    @Programep Автор вопроса
    Anton Belichkov, Moskus, остановился на параметре enableHighAccuracy: true. Но сейчас решение не работает. Но когда работало, то точность местоположения все равно была невысокой.
    map.locate({enableHighAccuracy: true, timeout: 3000})
  • Почему apt-get update зависает?

    @Programep Автор вопроса
    pfg21, нашел ошибку. 1. Закомментировал в файлах nodesource.list, skype-stable.list в каталоге /etc/apt/sources.list.d/ все репозитории. 2. После этого apt update заработал успешно. 3. Установил apt-transport-https. Оказалось он все таки не был установлен. 4. Раскомментировал репозитории nodesource.list, skype-stable.list. 5. Запустил apt update чтобы обновить skype и nodejs.
    Подскажите, пожалуйста, а почему нигде в логах не было ошибок. Или может быть я не там искал.
  • Почему apt-get update зависает?

    @Programep Автор вопроса
    pfg21, о apt-transport-https и ca-certificates команда apt-get сообщает, что установлены последние версии пакетов. Удаление файлов из /var/apt/ не помогло. Попробовал посмотреть логи /var/log/dpkg.log, /var/log/apt/history.log, cat /var/log/apt/term.log - за сегодня в них нет никакой информации.
    в list.sources оставил только зеркало яндекса, но все равно обновление виснет на той же операции:
    Пол:15 http://mirror.yandex.ru/debian stretch/non-free Translation-en [80,1 kB]
    0% [Обработка]
  • Почему apt-get update зависает?

    @Programep Автор вопроса
    pfg21, попробую сначала удалить cache в /var/apt. Потом посмотреть логи.
    кстати, а что там с https глюки ?? мож в них проблема ??
    Подскажите, пожалуйста, где посмотреть можно причину этой ошибки.
  • Почему apt-get update зависает?

    @Programep Автор вопроса
    be52, эта ошибка не только с яндексом. На deb.debian.org/debian тоже такая ошибка. Дата корректная на компьютере.
  • Почему apt-get update зависает?

    @Programep Автор вопроса
    be52,
    # deb cdrom:[Debian GNU/Linux 9.1.0 _Stretch_ - Official i386 DVD Binary-1 20170722-12:45]/ stretch contrib main 
    
    # deb cdrom:[Debian GNU/Linux 9.1.0 _Stretch_ - Official i386 DVD Binary-1 20170722-12:45]/ stretch main contrib 
    
    #deb http://security.debian.org/debian-security/ stretch/updates contrib main 
    # deb-src http://security.debian.org/debian-security/ stretch/updates main contrib 
    
    # stretch-updates, previously known as 'volatile'
    # A network mirror was not selected during install.  The following entries
    # are provided as examples, but you should amend them as appropriate
    # for your mirror of choice.
    
    #deb http://deb.debian.org/debian/ stretch-updates main contrib 
    # deb-src http://deb.debian.org/debian/ stretch-updates contrib main 
    
    #deb http://ftp.debian.org/debian/ stretch main non-free  
    
    #deb http://dl.winehq.org/wine-builds/debian/ stretch main  
    
    
    #deb http://deb.debian.org/debian/ stretch main contrib non-free 
    
    deb http://download.virtualbox.org/virtualbox/debian/ stretch contrib 
    
    deb http://mirror.yandex.ru/debian/ stretch main contrib non-free
  • Почему apt-get update зависает?

    @Programep Автор вопроса
    pfg21, Дмитрий Беляев, marataziat, поменял на зеркала yandex по вашему совету. Ничего не поменялось.5b0a7ccca61a7373149414.png
    А как быть с репозиториями security.debian, не нашел зеркал нигде?
  • Почему apt-get update зависает?

    @Programep Автор вопроса
    На что менять лучше?
  • Mdadm удалит данные при создании raid 1 если на одном из разделов информация?

    @Programep Автор вопроса
    Melkij, спасибо за подробный ответ! Создал RAID 1 по вашей инструкции: сначала указал один раздел, скопировал на него данные, затем добавил другой раздел в RAID 1. Подскажите, пожалуйста, а для переноса RAID на другой компьютер с другой версией Debian(или вообще другой ОС), нужно сначала установить mdadm, скопировать конфиг mdadm?