diff --git a/labs/docker-swarm/data/conf/nfs4/exports.conf b/labs/docker-swarm/data/conf/nfs4/exports.conf
new file mode 100644
index 00000000..3935c4c3
--- /dev/null
+++ b/labs/docker-swarm/data/conf/nfs4/exports.conf
@@ -0,0 +1 @@
+/exports *(rw,sync,no_subtree_check,fsid=0,no_root_squash)
\ No newline at end of file
diff --git a/labs/doris/Kafka2Doris/.gitignore b/labs/doris/Kafka2Doris/.gitignore
new file mode 100644
index 00000000..988994ff
--- /dev/null
+++ b/labs/doris/Kafka2Doris/.gitignore
@@ -0,0 +1,16 @@
+*.bak
+*.suo
+*.db
+*.user
+.vs
+obj
+Obj
+bin
+Bin
+debug
+Debug
+release
+Release
+Logs
+logs
+node_modules
\ No newline at end of file
diff --git a/labs/doris/Kafka2Doris/Kafka2Doris.csproj b/labs/doris/Kafka2Doris/Kafka2Doris.csproj
new file mode 100644
index 00000000..35f2fa42
--- /dev/null
+++ b/labs/doris/Kafka2Doris/Kafka2Doris.csproj
@@ -0,0 +1,13 @@
+
+
+
+ Exe
+ net5.0
+
+
+
+
+
+
+
+
diff --git a/labs/doris/Kafka2Doris/Kafka2Doris.sln b/labs/doris/Kafka2Doris/Kafka2Doris.sln
new file mode 100644
index 00000000..4a9668ba
--- /dev/null
+++ b/labs/doris/Kafka2Doris/Kafka2Doris.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.31205.134
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kafka2Doris", "Kafka2Doris.csproj", "{5DA8804A-D6EE-40D6-A3C5-3A160656CB1D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5DA8804A-D6EE-40D6-A3C5-3A160656CB1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5DA8804A-D6EE-40D6-A3C5-3A160656CB1D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5DA8804A-D6EE-40D6-A3C5-3A160656CB1D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5DA8804A-D6EE-40D6-A3C5-3A160656CB1D}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {C9AE1A91-D599-4677-8B52-313448B44F38}
+ EndGlobalSection
+EndGlobal
diff --git a/labs/doris/Kafka2Doris/Program.cs b/labs/doris/Kafka2Doris/Program.cs
new file mode 100644
index 00000000..83813438
--- /dev/null
+++ b/labs/doris/Kafka2Doris/Program.cs
@@ -0,0 +1,31 @@
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+
+namespace Kafka2Doris
+{
+ internal class Program
+ {
+ private static void Main(string[] args)
+ {
+ Host.CreateDefaultBuilder(args)
+ .ConfigureLogging(o =>
+ {
+ o.AddConsole();
+ })
+ .ConfigureAppConfiguration((hostingContext, configuration) =>
+ {
+ configuration
+ .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
+ .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true);
+ })
+ .ConfigureServices((hostingContext, services) =>
+ {
+ services.AddHostedService();
+ })
+ .Build()
+ .Run();
+ }
+ }
+}
\ No newline at end of file
diff --git a/labs/doris/Kafka2Doris/Properties/launchSettings.json b/labs/doris/Kafka2Doris/Properties/launchSettings.json
new file mode 100644
index 00000000..f32249bd
--- /dev/null
+++ b/labs/doris/Kafka2Doris/Properties/launchSettings.json
@@ -0,0 +1,7 @@
+{
+ "profiles": {
+ "Kafka2Doris": {
+ "commandName": "Project"
+ }
+ }
+}
\ No newline at end of file
diff --git a/labs/doris/Kafka2Doris/Worker.cs b/labs/doris/Kafka2Doris/Worker.cs
new file mode 100644
index 00000000..579e20ad
--- /dev/null
+++ b/labs/doris/Kafka2Doris/Worker.cs
@@ -0,0 +1,31 @@
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Kafka2Doris
+{
+ public class Worker : BackgroundService
+ {
+ private readonly ILogger _logger;
+ private readonly IConfiguration _config;
+
+ public Worker(ILogger logger, IConfiguration config)
+ {
+ this._logger = logger;
+ this._config = config;
+ }
+
+ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
+ {
+ while (!stoppingToken.IsCancellationRequested)
+ {
+ _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
+ //读取kafka
+ await Task.Delay(this._config.GetValue("delay", 1000 * 60), stoppingToken);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/labs/doris/Kafka2Doris/appsettings.json b/labs/doris/Kafka2Doris/appsettings.json
new file mode 100644
index 00000000..e07b357d
--- /dev/null
+++ b/labs/doris/Kafka2Doris/appsettings.json
@@ -0,0 +1,4 @@
+{
+ "delay": 60,
+ "group": 1000
+}