Запуск Postgres от PostgresPro в WSL Docker
Ванильный Postgres запускается в Docker без проблем. Для 1С же нужна сборка от 1С или от PostgresPro. Мне нравится вариант от PostgresPro, но с ходу в докере его не запустить.
Быстро гуглится решение от akocur. Думаю, что в обычном linux (или виртуалке) оно запустилось бы, но в варианте Docker на WSL не заработало. Нетривиально было понять, что первоначальный запуск инициализации от PostgresPro (с тюнингом конфига PostgreSQL) не находит утилиту free для определения объема RAM. Логи сборки образа это не показывают. Благо ChatGPT подсказывает, как в таком варианте запуска инциализации БД можно увидеть детали:
RUN /opt/pgpro/1c-17/bin/pg-setup initdb || (cat /var/lib/pgpro/1c-17/initdb.data.log && false):
[ 9/12] RUN /opt/pgpro/1c-17/bin/pg-setup initdb || (cat /var/lib/pgpro/1c-17/initdb.data.log && false):
0.396 failed, see /var/lib/pgpro/1c-17/initdb.data.log
0.397 Файлы, относящиеся к этой СУБД, будут принадлежать пользователю "postgres".
0.397 От его имени также будет запускаться процесс сервера.
0.397
0.397 Кластер баз данных будет инициализирован с локалью "ru_RU.UTF-8".
0.397 Кодировка БД по умолчанию, выбранная в соответствии с настройками: "UTF8".
0.397 Выбрана конфигурация текстового поиска по умолчанию "russian".
0.397
0.397 Контроль целостности страниц данных отключён.
0.397
0.397 исправление прав для существующего каталога /var/lib/pgpro/1c-17/data... ок
0.397 создание подкаталогов... ок
0.397 выбирается реализация динамической разделяемой памяти... posix
0.397 выбирается значение "max_connections" по умолчанию... 100
0.397 выбирается значение "shared_buffers" по умолчанию... 128MB
0.397 выбирается часовой пояс по умолчанию... Etc/UTC
0.397 создание конфигурационных файлов... ок
0.397 выполняется автоматическая настройка sh: 1: free: not found
0.397 pgpro_tune: failed to get size of RAM
0.397 pgpro_tune: failed to get size of RAM
0.397 pgpro_tune: could not close pipe to external command LC_MESSAGES=C free -m: command not found
0.397 ок
0.397 выполняется подготовительный скрипт... 2025-07-18 08:29:16.382 UTC [48] СООБЩЕНИЕ: 0 8kB вне диапазона, допустимого для параметра "effective_cache_size" (1 8kB .. 2147483647 8kB)
0.397 2025-07-18 08:29:16.382 UTC [48] ВАЖНО: файл конфигурации "/var/lib/pgpro/1c-17/data/postgresql.conf" содержит ошибки
0.397 дочерний процесс завершился с кодом возврата 1
0.397 initdb: удаление содержимого каталога данных "/var/lib/pgpro/1c-17/data"
Добавление установки пакета procps решает проблему:
RUN apt-get update && apt-get install -y \
wget \
gnupg2 \
ca-certificates \
locales \
procps \
&& rm -rf /var/lib/apt/lists/*
После этого из Windows можем подключиться к PostgreSQL c дефолтными параметрами:
host: localhost
port: 5432
user: postgres
password: password
С PostgreSQL мы уже можем работать через localhost, например через DBeaver. Но для 1С из WSL нам понадобится внутренний IP адрес хоста Hyper-V.
Установка 1C в WSL Ubuntu 22.04
При первой установка WSL в новенькой Windows 11, автоматически устанавливается Ubuntu 22.04. Но хотелось отдельную машинку для 1С (на самом деле помним, что контейнер) , чтобы эксперименты проводить в другой. Устанавливаем и запускаем еще одну Ubuntu в WSL:
cd D:\
> mkdir WSL\Ubuntu-1C
> cd WSL\Ubuntu-1C
> curl -L -o ubuntu-jammy.rootfs.tar.gz https://cloud-images.ubuntu.com/wsl/releases/22.04/current/ubuntu-jammy-wsl-amd64-wsl.rootfs.tar.gz
> wsl --import Ubuntu-1C D:\WSL\Ubuntu-1C ubuntu-jammy.rootfs.tar.gz --version 2
> wsl -d Ubuntu-1C
В этот момент удивляет размер и скорость: изначальный образ скачивается 223Мб, после импорта 883Мб (с мгновенным стартом).
По умолчанию вход будет под рутом, поэтому нужно будет создать нового пользователя:
adduser myuser
usermod -aG sudo myuser
Чтобы запускать WSL под новым пользователем, нужно изменить файл /etc/wsl.conf
:
[user]
default=myuser
После этого перезапустите WSL:
wsl --terminate Ubuntu-1C
wsl -d Ubuntu-1C
Копируем дистрибутив 1С в WSL, распаковываем, запускам установку и ничего не происходит. Пробую установить плеер vlc, чтобы проверить - GUI приложения вообще запускаются. Установка vlc поставит кучу зависимостей, после чего начнет запускаться GUI установщик 1С. Установка ./setup-full-8.3.27.1606-x86_64.run завершается без ошибок.
Тут надо пояснить про GUI. Как я понял, раньше GUI работал через X-сервер (например vcxsrv), который надо было устанавливать в Windows, затем в контейнере задавать переменную окружения DISPLAY. А в новом WSL2 это прокачали до хитрого RDP на базе wsgl.
Радостно запускаем 1С в Windows, добавляем базу (с созданием в БД), указываем наш PostgreSQL на localhost. База создается без ошибок, но 1С ожидаемо просит активации лицензии. Это логично, ведь комьюнити лицензия до этого у меня была активирована именно в Windows. Ввожу данные от developer.1c.ru, активация выполняется успешно, но при перезапуске все повторяется.
Или это особая контейнерность (особенности разделение файловой системы и сети) или просто моего понимания не хватило. Но 1C-конфигуратор в windows с открытием серверной базы в linux WSL активированную лицензию размещал в C:\ProgramData\1C\licenses (причем с привязкой к характеристикам хостовой машины, а не linux сервера 1С). Т.е. скопировать файл лицензии в /var/1C/licenses не помогало (там как минимум другой идентификатор ОС). Опции активации 1С "на сервере" не было, как в обычной (не комьюнити) лицензии.
Несложно догадаться, что надо просто запустить клиент 1С прям в linux. Но... это не работало с ошибкой:
/opt/1cv8/common/1cestart
Segmentation fault (core dumped)
Много часов диалогов с ChatGPT с безуспешными попытками запустить через X-сервер привели к рекомендации запустить 1С со стректрейсом:
strace ./1cestart 2>&1 | tail -n 10
Segmentation fault
fserg1c@fserg1c:/opt/1cv8/common$ strace ./1cestart 2>&1 | tail -n 100
access("/home/fserg1c", F_OK) = 0
access("/home/fserg1c/.cache", F_OK) = 0
access("/home/fserg1c/.cache/AMD", F_OK) = 0
access("/home/fserg1c/.cache/AMD/DxcCache", F_OK) = 0
access("/home/fserg1c/.cache/AMD/DxcCache/", F_OK) = 0
access("/home/fserg1c/.cache/AMD/DxcCache//4c096bccaebe66d.df0bca61c5d809c4.f5cd4141.87672893.0.parc", F_OK) = 0
openat(AT_FDCWD, "/home/fserg1c/.cache/AMD/DxcCache//4c096bccaebe66d.df0bca61c5d809c4.f5cd4141.87672893.0.parc", O_RDWR) = 6
flock(6, LOCK_EX|LOCK_NB) = 0
fadvise64(6, 0, 0, POSIX_FADV_WILLNEED) = 0
fstat(6, {st_mode=S_IFREG|0700, st_size=92, ...}) = 0
lseek(6, 0, SEEK_SET) = 0
read(6, "#\330\372\347\17_G\276\213\321H\365\330\360\264\247\2\0\0\0\0\0\0\08\0\0\0\0\0\0\0"..., 56) = 56
mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x747960900000
mmap(0x747960900000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x747960900000
fstat(6, {st_mode=S_IFREG|0700, st_size=92, ...}) = 0
mmap(0x747960901000, 2093056, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x747960901000
fstat(6, {st_mode=S_IFREG|0700, st_size=92, ...}) = 0
lseek(6, 0, SEEK_SET) = 0
read(6, "#\330\372\347\17_G\276\213\321H\365\330\360\264\247\2\0\0\0\0\0\0\08\0\0\0\0\0\0\0"..., 92) = 92
newfstatat(AT_FDCWD, "/etc/localtime", {st_mode=S_IFREG|0644, st_size=1535, ...}, 0) = 0
brk(0x1dd2c000) = 0x1dd2c000
openat(AT_FDCWD, "/home/fserg1c/.cache/AMD/DxcCache//4c096bccaebe66d.df0bca61c5d809c4.f5cd4141.87672893.1.parc", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/fserg1c/.cache/AMD/DxcCache//4c096bccaebe66d.df0bca61c5d809c4.f5cd4141.87672893.2.parc", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/fserg1c/.cache/AMD/DxcCache//4c096bccaebe66d.df0bca61c5d809c4.f5cd4141.87672893.3.parc", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/fserg1c/.cache/AMD/DxcCache//4c096bccaebe66d.df0bca61c5d809c4.f5cd4141.87672893.4.parc", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/fserg1c/.cache/AMD/DxcCache//4c096bccaebe66d.df0bca61c5d809c4.f5cd4141.87672893.5.parc", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/fserg1c/.cache/AMD/DxcCache//4c096bccaebe66d.df0bca61c5d809c4.f5cd4141.87672893.6.parc", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/fserg1c/.cache/AMD/DxcCache//4c096bccaebe66d.df0bca61c5d809c4.f5cd4141.87672893.7.parc", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/fserg1c/.cache/AMD/DxcCache//4c096bccaebe66d.df0bca61c5d809c4.f5cd4141.87672893.8.parc", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/fserg1c/.cache/AMD/DxcCache//4c096bccaebe66d.df0bca61c5d809c4.f5cd4141.87672893.9.parc", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/home/fserg1c/.cache/AMD/DxcCache/", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
openat(AT_FDCWD, "/home/fserg1c/.cache/AMD/DxcCache/", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 7
newfstatat(7, "", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_EMPTY_PATH) = 0
getdents64(7, 0x1d5e4030 /* 14 entries */, 32768) = 1008
getdents64(7, 0x1d5e4030 /* 0 entries */, 32768) = 0
close(7) = 0
openat(AT_FDCWD, "/home/fserg1c/.cache/AMD/DxcCache/", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 7
Ответ ChatGPT: Проблемы с драйверами AMD. Если вы используете проприетарный драйвер AMD (или даже Mesa с Gallium/RADV), 1С может падать из-за OpenGL-акселерации. У меня как раз homelab на GMKtec M7 с AMD Radeon 680M.
Решение: Запустите с отключением OpenGL:
LIBGL_ALWAYS_SOFTWARE=1 ./1cestart
После этого 1С запускается, активируется. Только после активации надо лицензию из папки пользователя перемесить в общую папку, иначе сервер ее не видит (это обсуждалось ранее на инфостарт):
sudo mv /home/fserg1c/.1cv8/1C/1cv8/conf/20250718190129.lic /var/1C/licenses/
sudo chown -R usr1cv8:grp1cv8 /var/1C/licenses
sudo chmod -R 755 /var/1C/licenses
Теперь сервер 1С запускается без проблемы с лицензией.
systemd
Забыл добавить, что по-умолчанию в Ubuntu WSL выключен systemd. Чтобы службой сервера 1С управлять привычным образом, нужно его включить:
nano /etc/wsl.conf
[boot]
systemd=true
// перезаускаем WSL
wsl.exe --shutdown
Подробнее на офсайте: https://learn.microsoft.com/en-us/windows/wsl/systemd
Нюансы сети
Не понятно как первоначально база создалась с localhost'ом. Создание новых баз и работа с ними получалась дальше только с явным указнием IP-адресов хостовой машины (Windows) и адресов контейнера Ubuntu-1C.
Внутренний адрес Windows для сете Hyper-V можно узнаем командой:
PS C:\Users\fserg> ipconfig
...
Адаптер Ethernet vEthernet (WSL (Hyper-V firewall)):
DNS-суффикс подключения . . . . . :
IPv4-адрес. . . . . . . . . . . . : 172.25.48.1
Маска подсети . . . . . . . . . . : 255.255.240.0
Внутренний адрес Ubuntu-1С узнаем командой:
PS C:\Users\fserg> wsl hostname -I
172.25.63.95
В консоли администрирования 1С адрес кластера серверов соответственно указываем: 172.25.63.95
А при добавлении новой базы, адрес сервера баз данных указываем: 172.25.48.1
Итог
В итоге, все заработало и заработало быстро. Пока непонятно, какие дальше появятся проблемы (например, смена IP-адреса при перезапуске WSL или Windows).
Возможно, оно того не стоило и проще и быстрее было поднять полноценные виртуалки в Hyper-V или VirtualBox. Но осознание того, что современные LLM'ки дают 1Снику возможность заглянуть довольно глубоко - бесценно!
P.S. linux инфра понадобилась, чтобы тестировать внешние компоненты на rust со сборкой под linux/windows, с возможностью сразу проверить работу компонент и там и там.
Вступайте в нашу телеграмм-группу Инфостарт