我尝试在 systemd 中配置 keycloak.service 以将 keycloak 18.0.2 作为守护进程运行。当前文件夹符号链接到 kk 文件夹。我尝试在端口 8180 上以开发模式启动 kk
[Unit]
Description=Keycloak
After=network.target
[Service]
Type=idle
User=keycloak
Group=keycloak
ExecStart=/opt/keycloak/current/bin/kc.sh start-dev --http-port=8180
TimeoutStartSec=600
TimeoutStopSec=600
[Install]
WantedBy=multi-user.target
但是没用。 如果我只是跑
bin/kc.sh start-dev --http-port=8180
它工作正常,但不是作为守护进程
解决问题。正确的配置是:
[Unit]
Description=Keycloak
After=network.target
[Service]
User=keycloak
Group=keycloak
ExecStart=/opt/keycloak/current/bin/kc.sh start-dev --http-port=8180
[Install]
WantedBy=multi-user.target
确保正确的用户拥有所有需要的权限
chown keycloak: -R /opt/keycloak
您缺少运行 keycloak 的配置文件,另一种解决方案是直接将文件复制到:
~/keycloak/docs/contrib/scripts/systemd/wildfly.service
到您的 /etc/systemd/system/
目录,无论哪种方式,您的 deamon 文件都应如下所示:
[Unit]
Description=The Keycloak Server
After=network.target
[Service]
EnvironmentFile=/etc/keycloak/keycloak.conf
User=keycloak
Group=keycloak
PIDFile=/var/run/keycloak/keycloak.pid
ExecStart=/opt/keycloak/bin/launch.sh $WILDFLY_MODE $WILDFLY_CONFIG $WILDFLY_BIND
StandardOutput=null
[Install]
WantedBy=multi-user.target
你应该在commnd之前添加!,它会像这样工作:
ExecStart=!/opt/keycloak/current/bin/kc.sh start-dev --http-port=8180
最好将 systemd 服务配置为使用
Type=notify
而不是默认的 Type=simple
.
使用
Type=simple
,服务管理器(systemd)将认为服务在服务进程被fork掉后立即启动,即使它未能正确启动。在使用Type=notify
时,服务管理器将等待服务进程的信号通知以将其视为已启动。
你可以通过使用这个 quarkiverse 扩展来实现:
假设Keycloak分布位于
/opt/keycloak
:
/opt/keycloak/providers
目录:/etc/systemd/system/keycloak.service
:[Unit]
Description=Keycloak Server
After=network.target
Wants=network.target
[Service]
Type=notify
NotifyAccess=all
Environment=JAVA_HOME=/opt/jre
ExecStart=/opt/keycloak/bin/kc.sh start-dev --http-port=8080 --log=console,file --log-file=/var/log/keycloak/keycloak.log
SuccessExitStatus=0 143
[Install]
WantedBy=multi-user.target
sudo systemctl enable keycloak
sudo systemctl start keycloak
sudo systemctl stop keycloak
sudo systemctl restart keycloak
sudo systemctl status keycloak