Running JJHub Observe on Phytium/Kunpeng + Kylin V10 + Dameng DM8: ARM images, kernel tuning, Dameng metadata migration, domestic middleware, security baselines, and a post-migration smoke-test checklist.
The scariest part of a Xinchuang (domestic-stack) migration is not whether the app will start, but whether it will stay stable once it does. We've deployed JJHub Observe end to end — collection, storage, and console — on domestic hardware and OSes at several government and financial sites, and hit our share of problems. This article distills what's reusable.
Give the console and storage nodes at least 8 cores / 32 GB. The Collector can run on 2 cores / 4 GB; under load a single instance handles roughly 30,000 log writes per second. Storage is the real bottleneck — if you plan to retain more than 30 days of hot data, size storage nodes to 16C/64G and use NVMe rather than SATA SSD.
The official registry ships linux/arm64 images. Specify the platform when pulling:
docker pull --platform linux/arm64 hub.jjhub.cn/observe/observe-server:2.6.0
docker pull --platform linux/arm64 hub.jjhub.cn/observe/observe-collector:2.6.0
If the site has no internet access, use the offline bundle observe-offline-2.6.0-arm64.tar.gz and run docker load -i — no recompilation needed.
One real pitfall: Kylin V10 defaults vm.max_map_count to 65530, which is too low for storage components like Elasticsearch/ClickHouse; they OOM or refuse to start. Set it before deploying, and raise a couple of related limits at the same time:
sysctl -w vm.max_map_count=262144
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
echo "net.core.somaxconn=32768" >> /etc/sysctl.conf
echo "fs.file-max=1048576" >> /etc/sysctl.conf
Also raise the file-descriptor limit for the container runtime (ulimit -n 65535), or the Collector will run out of descriptors under heavy log ingest and drop connections silently. Silent dropping is the worst kind of failure — it looks like a data gap, not a crash.
JJHub Observe stores metadata (users, projects, alert rules, audit logs) in MySQL by default; switch to Dameng DM8 for domestic environments. The console exposes a config option — no code changes:
storage:
metadata:
driver: dm8
host: 10.0.0.20
port: 5236
username: OBSERVE
password: "***"
schema: OBSERVE
The heavy detail — trace attributes and raw log text — goes through the columnar storage layer, not Dameng, so DM never gets buried under high-volume data. Set DM8's compatibility mode at init time — COMPATIBLE_MODE=4 (Oracle-compatible syntax) or the MySQL-compatible mode per the official docs; changing it later means rebuilding the database. If you're migrating an existing MySQL metadata store, use the built-in export/import tool rather than hand-copying tables: DM data types differ (for example TEXT vs CLOB), and a manual copy will corrupt encodings on Chinese text.
To deploy the console on domestic middleware, upgrade web.xml in the WAR to a Servlet 4.0 declaration — both Apusic AS and TongWeb accept it. Some domestic middleware default to strict cookie flags that can break the console's WebSocket; enable the websocket module and allow origin matching. Common security-baseline items from security assessment (password complexity, login-failure lockout, operation auditing) can be toggled on under "System Settings → Security Policy", so you don't re-implement them at the application layer.
disql to verify metadata tables read and write correctlyThe payoff of a Xinchuang migration is more than "compliance" — domestic-stack procurement and maintenance cost less over the long run. The key is not to treat migration as a one-off project: think through the day-to-day (upgrades, backups, scaling) before you call it done.
A final operational point: after cutover, run the platform on the domestic stack for at least one full business cycle (a month, ideally a quarter-end for financial clients) before decommissioning the old stack. Most incompatibilities don't show up in the first smoke test; they surface under sustained load, during batch windows, or when a specific Dameng maintenance job runs. Keeping the old environment warm for one cycle gives you a rollback path that costs almost nothing.