DevOps & Server Setup Services for 1C-Bitrix

Our company is engaged in the development, support and maintenance of Bitrix and Bitrix24 solutions of any complexity. From simple one-page sites to complex online stores, CRM systems with 1C and telephony integration. The experience of developers is confirmed by certificates from the vendor.
Frequently Asked Questions

Our competencies:

Development stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1288
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Website development for FIXPER company
    881
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Development based on Bitrix, Bitrix24, 1C for the company Development of an Online Appointment Booking Widget for a Medical Center
    631
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Development based on 1C Enterprise for MIRSANBEL
    781
  • image_crm_dolbimby_434_0.webp
    Website development on CRM Bitrix24 for DOLBIMBY
    681
  • image_crm_technotorgcomplex_453_0.webp
    Development based on Bitrix24 for the company TECHNOTORGKOMPLEKS
    1010

DevOps for 1C-Bitrix

rsync -avz to production on a Friday evening, restart php-fpm, and the site responds with 502 — because .settings.php still has local database connection settings. A classic "old school" Bitrix deploy. We build a full DevOps cycle for 1C-Bitrix projects: from Docker environments to Telegram alerts, so that deployment is a routine, not a lottery.

Problems That DevOps Solves on Bitrix Projects

Bitrix historically lived in a "edit files via FTP on the live server" paradigm. In 2026, dozens of teams still work this way, and here's what it leads to:

  • Two developers edit init.php simultaneously — one overwrites the other's changes. The init.php file in Bitrix is the entry point for event handlers, custom functions, and module connections. Losing edits here means losing business logic
  • Updating a module through the admin panel breaks a custom component template, because nobody tracked which files were changed in /local/templates/
  • Site outages are discovered from a client, not from monitoring
  • There's no staging environment — "let's quickly test on production," and bitrix:catalog.section disappears

CI/CD: From Commit to Production, Hands-Free

Git — we migrate the project from FTP to Git (GitLab, GitHub, Bitbucket). Branch structure: main (production), staging, develop, feature branches. .gitignore for Bitrix — a non-trivial matter:

/bitrix/cache/
/bitrix/managed_cache/
/bitrix/stack_cache/
/upload/
/bitrix/php_interface/dbconn.php
/bitrix/.settings.php
/bitrix/license_key.php

Miss managed_cache/ — the repository bloats by gigabytes. Forget to exclude license_key.php — the key leaks.

CI pipeline checks code automatically:

  • PHPStan level 5+ for static analysis — catches calls to non-existent CIBlockElement methods before they reach the server
  • PHP_CodeSniffer with the Bitrix standard
  • PHPUnit for business logic, Jest for frontend
  • composer audit — dependency vulnerability checks
  • Frontend build (webpack/Vite)

CD pipeline deploys automatically:

  • Merge into staging — deploy to staging
  • Merge into main — deploy to production (with manual confirmation or automatically)
  • Zero-downtime via symlink strategy: new version in a separate directory, current → symlink switch in milliseconds. upload/ lives outside release directories
  • Automatic rollback on errors — if the healthcheck after deploy doesn't return 200, the symlink rolls back

Tools: GitLab CI/CD, GitHub Actions, Deployer (PHP). Deployer is especially convenient for Bitrix — it has recipes for symlink deployment and shared directories.

Docker for Bitrix

Docker solves "it works on my machine" once and for all.

Local developmentdocker-compose.yml:

  • nginx + php-fpm 8.1/8.2 + MySQL 8.0 (or MariaDB 10.6) + Redis + Memcached
  • Configuration as close to production as possible — same versions, same PHP modules
  • New developer: git clone + docker-compose up -d — writing code within 5 minutes
  • Parallel work on projects with different PHP versions — via separate compose files

Bitrix specifics in Docker — here be dragons:

  • /upload/ is mounted as a named volume. Not bind mount — otherwise on Windows/Mac there will be permission and performance issues
  • Bitrix cron tasks (/bitrix/modules/main/tools/cron_events.php) — via a separate container with the same image or supervisord inside the container
  • The "Proactive Protection" module (security) blocks requests if it detects a reverse proxy. Proper REMOTE_ADDR is needed via set_real_ip_from in nginx and realip_module
  • bitrix/php_interface/dbconn.php and .settings.php — via environment variables or a separate .env file, not through a volume with production configs

Production:

  • Multi-stage build: build stage for assets, production stage with a minimal image
  • Docker Registry for versioned images
  • Orchestration via Docker Swarm or Kubernetes for large projects

Configuring nginx and php-fpm

The difference between "the site is slow" and "200ms TTFB" is in the configuration.

nginx:

  • Location blocks for Bitrix: urlrewrite.php handles clean URLs, /bitrix/admin/ is restricted by IP via allow/deny
  • expires 30d for static files — CSS, JS, images served from browser cache
  • Brotli (15–20% better than gzip for text): brotli on; brotli_comp_level 6;
  • Rate limiting on /bitrix/tools/ — protection against brute force and basic DDoS
  • HTTP/2 push for critical resources

php-fpm:

  • pm = dynamic, calculating pm.max_children by formula: (RAM - RAM_of_other_services) / avg_memory_per_process. For Bitrix, the average is typically 40–80 MB
  • OPcache: opcache.memory_consumption=256 (the default 128 MB isn't enough — Bitrix loads thousands of files), opcache.max_accelerated_files=20000, opcache.validate_timestamps=0 in production (reset via cachetool opcache:reset on deploy)
  • php.ini: memory_limit=256M (for heavy import operations — up to 512M), max_execution_time=60, upload_max_filesize=100M
  • slowlog with request_slowlog_timeout=5s — finding bottlenecks before users do

Monitoring and Logging

Infrastructure:

  • Prometheus + Grafana: CPU, RAM, disk, network, service health
  • Alerts: CPU > 80% for 5 minutes, free RAM < 500 MB, disk > 85%, php-fpm queue > 0 (a queue means there aren't enough workers)
  • Node Exporter, MySQL Exporter, PHP-FPM Exporter — metrics collected from every component

Application:

  • Uptime check every 60 seconds — if the site goes down, a Telegram alert within a minute
  • Response time for key URLs: /, /catalog/, /personal/order/make/
  • Sentry for PHP errors — not tail /var/log/php-errors.log, but structured errors with context
  • Monitoring Bitrix agents (b_agent in the database) — a stuck agent can silently break 1C data exchange for hours. We check NEXT_EXEC < NOW() - INTERVAL 1 HOUR

Logging:

  • ELK Stack or Loki + Grafana — nginx access/error, php-fpm slow log, MySQL slow query log, Bitrix errors — all in one place
  • Rotation via logrotate — without it, within six months access.log eats up 50 GB

Staging Environment

  • Identical to production: same versions of nginx, PHP, MySQL, same modules, same php.ini settings
  • Automatic update on merge into the staging branch
  • Periodic database clone from production. Personal data anonymization — UPDATE b_user SET EMAIL = CONCAT('user', ID, '@test.local'), PHONE = '' — data privacy compliance
  • HTTP Basic Auth or IP filtering. Robots.txt with Disallow: /
  • Sandbox mode for payment gateways to test payments

Ansible: Infrastructure as Code

Need a new server? ansible-playbook site.yml -l production — configured identically to the current one in 15 minutes:

  • Playbooks: nginx, php-fpm, MySQL, Redis, certbot, firewall
  • Reusable roles: common (users, SSH, NTP), web (nginx + php-fpm), db (MySQL + backup), monitoring (Prometheus + exporters)
  • Idempotency — re-running doesn't break anything
  • Inventory: [production], [staging], [development] — server group management

Backup

Component Frequency Retention Method
MySQL database Every 6 hours 30 days mysqldump --single-transaction + gzip
Files (upload/) Daily 14 days Incremental rsync
Full backup Weekly 60 days tar + gpg encryption
Server configs On change In Git Ansible playbooks
  • Geographic distribution — S3-compatible storage + separate server in another data center
  • Monthly test restore. A backup you've never restored from isn't a backup — it's an illusion of safety
  • Cron with notifications: if a backup fails — immediate alert

Typical Implementation Timeline

Task Timeline
Docker environment for local development 2–3 days
CI/CD pipeline (GitLab CI / GitHub Actions) 1–2 weeks
Staging environment 3–5 days
Monitoring + alerting (Prometheus + Grafana) 1–2 weeks
Centralized logging (ELK/Loki) 1–2 weeks
Ansible server automation 2–3 weeks
Comprehensive DevOps implementation 4–8 weeks

DevOps isn't a project with an end date — it's a transition from "uploaded via FTP and praying" to predictable processes. Every deploy is routine, every incident is an alert with context, every new developer gets docker-compose up instead of three days setting up their environment.