Upgrade Manual
1. Version Upgrade Compatibility
This document corresponds to Nacos 3.3.x. Upgrade compatibility for Nacos 3.3.x is as follows:
| Nacos Version | Upgrade Supported | Remarks |
|---|---|---|
| 0.X ~ 1.X | No | 0.X ~ 1.X versions must first be upgraded to 2.0 or above. Please refer to the Nacos 2.0 Upgrade Guide to upgrade to 2.0 or 2.1 before proceeding. |
| 2.0.X ~ 2.5.X | No direct smooth upgrade | Nacos 3.3 removes the Config compatibility migration used by 2.x. If the default namespace or legacy beta/tag gray tables were used, complete and verify data migration on 3.0.x–3.2.x before upgrading to 3.3.x. See Upgrading from 2.x. |
| 3.0.X ~ 3.3.X | Yes | Upgrading from 3.0.X or later to 3.3.X is supported, but the database schema has changed. Compare the schema file for your target database before upgrading and apply the required schema changes first. |
1.1 Client Compatibility
Compatibility between Nacos 3.x server and client versions is as follows:
| Client Version | Compatible | Remarks |
|---|---|---|
| 0.x | No | - |
| 1.x | No | To continue using 1.x clients, please integrate nacos-api-legacy-adapter yourself. |
| 2.x | Yes | - |
| 3.x | Yes | - |
Before upgrading the server, confirm that clients have valid identity credentials. Deployments using A2A must also complete the migration preparations in section 2.7.
2. Upgrade Steps
2.1. Pre-upgrade Checks
Complete these preparations before upgrading a production cluster:
- Confirm that the source cluster version is supported and that the database schema meets the requirements of the target 3.3.x release. See section 2.2 for database checks and changes.
- Back up the database, each node’s
data,conf, andcluster.conf, and any custom plugins and configuration. - Rehearse the upgrade and rollback in staging with a copy of production data.
- Inventory Client API callers and complete the auth migration in section 2.1.2. Do not wait for the first 3.3 node to start before distributing client credentials.
- Verify every node’s Server identity as described in section 2.1.3 and review the rollback limitations in section 2.8.1.
2.1.1. Confirm the Upgrade Path from 2.x
Nacos 3.3 removes the Config compatibility migration and no longer supports a direct smooth upgrade from 2.x. Inventory two kinds of historical data before upgrading:
- Default-namespace Config data still stored with an empty tenant must be migrated to
public. - Gray Config data in legacy
config_info_betaandconfig_info_tagtables must be migrated to the currentconfig_info_graymodel.
If either kind was used, or this cannot be confirmed, first upgrade to a 3.0.x–3.2.x release that supports the required migration. Complete it and verify default-namespace queries, gray rules, and the results received by gray clients before upgrading to 3.3.x. Skipping migration can make historical Config data unavailable or produce unexpected gray behavior. Even if the deployment already runs 3.x, confirm that any required migration actually completed; the running version alone is insufficient evidence.
This removal does not change current default namespace or beta/tag gray API semantics. Blank or omitted namespace requests still normalize to public. See Compatibility and Deprecation.
2.1.2. Prepare Client Authentication
Nacos 3.3 enables client authentication by default (nacos.core.auth.enabled=true). If clients lack valid identity credentials or permissions, Config queries, service registration, discovery, and other requests may be rejected after the upgrade, disrupting applications.
Choose an approach before upgrading:
- Clients are ready for authentication: confirm the server auth configuration and client credentials, then verify business operations such as Config queries, service registration, and discovery before upgrading.
- Clients cannot be updated yet: explicitly disable client authentication on every node to retain existing access. Enable it across the cluster after client credentials and permissions are ready.
| Deployment | Temporarily disable client authentication |
|---|---|
| Native distribution | Set nacos.core.auth.enabled=false in each node’s conf/application.properties. |
| Docker | Set NACOS_AUTH_ENABLE=false. |
| Helm | Set nacos.auth.enabled=false. |
| Operator | Set spec.certification.enabled: false in the Nacos custom resource. |
During the temporary opt-out, restrict Nacos access to trusted networks and restore authentication after updating clients. These switches affect only client authentication; Admin and Console API authentication remains unchanged.
2.1.3. Check JRaft Authentication Between Nodes
Nacos 3.3 adds JRaft authentication between nodes. Old nodes remain compatible during the rolling upgrade. Authentication is enabled automatically once all nodes have upgraded and their support is confirmed; no manual activation is required.
Before upgrading, ensure that nacos.core.auth.server.identity.key and nacos.core.auth.server.identity.value are nonempty and identical on every node. Incorrect values can cause communication failures after the upgrade and disrupt cluster reads and writes; correct them before proceeding. These properties must remain valid even if client authentication is temporarily disabled.
See section 2.8.1 for rollback limitations after the upgrade.
2.2. Apply Database Changes
Before starting any 3.3.x node, first follow the 3.2.x Upgrade Guide to apply the database prerequisites needed to bring the current source schema up to the 3.2.x schema level; this does not require starting a 3.2.x server. Then compare the resulting actual schema with the complete matching schema in the target 3.3.x distribution and convert the remaining differences into reviewed incremental DDL. Never execute a complete initialization file containing CREATE TABLE or DROP TABLE statements directly against an existing database.
For PostgreSQL deployments upgrading directly from 3.0.x, 3.1.x, 3.2.0, or 3.2.1, or deployments that skipped the 3.2.2 schema normalization, first complete the tenant_id not-null migration documented in the 3.2.x Upgrade Guide.
The target distribution provides mysql-schema.sql, pg-schema.sql, oracle-schema.sql, and derby-schema.sql under conf. After applying the 3.2.x schema prerequisites, pay particular attention to these additional 3.3.x changes:
| Change | Scope and action |
|---|---|
permissions.resource expands to 512 characters | The default auth and visibility plugins need a longer column for canonical resource identifiers. If the current column is shorter than 512 and explicit visibility grants will be used, run the matching *-upgrade-visibility-permission-resource.sql from the target distribution. Before running the MySQL script, verify that the InnoDB page size, row format, and unique-index length support VARCHAR(512) utf8mb4. |
| New AI resource search relational tables | Nacos 3.3 adds ai_resource_search_document, ai_resource_search_chunk, and ai_resource_task. AI Resource Search is controlled by nacos.ai.resource.search.enabled and is enabled by default. Before starting the target version against an existing external database, extract and review only the required CREATE TABLE and index statements for these tables from the target main-datasource schema; never copy adjacent DROP statements. If any table already exists, prepare an ALTER or data-migration plan instead of dropping and recreating it. These tables are not required only when AI Resource Search is explicitly disabled; Search is then unavailable, and ARD, which depends on Search, cannot be enabled. |
| PostgreSQL pgvector storage (optional) | Only when enabling the default PostgreSQL vector plugin, initialize pgvector objects and ai_resource_search_embedding_pg in the PostgreSQL datasource that stores embeddings. conf/pg-ai-vector-schema.sql is separate from the main pg-schema.sql, contains CREATE EXTENSION and destructive initialization statements, and requires the pgvector extension and sufficient database privileges. Only a fresh vector store may run it unchanged after review; existing tables require a backup and an incremental migration instead of rerunning the file. |
| AI resource description column expansion | In PostgreSQL, Oracle, and Derby, expand ai_resource.c_desc and ai_resource_version.c_desc to 2048 when their current length is smaller. Generate reviewed ALTER statements from the actual table definition and target schema instead of assuming the default length from a particular 3.2.x patch. |
| MySQL collation for fresh schemas | Fresh 3.3 MySQL schemas use the case-sensitive utf8mb4_bin collation for existing core tables. No general in-place collation migration is currently provided for existing databases. Do not bulk-alter production tables from the full schema; review case-sensitive identity requirements and use a separately validated migration plan if alignment is required. |
2.3. Migrate Configuration and Plugins
Nacos 3.3 unifies server plugin configuration. Most legacy configuration keys remain supported in 3.3, but may be removed in a future release. They do not all need to be replaced during this upgrade. Compare the current configuration with the target distribution’s conf/application.properties and migrate progressively to the new keys; avoid overwriting the target file with the source-version configuration file. See System Configurations for commonly used parameters and Plugin Migration Guide for migration guidance.
2.3.1. Default Auth Plugin
The default implementation remains nacos, but it is managed as auth:nacos in the unified plugin system. Its selector and private properties move to the canonical nacos.plugin.auth.* namespace.
| 3.0.x–3.2.x legacy property | 3.3 canonical property |
|---|---|
nacos.core.auth.system.type | nacos.plugin.auth.type |
nacos.core.auth.caching.enabled | nacos.plugin.auth.nacos.caching.enabled |
nacos.core.auth.plugin.nacos.token.* | nacos.plugin.auth.nacos.token.* |
nacos.core.auth.nacos.anonymous.ai.enabled | nacos.plugin.auth.nacos.anonymous.ai.enabled |
nacos.core.auth.ldap.* | nacos.plugin.auth.ldap.*, using canonical kebab-case item names from the plugin definitions |
nacos.core.auth.plugin.oidc.* | nacos.plugin.auth.oidc.* |
nacos.core.auth.enabled, nacos.core.auth.admin.enabled, nacos.core.auth.console.enabled, and nacos.core.auth.server.identity.* remain core auth gates or server identity properties. Do not move them into a plugin-private namespace.
When a canonical property and a legacy property are both present, the canonical property wins. An empty canonical value still suppresses the legacy property. Most legacy properties remain readable in 3.3, but the target distribution may already provide defaults for their canonical replacements. When merging configuration, ensure that those defaults do not override the values in use. The startup script automatically handles only a valid legacy token secret in application.properties; other legacy keys are not rewritten automatically and can be migrated progressively by following log warnings. LDAP, OIDC, and custom auth deployments should also review the Auth Plugin page item by item.
If anonymous AI access is enabled, an explicit empty or invalid Authorization, accessToken, username, or password is rejected instead of falling back to anonymous access. Anonymous callers must omit credentials completely; authenticated callers must send valid credentials.
2.3.2. Other Plugin Configuration
| Domain | 3.0.x–3.2.x legacy configuration | 3.3 canonical model |
|---|---|---|
| Datasource dialect | spring.sql.init.platform; the older spring.datasource.platform has been removed | nacos.plugin.datasource-dialect.type |
| Datasource connection | db.* and JVM property QUERYTIMEOUT | nacos.plugin.datasource.db.* |
| Traffic control | nacos.plugin.control.manager.type | nacos.plugin.control.type |
| Config Change | nacos.core.config.plugin.{pluginName}.* | nacos.plugin.config-change.{pluginName}.{itemKey} and unified implementation state |
| Visibility | nacos.plugin.visibility.type | This deprecated RESTART selector still chooses the implementation requested by the AI domain and contributes to initial state; nacos.plugin.visibility.{pluginName}.enabled or persisted state determines availability, while nacos.plugin.visibility.enabled remains the capability gate |
| AI Pipeline | Comma-separated nacos.plugin.ai-pipeline.type and legacy camel-case items | Per-implementation nacos.plugin.ai-pipeline.{pluginName}.enabled, canonical kebab-case items, and unified state |
| AI Resource Import | nacos.ai.resource.import.enabled, nacos.plugin.ai.importer.*, and Source/preset/list models | nacos.plugin.ai-resource-import.enabled, nacos.plugin.ai-resource-import.{pluginName}.*, and fixed managed sources |
Legacy properties may remain readable as aliases during the compatibility window and produce migration warnings, but a present canonical property has higher priority. Persisted implementation state also overrides static .enabled initial values. Dialect and exclusive implementation selectors, and every field marked RESTART, must be changed through static configuration followed by a restart, not through the plugin configuration API.
AI Resource Import now defaults to enabled when neither its canonical gate nor the legacy alias is configured. To keep it disabled after the upgrade, set this before rollout:
nacos.plugin.ai-resource-import.enabled=falseThe legacy Importer/Source SPI, clonable Source/preset model, and configuration-based cloning of one importer to multiple endpoints have been removed. External implementations must migrate to AiResourceImportServiceBuilder. See AI Resource Import migration for the detailed mapping and built-in sources.
2.3.3. Custom and Third-party Plugins
- Record each implementation by its stable
pluginType:pluginName, remove duplicate identities, and confirm that the target release discovers the intended JAR. Duplicate identities now resolve deterministically with the first implementation winning. - Older zero-configuration plugins usually remain binary-loadable, but they appear configurable only after implementing
PluginConfigSpecdefinitions, a current configuration snapshot, and apply callbacks. - Older Config Change binaries remain loadable during the compatibility window but show
configurable=false; migrate them to definitions and callbacks. - AI Pipeline no longer loads
PublishPipelineServiceBuilder. Recompile pipeline plugins, registerPublishPipelineServicedirectly with a public no-argument constructor, and implement the unified configuration contract. - Third-party datasource plugins that implement or register the removed
ConfigInfoBetaMapper,ConfigInfoTagMapper, orConfigMigrateMapperSPIs must be rebuilt without those interfaces. Complete pre-3.0 data migration before upgrading. - The legacy AI Resource Import SPI has no adapter. Recompile the plugin and update its configuration and callers together; do not mix the two models.
- Critical plugin types such as auth, datasource dialect, and AI storage can block startup when their selected implementation is missing, disabled, or fails initialization. Validate selection, state, and initialization in staging.
- On one node, verify plugin list/detail, effective sources, masking, and
RESTARTguidance. Do not submit runtime configuration understood only by 3.3 nodes during a rolling upgrade.
2.3.4. Migrate Deprecated AI APIs That Are Disabled by Default
The following deprecated v3 APIs are disabled by default. Migrate callers to their canonical replacements:
| Deprecated API | Replacement API |
|---|---|
GET /v3/admin/ai/pipelines | GET /v3/admin/ai/pipelines/list |
GET /v3/admin/ai/pipelines/{pipelineId} | GET /v3/admin/ai/pipelines/detail?pipelineId={pipelineId} |
GET /v3/console/ai/pipelines | GET /v3/console/ai/pipelines/list |
GET /v3/console/ai/pipelines/{pipelineId} | GET /v3/console/ai/pipelines/detail?pipelineId={pipelineId} |
POST /v3/console/ai/mcp/import/validate | POST /v3/console/ai/import/validate |
POST /v3/console/ai/mcp/import/execute | POST /v3/console/ai/import/execute |
When disabled, they return HTTP 410 Gone with the API_DEPRECATED result code and identify the replacement API. If a migration window is required, temporarily set nacos.core.api.compatibility.enabled=true on nodes serving these endpoints, then restore the default false after migrating callers. This shared switch enables all endpoints in the table, with their existing authentication and authorization still enforced. It neither restores v1/v2 HTTP APIs nor controls the old A2A compatibility path in section 2.7.
The old nacos.ai.resource.import.legacy-mcp-api-enabled property is no longer recognized. Legacy MCP direct-URL import additionally requires explicit nacos.ai.resource.import.allow-user-url=true. Prefer managed sources and the new request model; changing only the URL while retaining all old parameters is insufficient. See AI Resource Import Migration.
2.4. Distribution Upgrade
2.4.1. Download the Target Version
Go to the Nacos download page, choose a stable version, and click ${nacos.version}.zip in the Binary Package column.
If the download is rate-limited, retry later or use GitHub instead.
Go to the Nacos GitHub releases page, select the target release, and download nacos-server-${target_version}.zip or the corresponding tar.gz asset.
2.4.2. Prepare a New Installation Directory
Extract the target distribution into a new directory:
unzip nacos-server-${target_version}.zip -d ${INSTALL_PARENT}# or tar -xvf nacos-server-${target_version}.tar.gz -C ${INSTALL_PARENT}The 3.3 distribution contains a coordinated server JAR, default plugins, schemas, startup scripts, and configuration templates. Do not replace only target/nacos-server.jar, and do not overwrite the new bin, conf, or complete plugins directory with files from the source version.
Migrate deployment-specific data as follows:
- Start from the new
application.propertiesand move the properties verified in section 2.3 one by one. - Compare and recreate
cluster.conf, JVM options, log paths, certificates, and other deployment-specific files. - Copy only custom or third-party plugin JARs that passed 3.3 compatibility verification.
- Every deployment must migrate or restore that node’s existing
data/pluginsoplugin-states.jsonandplugin-configs.jsonare retained. With Derby or embedded storage, migrate the completedataonly after shutdown and a full backup. An external-database cluster must not blindly copy active Raft data between nodes; reuse that node’s own persistent volume or follow the rehearsed node-recovery procedure. Never let old and new processes use the same data directory concurrently.
2.4.3. Restart or Roll Through the Cluster
For a standalone deployment, stop the old instance and start with the new distribution scripts:
${OLD_NACOS_HOME}/bin/shutdown.sh${NEW_NACOS_HOME}/bin/startup.sh -m standaloneFor a cluster, upgrade one node at a time. Stop one source-version node, start it with its 3.3 configuration and the new distribution, and wait until it rejoins the cluster and core behavior is healthy before proceeding to the next node. Do not change unified plugin runtime state or configuration until all nodes run 3.3.
On Windows, use shutdown.cmd and startup.cmd from the new distribution rather than reusing the old scripts.
2.5. Docker/Kubernetes Upgrade
Container deployments must also complete the database, historical migration, and plugin checks in sections 2.1 through 2.3 before changing images. Compare the target image’s environment-variable conversion rules and the mounted application.properties; do not assume that every old environment variable maps to a canonical plugin property. See System Configurations - Startup Script and Image Variables.
Update the image version in the Compose file:
services: nacos: image: nacos/nacos-server:${target_version}Pull the target image. For a standalone service named nacos, rebuild only that service:
docker compose pulldocker compose up -d --no-deps nacosWhen Compose manages a multi-node cluster, do not run one up operation that recreates every Nacos service. Run docker compose up -d --no-deps ${nacos_service_name} for one service at a time, verify that the node has rejoined and is healthy, and then continue with the next service.
Update the workload image, for example:
kubectl set image deployment/nacos-deployment \ ${container_name}=nacos/nacos-server:${target_version}kubectl rollout status deployment/nacos-deploymentSet a rolling strategy appropriate for the cluster size. Wait for each Pod to become ready and rejoin the Nacos cluster before replacing more Pods.
2.6. Wait for Automatic MCP Data Migration
When upgrading a deployment with existing MCP Server data from Nacos 3.0.x–3.2.x, no manual data migration is required. Complete the server rollout and wait for background migration to finish. Existing MCP service addresses and client calling patterns remain unchanged.
2.6.1. Expected Behavior During the Upgrade
- Existing MCP management APIs remain available. New management APIs may temporarily return
409 / RESOURCE_CONFLICT; use the existing APIs while waiting for migration to finish. - Migration completes after all nodes upgrade, historical data passes validation, and enabled search indexes are ready. Tasks retry approximately every 5 minutes by default, so several cycles may be needed.
- Normally keep
nacos.ai.mcp.resource.reconciliation.enabled=trueand retain the other migration defaults. See System Configurations.
2.6.2. Post-upgrade Checks
Confirm that all nodes are healthy and Server logs report migration completion. Verify MCP list/detail queries and the new management APIs.
2.6.3. Troubleshoot an Incomplete Migration
| Symptom | Action |
|---|---|
New management APIs keep returning 409 / RESOURCE_CONFLICT | Confirm that all nodes are upgraded and healthy, inspect migration logs, and wait for automatic retries. |
| Logs report that search indexes are not ready | Check the tables and datasources required in section 2.2 and wait for index initialization. |
| Logs report missing, malformed, or conflicting historical data | Back up the data and repair it through management APIs. If the correct action is unclear, retain the logs and contact maintainers. |
2.6.4. Rollback Considerations
After MCP migration completes, downgrading does not automatically reverse the new management data. Deployments using MCP must verify that the target version can handle that data before rollback.
2.7. Automatic Historical A2A Data Migration
This section applies to upgrades from Nacos 3.1.x–3.2.x that already use A2A Agent management or service registration through an old A2A SDK. Before upgrading, configure every target-version node as follows:
nacos.ai.a2a.compatibility.mode=AUTOnacos.ai.a2a.migration.legacy-naming-shadow-enabled=falseThe default CANONICAL mode does not migrate historical A2A data. Existing A2A deployments must explicitly use AUTO. Keep Agent Storage and migration configuration consistent across nodes, and do not change these settings after migration starts.
Ordinary A2A API/SDK callers can keep legacy-naming-shadow-enabled=false. Only applications that read old <legacyEncodedAgentName>::<exactVersion> service names directly through the Naming Gateway need to set it to true before migration; otherwise, discovery through those names may stop working after migration. Normally retain other migration defaults. See System Configurations.
2.7.1. Expected Behavior During the Upgrade
| Migration state in logs | Business impact |
|---|---|
SYNCING | Background migration is running. Queries, subscriptions, definition writes, and service registration through the old A2A protocol remain available. |
QUIESCING | A2A definition changes are briefly blocked with 409 / AGENT_MIGRATION_IN_PROGRESS (50105); retry later. Old-protocol reads, registration, heartbeats, and existing service calls continue. |
CANONICAL | Migration is complete. Old A2A APIs/SDKs remain compatible, and canonical Agent/RAD features are available. |
Until historical migration completes, external RAD search, discovery, publish, Endpoint registration, and subscription requests return 409 / AGENT_MIGRATION_IN_PROGRESS (50105); gRPC returns the same business error code. Retry requests or subscriptions after migration completes. Heartbeats for existing valid Endpoints, complete deregistration, and local subscription cancellation remain available.
Complete the server rollout and migration before upgrading clients that depend on RAD. A new SDK may use RAD even when calling A2A methods, so the same restrictions apply without automatic fallback to the old protocol.
2.7.2. Post-upgrade Checks
Confirm that every node is upgraded and healthy and that Server logs report migration completion. Check existing Agent names, versions, content, and service addresses, and verify both old A2A calls and RAD discovery.
2.7.3. Troubleshoot an Incomplete Migration
| Symptom | Action |
|---|---|
Migration stays in SYNCING | Confirm that every node is upgraded and uses consistent AUTO and migration settings. Inspect migration logs. |
| Logs report that search indexes are not ready | Check the tables and datasources required in section 2.2 and wait for index initialization. |
| Logs report missing historical data or name conflicts | Back up the data, then repair it or resolve conflicts through management APIs. Contact maintainers if the correct action is unclear. |
| Logs report Endpoint synchronization failures | Check old A2A client connections and heartbeats, restore them, and wait for automatic retries. |
2.7.4. Rollback Considerations
Before migration completes, you can stop automatic migration by setting every node to LEGACY on the current version and performing a rolling restart. This does not roll back the server version.
After migration completes, returning to a version that understands only old A2A data is unsupported. If rollback is required, verify target-version compatibility and also follow the limitations in section 2.8.1.
2.8. Post-upgrade Verification and Rollback Preparation
Verify at least the following after upgrading:
- Every node is upgraded and healthy, with no persistent communication, authentication, database, or plugin-loading errors in the logs.
- Config publish/query, service registration/discovery, and Console login work. Clients with authentication enabled can access their resources. If authentication is temporarily disabled, confirm when it will be enabled.
- Deployments upgraded from 2.x have working default-namespace Config data and existing gray rules.
- Custom plugins load correctly, with the expected configuration and enabled state.
- If AI resource search or vector search is used, indexes finish initializing and queries work.
- If MCP or A2A is used, follow sections 2.6 and 2.7 to confirm migration completion, existing business calls, and new management features. Applications using old Naming Gateway service names must also verify discovery.
- Callers of the old AI APIs in section 2.3.4 have migrated, or the temporary compatibility switch is configured.
Retain the pre-upgrade distribution, configuration, plugins, and data backups until the observation period ends.
2.8.1. Rollback Considerations
If a problem occurs during the upgrade, pause the remaining node upgrades and check node identity, database changes, and plugin configuration. Prefer correcting configuration and verifying recovery when that resolves the problem.
Once the upgrade completes and JRaft authentication activates, do not directly perform a rolling downgrade to an older version without that authentication support. Doing so can break communication between nodes and make the cluster unavailable. Disabling client authentication does not remove this limitation.
If rollback may be needed, verify the target version’s compatibility and rehearse it before upgrading. For an unverified rollback, preserve the current state and logs and contact maintainers to confirm the recovery approach.