Сервер 1С 8.3.25 на Debian 12 с PostgreSQL от 1С
Содержание
Небольшой компании на 5 пользователей понадобился свой сервер 1С, но платить за лицензии Windows Server и MS SQL не хотелось. Я выбрал связку Debian 12 + PostgreSQL 16 в сборке от 1С + сервер 1С:Предприятие 8.3.25. Дальше расскажу, в каком порядке всё ставил и на какие грабли здесь легко наступить.
Железо и диски
Сервер: 32 ГБ ОЗУ, SSD на 480 ГБ и два SSD по 1 ТБ. Диски я распределил так:
| Диск | Назначение |
|---|---|
| SSD 480 ГБ | Debian, сервер 1С, сеансовые данные кластера |
| 2 × SSD 1 ТБ, RAID 1 (mdadm) | Каталог данных PostgreSQL |
| Внешнее хранилище | Резервные копии |
Зеркало под базы переживёт отказ одного диска. Но бэкапы от этого не перестают быть обязательными: от удалённых данных и испорченной базы RAID не спасает.
Совет
Каталог PostgreSQL на RAID удобно смонтировать в /var/lib/postgresql до установки СУБД — тогда кластер сразу создастся на нужном массиве.
Подготовка системы
Ставлю минимальный Debian 12 без графики, только с SSH. Потом локаль и пакеты.
Сервер 1С и PostgreSQL хотят локаль ru_RU.UTF-8, и сгенерировать её нужно до установки PostgreSQL. Иначе кластер создастся с локалью по умолчанию, и его придётся пересоздавать:
sudo sed -i 's/^# *ru_RU.UTF-8/ru_RU.UTF-8/' /etc/locale.gen
sudo locale-gen
sudo update-locale LANG=ru_RU.UTF-8
После этого перелогиньтесь и проверьте locale — там должно быть LANG=ru_RU.UTF-8.
Зависимости для сборки PostgreSQL и сервера 1С:
sudo apt update
sudo apt install -y postgresql-common ssl-cert libgsf-1-114 \
fontconfig ttf-mscorefonts-installer imagemagick unixodbc
Шрифты серверу 1С нужны для печатных форм и отчётов в PDF. Без них вёрстка на сервере «плывёт».
У postgresql-common есть хук, который при установке новой версии сам создаёт кластер main. Я его отключаю, потому что кластер хочу создать вручную с нужными параметрами:
sudo sed -i 's/^#\? *create_main_cluster.*/create_main_cluster = false/' \
/etc/postgresql-common/createcluster.conf
Ставлю PostgreSQL 16 от 1С
Дистрибутив лежит на releases.1c.ru в разделе «Дистрибутив СУБД PostgreSQL для Linux». Нужен архив с .deb-пакетами для x86_64. Я ставил версию 16.14-1.1C.
mkdir ~/pg1c && cd ~/pg1c
tar xjf postgresql_16.*_amd64_deb.tar.bz2
ls *.deb
sudo apt install -y ./*.deb
Я использую apt install ./*.deb, а не dpkg -i: так недостающие зависимости подтянутся из репозиториев Debian сами.
Сразу закрепляю пакеты, чтобы apt upgrade однажды не заменил libpq5 от 1С на версию из Debian:
sudo apt-mark hold libpq5 postgresql-16 postgresql-client-16
Теперь сам кластер — с русской локалью и контрольными суммами страниц:
sudo pg_createcluster --locale ru_RU.UTF-8 16 main -- --data-checksums
sudo systemctl enable --now postgresql@16-main
И пароль суперпользователя. Он пригодится, когда будем создавать базы из консоли кластера 1С:
sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'сложный-пароль';"
Настройки postgresql.conf
Сервер 1С и PostgreSQL живут на одной машине и делят 32 ГБ памяти, поэтому всю память PostgreSQL я не отдавал. Мои стартовые значения в /etc/postgresql/16/main/postgresql.conf:
listen_addresses = 'localhost'
max_connections = 200
shared_buffers = 6GB
effective_cache_size = 16GB
work_mem = 64MB
maintenance_work_mem = 1GB
temp_buffers = 64MB
max_locks_per_transaction = 256
random_page_cost = 1.1
effective_io_concurrency = 200
max_wal_size = 4GB
checkpoint_completion_target = 0.9
random_page_cost = 1.1 подсказывает планировщику, что данные лежат на SSD. max_locks_per_transaction я поднял потому, что 1С при реструктуризации держит много блокировок, и со значением по умолчанию можно поймать ошибку нехватки разделяемой памяти.
Заметка
listen_addresses = 'localhost' — PostgreSQL слушает только локально: сервер 1С работает на той же машине, снаружи к СУБД подключаться незачем.
sudo systemctl restart postgresql@16-main
Ставлю сервер 1С 8.3.25
Понадобится файл setup-full-8.3.25.xxxx-x86_64.run с releases.1c.ru. Ставлю без графического мастера и только серверные компоненты:
chmod +x setup-full-8.3.25.*-x86_64.run
sudo ./setup-full-8.3.25.*-x86_64.run --mode unattended \
--enable-components server,ws,server_admin \
--disable-components client_full
server— сам сервер 1С;ws— модули веб-сервера, если базы будут публиковаться через Apache;server_admin— утилиты администрированияrasиrac.
Платформа встанет в /opt/1cv8/x86_64/8.3.25.xxxx/. Дальше в командах я пишу номер сборки через переменную — подставьте свой:
V=8.3.25.1445 # ваша сборка
Служба systemd
Юнит-файл идёт вместе с платформой, его нужно только подключить:
sudo systemctl link /opt/1cv8/x86_64/$V/srv1cv8-$V@.service
sudo systemctl enable --now srv1cv8-$V@default.service
systemctl status srv1cv8-$V@default.service
Каталог кластера по умолчанию — /home/usr1cv8/.1cv8/1C/1cv8. Там лежат настройки кластера и сеансовые данные.
Сервер администрирования (ras)
Чтобы управлять кластером с Windows-машины через «Администрирование серверов 1С» или из консоли через rac, нужен ras. Я делаю для него отдельную службу:
# /etc/systemd/system/ras-1c.service
[Unit]
Description=1C:Enterprise Remote Administration Server
After=srv1cv8-8.3.25.1445@default.service
Requires=srv1cv8-8.3.25.1445@default.service
[Service]
Type=simple
User=usr1cv8
ExecStart=/opt/1cv8/x86_64/8.3.25.1445/ras cluster --port=1545 localhost:1540
Restart=on-failure
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now ras-1c
/opt/1cv8/x86_64/$V/rac cluster list
rac cluster list должен показать кластер «Локальный кластер» на порту 1541.
Сеть и firewall
Клиентам 1С нужны порты агента, менеджера кластера и рабочих процессов:
| Порт | Что это |
|---|---|
| 1540 | Агент сервера (ragent) |
| 1541 | Менеджер кластера (rmngr) |
| 1560–1591 | Рабочие процессы (rphost) |
| 1545 | Сервер администрирования (ras) — только для админов |
Пример для nftables, где офисная сеть — 192.168.1.0/24:
sudo nft add rule inet filter input ip saddr 192.168.1.0/24 tcp dport { 1540, 1541, 1560-1591 } accept
sudo nft add rule inet filter input ip saddr 192.168.1.10 tcp dport 1545 accept
И важный момент, о котором часто забывают: клиенты должны находить сервер по имени, причём именно по тому, которое выдаёт hostname. Если своего DNS в офисе нет, пропишите имя сервера в hosts на каждом клиенте. Иначе подключение к базе отвалится на этапе перенаправления на рабочий процесс.
Создаю базу
В консоли «Администрирование серверов 1С» → кластер → Информационные базы → Новая:
- Сервер баз данных:
localhost - Тип СУБД: PostgreSQL
- Пользователь:
postgresи пароль, заданный выше - Создать базу данных в случае её отсутствия: включено
Потом база добавляется в список на клиенте как «на сервере 1С:Предприятия»: имя сервера и имя базы.
Резервное копирование
Каждую ночь делаю дамп каждой базы средствами PostgreSQL. Формат -Fc хорошо сжимается и позволяет восстанавливать выборочно:
#!/bin/bash
# /usr/local/bin/pg-backup.sh — дамп всех баз, хранение 14 дней
set -euo pipefail
DEST=/backup/pg
KEEP_DAYS=14
mkdir -p "$DEST"
for db in $(sudo -u postgres psql -Atc \
"SELECT datname FROM pg_database WHERE NOT datistemplate AND datname <> 'postgres'"); do
sudo -u postgres pg_dump -Fc "$db" > "$DEST/${db}_$(date +%F).dump"
done
find "$DEST" -name '*.dump' -mtime +"$KEEP_DAYS" -delete
sudo chmod +x /usr/local/bin/pg-backup.sh
echo '30 1 * * * root /usr/local/bin/pg-backup.sh' | sudo tee /etc/cron.d/pg-backup
/backup у меня — точка монтирования внешнего хранилища, а не папка на том же сервере.
Внимание
Бэкап, который ни разу не восстанавливали, — не бэкап. Раз в месяц разворачивайте дамп в тестовую базу: createdb test_restore && pg_restore -d test_restore файл.dump.
Грабли
- Кластер PostgreSQL создался с локалью
Cилиen_US. Значит, локаль не сгенерировали заранее. Лечится только пересозданием:pg_dropcluster --stop 16 mainи сноваpg_createclusterс--locale ru_RU.UTF-8. - Ошибка
authentication method 10 not supported. Клиентская библиотека не умеет SCRAM. Поставьтеpassword_encryption = md5вpostgresql.conf, методmd5вpg_hba.conf, перезапустите PostgreSQL и заново задайте пароль пользователю. - После
apt upgrade1С перестала подключаться к базе. Обновиласьlibpq5из Debian. Именно поэтому я и закрепляю пакеты от 1С черезapt-mark hold. - Кракозябры в печатных формах. Не хватает шрифтов или локали. Проверьте
ttf-mscorefonts-installerиfc-list | grep -i arial.
Итого
Связка Debian 12 + PostgreSQL от 1С + сервер 1С 8.3.25 спокойно тянет небольшую компанию и не требует лицензий на ОС и СУБД. Главное — соблюсти порядок: локаль → PostgreSQL → кластер с нужной локалью → сервер 1С. И сразу, в тот же день, настроить бэкапы.
Обсуждение
Комментарии работают через GitHub: для ответа нужен аккаунт GitHub. Вопрос без регистрации — напишите мне напрямую.