@@ -68,6 +68,17 @@ impl SystemdManager {
6868 // This gives enough window for the allowed burst of restarts
6969 let start_limit_interval = config. restart_delay * config. restart_retries * 2 ;
7070
71+ let service_user_line = if !self . user_mode {
72+ std:: env:: var ( "OPENCODE_SERVICE_USER" )
73+ . ok ( )
74+ . map ( |value| value. trim ( ) . to_string ( ) )
75+ . filter ( |value| !value. is_empty ( ) )
76+ . map ( |value| format ! ( "User={value}\n " ) )
77+ . unwrap_or_default ( )
78+ } else {
79+ String :: new ( )
80+ } ;
81+
7182 format ! (
7283 r#"[Unit]
7384Description=opencode-cloud container service
@@ -77,7 +88,7 @@ Requires=docker.service
7788
7889[Service]
7990Type=simple
80- ExecStart={exec_start}
91+ {service_user_line} ExecStart={exec_start}
8192ExecStop={exec_stop}
8293Restart=on-failure
8394RestartSec={restart_delay}s
@@ -92,6 +103,7 @@ WantedBy=default.target
92103 restart_delay = config. restart_delay,
93104 restart_retries = config. restart_retries,
94105 start_limit_interval = start_limit_interval,
106+ service_user_line = service_user_line,
95107 )
96108 }
97109
@@ -361,6 +373,25 @@ mod tests {
361373 assert ! ( unit. contains( "StartLimitIntervalSec=100" ) ) ; // 10 * 5 * 2
362374 }
363375
376+ #[ test]
377+ fn test_generate_unit_file_system_user ( ) {
378+ std:: env:: set_var ( "OPENCODE_SERVICE_USER" , "ubuntu" ) ;
379+
380+ let manager = SystemdManager :: new ( "system" ) ;
381+ let config = ServiceConfig {
382+ executable_path : PathBuf :: from ( "/usr/bin/occ" ) ,
383+ restart_retries : 3 ,
384+ restart_delay : 5 ,
385+ boot_mode : "system" . to_string ( ) ,
386+ } ;
387+
388+ let unit = manager. generate_unit_file ( & config) ;
389+
390+ assert ! ( unit. contains( "User=ubuntu" ) ) ;
391+
392+ std:: env:: remove_var ( "OPENCODE_SERVICE_USER" ) ;
393+ }
394+
364395 #[ test]
365396 fn test_is_installed_returns_false_for_nonexistent ( ) {
366397 let manager = SystemdManager :: new ( "user" ) ;
0 commit comments