IT science

трудовые будни

подключаемся к BIMCloud basic через ssl

Давайте рассмотрим простую схему настройки подключения к BIMCloud basic через подтвержденный ssl.
У нас была статья про «обратный прокси» https://itscience.pro/all/obratny-proksi-s-podderzhkoy-ssl/ это довольно сложный процесс, связанный с настройкой linux сервера и конфигурацией nginx и cerbot. Рассмотрим простой человекоудобный метод конфигурации.

За основу возьмем synology сервер, нам достаточно простой модели (нагрузки будут минимальны)

заходим в панель управления, включаем «Расширенный режим»

Далее открываем «Портал приложений»

и выбираем «Обратный прокси»

жмем «Создать»

Заполняем поля:

  • Описание: любое понятное нам название, проще использовать имя сервера
    Источник:
  • Протокол: выбираем HTTPS, мы же хотим получить защищенный канал подключения к серверу
  • Имя хоста: пишем доменное имя нашего внешнего подключения (настраивается в глобальном DNS, чаще у регистратора домена), если настраиваем подключение только одного сервер, то можно поставить *
  • Порт: 22000 (для ArchiCAD 22), мы в примере рассматриваем только 1 порт (по аналогии можно настроить другие)
    Место назначения:
  • Протокол: HTTP
  • Имя хоста: ip адрес нашего локального сервера
  • Порт: 22000 (аналогичный внешнему)

остальное оставляем по умолчанию, жмем «OK»

видим, у нас появилась первая запись

Открываем в «Панели управления» «Безопасность»

далее «Сертификат» -> «Добавить»

описание даем по аналогии с описанием прокси, название нашего сервера, сертификат Let’s Encrypt

заполняем название нашего домена (должна быть запись в глобальном DNS и 80 и 443 порты должны быть проброшены к нашему synology), указываем почту, которая будет прописана в сертификате.

после успешного выпуска сертификата, можно его назначить для нашего обратного прокси, для этого оставаясь во вкладке «Сертификат» жмем кнопку «Настроить»

напротив нашего подключения выбираем только что выпущенный сертификат

готово!

Теперь перевыпуск бесплатного сертификата Let’s Encrypt будет контролировать synology, более нашего вмешательства не потребуется.

6 мая   BIMCloud   Let's Encrypt   ssl   synology

обратный прокси с поддержкой ssl

Многие недооценивают обратный прокси на базе nginx или просто не знают куда это можно применить!

Обратный прокси поможет пробросить более одного web сервера через внешний статический ip адрес. Да, это будет работать, сейчас объясню как:

у нас в локальной сети есть два вэб сервера:

  • сайт компании (192.168.1.2)
  • интерфейс почтового сервера (192.168.1.3)

оба слушают 80 и 443 порты.

наш внешний ip: 123.123.123.123
создаем два домена:

  • domain.ru
  • mail.domain.ru

все! осталось малость, настраиваем nginx сервер, с двумя конфигами для вышеупомянутых доменов, первый ссылается на 192.168.1.2, второй на 192.168.1.3.

на шлюзовой машине настраиваем NAT с внешнего интерфейса к nginx серверу (80 и 443 порты).

осталось малость, на сервере с nginx настроить certbot для автоматического выпуска сертификатов ssl для наших доменов domain.ru и mail.domain.ru.

Итак, что мы получаем: у нас два физически разных сервера, использующих одинаковые порты 80 и 443, выведены наружу, т. е. расположены на одном внешнем ip адресе. Маршрутизация осуществляется посредством имени домена, оба домена имеют подтвержденные сертификаты ssl.

6 мая   certbot   nginx   reverse-proxy

Ошибка в файле ifc

Сегодня при открытии ifc модели от подрядчиков Solibri viewer выдал ошибку «Reading of IFC model failed».

Странно, при этом ArchiCAD спокойно эту модель загрузил, выругавшись только на нулевые id некоторых объектов. Попробовали открыть в Solibri optimizer, ошибка уже выглядела по-другому, явная ругаясь на синтаксис.

Итак, результаты расследования выявили, что внутри строки использованы не экранированные одинарные кавычки, лечится дублированием

FILE_NAME(’\\\\server\\Path\\’EXPO project name’\\Other path\\file name.ifc’,’2009’,(’Architect’),(’ ’),’ ’,’Windows System’,’The authorising person’);

вот правильная строка

FILE_NAME(’\\\\server\\Path\\’’EXPO project name’’\\Other path\\file name.ifc’,’2009’,(’Architect’),(’ ’),’ ’,’Windows System’,’The authorising person’);

такой косяк допустила программа SAPFIR v.1.0 (IFC 2x3 interface 23-03-2009)

24 апреля   ifc   Solibri

рекурсивное удаление директории

аналог

rmdir /s /q или rm -rf

function DeleteDirectoryEx(DirectoryName: string): boolean;
// адаптирована функция DeleteDirectory из модуля fileutil, спасибо Павлу Дмитруку
var
  FileInfo: TSearchRec;
  CurSrcDir: String;
  CurFilename: String;
begin
  Result:=false;
  CurSrcDir:=CleanAndExpandDirectory(DirectoryName);
  try
         if FindFirstUTF8(CurSrcDir+GetAllFilesMask,faAnyFile,FileInfo)=0 then
         begin
           repeat
             if (FileInfo.Name<>'.') and (FileInfo.Name<>'..') and (FileInfo.Name<>'') then
             begin
               CurFilename:=CurSrcDir+FileInfo.Name;
               if (FileInfo.Attr and faReadOnly)>0 then
                 FileSetAttrUTF8(CurFilename, FileInfo.Attr-faReadOnly);
               if (FileInfo.Attr and faDirectory)>0 then
               begin
                 if not DeleteDirectoryEx(CurFilename) then exit;
               end
               else
               begin
                 if not DeleteFileUTF8(CurFilename) then exit;
               end;
             end;
           until FindNextUTF8(FileInfo)<>0;
         end;
         FindCloseUTF8(FileInfo);
         if (not RemoveDirUTF8(DirectoryName)) then
           begin
             exit;
             Result:=true;
           end;
  except
    Result:=false;
  end;
end;
12 апреля   free pascal   lazarus

запускаем внешнее приложение, ждем завершения и получаем вывод

запускаем внешнее консольное приложение и ждем окончания его выполнения, после завершения получаем вывод в список

function RunScript(sCommand: String): TStringList;
var
  OurCommand: String;
  OutputLines: TStringList;
  MemStream: TMemoryStream;
  OurProcess: TProcess;
  NumBytes: LongInt;
  BytesRead: LongInt;
const
  READ_BYTES = 204800;
begin
  MemStream := TMemoryStream.Create;
  BytesRead := 0;
  OurProcess := TProcess.Create(nil);
  OurCommand := sCommand;
  OurProcess.CommandLine := OurCommand;
  OurProcess.ShowWindow:=swoHIDE;
  OurProcess.Options := [poUsePipes, poNoConsole];
  OurProcess.Execute;
  while OurProcess.Running do
  begin
    MemStream.SetSize(BytesRead + READ_BYTES);
    NumBytes := OurProcess.Output.Read((MemStream.Memory + BytesRead)^, READ_BYTES);
    if NumBytes > 0
    then begin
      Inc(BytesRead, NumBytes);
      Sleep(100);
    end
    else begin
      Sleep(100);
    end;
  end;
  Sleep(1000);
  repeat
    MemStream.SetSize(BytesRead + READ_BYTES);
    NumBytes := OurProcess.Output.Read((MemStream.Memory + BytesRead)^, READ_BYTES);
    if NumBytes > 0
    then begin
      Inc(BytesRead, NumBytes);
    end;
    Sleep(100);
  until NumBytes <= 0;
  MemStream.SetSize(BytesRead);
  OutputLines := TStringList.Create;
  OutputLines.LoadFromStream(MemStream);
  result := OutputLines;
  OurProcess.Free;
  MemStream.Free;
end;
11 апреля   free pascal   lazarus
Ранее Ctrl + ↓