37 changed files with 538 additions and 43 deletions
@ -0,0 +1,25 @@ |
|||
##
|
|||
## Makefile for Keycloak quadlet
|
|||
##
|
|||
|
|||
DEPENDENCIES = postgresql traefik |
|||
|
|||
# Keycloak quadlet is mapped to the 10007 user (keycloak) and 10000 group (itix-svc)
|
|||
PROJECT_UID = 10007 |
|||
PROJECT_GID = 10000 |
|||
|
|||
# PostgreSQL initialization scripts
|
|||
TARGET_POSTGRESQL_FILES = $(patsubst other/postgresql/%, $(TARGET_CHROOT)/etc/quadlets/postgresql/init.d/%, $(wildcard other/postgresql/*)) |
|||
TARGET_EXAMPLE_FILES += $(TARGET_POSTGRESQL_FILES) |
|||
$(TARGET_CHROOT)/etc/quadlets/postgresql/init.d/%.sql: other/postgresql/%.sql |
|||
install -m 0600 -o 10004 -g 10000 $< $@ |
|||
|
|||
# Traefik configuration files
|
|||
TARGET_TRAEFIK_FILES = $(patsubst other/traefik/%, $(TARGET_CHROOT)/etc/quadlets/traefik/conf.d/%, $(wildcard other/traefik/*)) |
|||
TARGET_EXAMPLE_FILES += $(TARGET_TRAEFIK_FILES) |
|||
$(TARGET_CHROOT)/etc/quadlets/traefik/conf.d/%: other/traefik/% |
|||
install -m 0644 -o 10001 -g 10000 $< $@ |
|||
|
|||
TOP_LEVEL_DIR := .. |
|||
include $(TOP_LEVEL_DIR)/Makefile.common |
|||
|
|||
@ -0,0 +1,13 @@ |
|||
FROM quay.io/keycloak/keycloak:latest AS builder |
|||
ENV KC_DB=postgres \ |
|||
KC_HEALTH_ENABLED=true \ |
|||
KC_METRICS_ENABLED=true \ |
|||
KC_HTTP_ENABLED=true \ |
|||
KC_HTTP_ACCESS_LOG_ENABLED=true |
|||
WORKDIR /opt/keycloak |
|||
RUN /opt/keycloak/bin/kc.sh build |
|||
|
|||
FROM quay.io/keycloak/keycloak:latest |
|||
COPY --from=builder /opt/keycloak/ /opt/keycloak/ |
|||
ENTRYPOINT ["/opt/keycloak/bin/kc.sh"] |
|||
CMD ["start --optimized"] |
|||
@ -0,0 +1,18 @@ |
|||
# See https://www.keycloak.org/server/all-config for all available configuration options |
|||
KC_DB=postgres |
|||
KC_DB_URL_DATABASE=keycloak |
|||
KC_DB_URL_HOST=127.0.0.1 |
|||
KC_DB_URL_PORT=5432 |
|||
KC_DB_USERNAME=keycloak |
|||
KC_DB_PASSWORD=keycloak |
|||
KC_HOSTNAME=http://keycloak |
|||
KC_HEALTH_ENABLED=true |
|||
KC_METRICS_ENABLED=true |
|||
KC_BOOTSTRAP_ADMIN_USERNAME=admin |
|||
KC_BOOTSTRAP_ADMIN_PASSWORD=keycloak |
|||
KC_HTTP_ENABLED=true |
|||
KC_HTTP_PORT=8080 |
|||
KC_HTTP_HOST=127.0.0.1 |
|||
KC_HTTP_ACCESS_LOG_ENABLED=true |
|||
KC_PROXY_HEADERS=xforwarded |
|||
KC_PROXY_TRUSTED_ADDRESSES=127.0.0.1 |
|||
@ -0,0 +1,13 @@ |
|||
variant: fcos |
|||
version: 1.4.0 |
|||
ignition: |
|||
config: |
|||
merge: |
|||
- local: base.ign |
|||
- local: traefik.ign |
|||
- local: traefik-examples.ign |
|||
- local: postgresql.ign |
|||
- local: postgresql-examples.ign |
|||
- local: keycloak.ign |
|||
- local: keycloak-examples.ign |
|||
- local: local.ign |
|||
@ -0,0 +1,11 @@ |
|||
[Unit] |
|||
Description=Keycloak Container image build timer |
|||
Documentation=https://www.keycloak.org/server/containers |
|||
PartOf=keycloak.target |
|||
|
|||
[Timer] |
|||
OnCalendar=weekly |
|||
Persistent=true |
|||
|
|||
[Install] |
|||
WantedBy=keycloak.target |
|||
@ -0,0 +1,10 @@ |
|||
[Unit] |
|||
Description=Keycloak Container image build |
|||
Documentation=https://www.keycloak.org/server/containers |
|||
Wants=network-online.target |
|||
After=network-online.target |
|||
|
|||
[Build] |
|||
File=/etc/quadlets/keycloak/container/Containerfile |
|||
ImageTag=localhost/keycloak:latest |
|||
SetWorkingDirectory=/etc/quadlets/keycloak/container |
|||
@ -0,0 +1,44 @@ |
|||
[Unit] |
|||
Description=Keycloak Service |
|||
Documentation=https://www.keycloak.org/server/containers |
|||
After=network.target keycloak-build.service |
|||
Wants=keycloak-build.service |
|||
|
|||
# Only start if Keycloak has been configured |
|||
ConditionPathExists=/etc/quadlets/keycloak/config.env |
|||
|
|||
# Start/stop this unit when the target is started/stopped |
|||
PartOf=keycloak.target |
|||
|
|||
[Container] |
|||
ContainerName=keycloak |
|||
Image=localhost/keycloak:latest |
|||
AutoUpdate=local |
|||
|
|||
# Network configuration |
|||
Network=host |
|||
|
|||
# Keycloak specific commands |
|||
Exec=start --optimized |
|||
|
|||
# Health check |
|||
HealthCmd=curl -sSf http://127.0.0.1:8080/health |
|||
HealthInterval=30s |
|||
HealthTimeout=10s |
|||
HealthStartPeriod=10s |
|||
HealthRetries=3 |
|||
|
|||
# Configuration file |
|||
EnvironmentFile=/etc/quadlets/keycloak/config.env |
|||
|
|||
[Service] |
|||
Restart=always |
|||
RestartSec=10 |
|||
TimeoutStartSec=120 |
|||
TimeoutStopSec=30 |
|||
|
|||
# Wait for PostgreSQL to be ready on localhost |
|||
ExecStartPre=/bin/sh -c 'exec 2>/dev/null; for try in $(seq 0 12); do if ! /bin/true 5<> /dev/tcp/127.0.0.1/5432; then echo "Waiting for PostgreSQL to be available..."; sleep 5; else exit 0; fi; done; exit 1' |
|||
|
|||
[Install] |
|||
WantedBy=keycloak.target |
|||
@ -0,0 +1,11 @@ |
|||
[Unit] |
|||
Description=Keycloak Service Target |
|||
Documentation=man:systemd.target(5) |
|||
Requires=postgresql.target keycloak.service keycloak-build.timer |
|||
After=postgresql.target keycloak.service keycloak-build.timer |
|||
|
|||
# Allow isolation - can stop/start this target independently |
|||
AllowIsolate=yes |
|||
|
|||
[Install] |
|||
WantedBy=multi-user.target |
|||
@ -0,0 +1,5 @@ |
|||
-- Initialization script for Keycloak database and user |
|||
CREATE USER keycloak WITH PASSWORD 'keycloak'; |
|||
CREATE DATABASE keycloak OWNER keycloak; |
|||
GRANT ALL PRIVILEGES ON DATABASE keycloak TO keycloak; |
|||
ALTER ROLE keycloak SET client_encoding TO 'utf8'; |
|||
@ -0,0 +1,16 @@ |
|||
http: |
|||
routers: |
|||
keycloak: |
|||
rule: "Host(`keycloak`)" |
|||
entryPoints: |
|||
- http |
|||
#- https |
|||
middlewares: |
|||
service: "keycloak" |
|||
#tls: |
|||
# certResolver: le |
|||
services: |
|||
keycloak: |
|||
loadBalancer: |
|||
servers: |
|||
- url: "http://127.0.0.1:8080" |
|||
@ -0,0 +1,9 @@ |
|||
variant: fcos |
|||
version: 1.4.0 |
|||
passwd: |
|||
users: |
|||
- name: keycloak |
|||
uid: 10007 |
|||
gecos: Keycloak |
|||
home_dir: /var/lib/quadlets/keycloak |
|||
primary_group: itix-svc |
|||
@ -0,0 +1,25 @@ |
|||
##
|
|||
## Makefile for Miniflux quadlet
|
|||
##
|
|||
|
|||
DEPENDENCIES = postgresql traefik |
|||
|
|||
# Miniflux quadlet is mapped to the 10010 user (miniflux) and 10000 group (itix-svc)
|
|||
PROJECT_UID = 10010 |
|||
PROJECT_GID = 10000 |
|||
|
|||
# PostgreSQL initialization scripts
|
|||
TARGET_POSTGRESQL_FILES = $(patsubst other/postgresql/%, $(TARGET_CHROOT)/etc/quadlets/postgresql/init.d/%, $(wildcard other/postgresql/*)) |
|||
TARGET_EXAMPLE_FILES += $(TARGET_POSTGRESQL_FILES) |
|||
$(TARGET_CHROOT)/etc/quadlets/postgresql/init.d/%.sql: other/postgresql/%.sql |
|||
install -m 0600 -o 10004 -g 10000 $< $@ |
|||
|
|||
# Traefik configuration files
|
|||
TARGET_TRAEFIK_FILES = $(patsubst other/traefik/%, $(TARGET_CHROOT)/etc/quadlets/traefik/conf.d/%, $(wildcard other/traefik/*)) |
|||
TARGET_EXAMPLE_FILES += $(TARGET_TRAEFIK_FILES) |
|||
$(TARGET_CHROOT)/etc/quadlets/traefik/conf.d/%: other/traefik/% |
|||
install -m 0644 -o 10001 -g 10000 $< $@ |
|||
|
|||
TOP_LEVEL_DIR := .. |
|||
include $(TOP_LEVEL_DIR)/Makefile.common |
|||
|
|||
@ -0,0 +1,9 @@ |
|||
DATABASE_URL=postgres://miniflux:miniflux@localhost/miniflux?sslmode=disable |
|||
PORT=8080 |
|||
#HTTPS=1 |
|||
BASE_URL=http://miniflux/ |
|||
RUN_MIGRATIONS=1 |
|||
CREATE_ADMIN=1 |
|||
ADMIN_USERNAME=admin |
|||
ADMIN_PASSWORD=miniflux |
|||
HTTP_CLIENT_TIMEOUT=120 |
|||
@ -0,0 +1,13 @@ |
|||
variant: fcos |
|||
version: 1.4.0 |
|||
ignition: |
|||
config: |
|||
merge: |
|||
- local: base.ign |
|||
- local: traefik.ign |
|||
- local: traefik-examples.ign |
|||
- local: postgresql.ign |
|||
- local: postgresql-examples.ign |
|||
- local: miniflux.ign |
|||
- local: miniflux-examples.ign |
|||
- local: local.ign |
|||
@ -0,0 +1,48 @@ |
|||
[Unit] |
|||
Description=Miniflux RSS Reader |
|||
Documentation=https://github.com/miniflux/v2 |
|||
After=network.target |
|||
|
|||
# Only start if Miniflux has been configured |
|||
ConditionPathExists=/etc/quadlets/miniflux/miniflux.conf |
|||
|
|||
# Start/stop this unit when the target is started/stopped |
|||
PartOf=miniflux.target |
|||
|
|||
[Container] |
|||
ContainerName=miniflux |
|||
Image=ghcr.io/miniflux/miniflux:latest |
|||
AutoUpdate=registry |
|||
|
|||
# Network configuration |
|||
Network=host |
|||
|
|||
# No need for root privileges |
|||
User=10010 |
|||
Group=10000 |
|||
|
|||
# Command and arguments |
|||
Entrypoint=/usr/bin/miniflux |
|||
Exec=-c /etc/miniflux/miniflux.conf |
|||
|
|||
# Volume mounts |
|||
Volume=/etc/quadlets/miniflux/miniflux.conf:/etc/miniflux/miniflux.conf:ro,z |
|||
|
|||
# Health check |
|||
HealthCmd=/usr/bin/miniflux -healthcheck auto |
|||
HealthInterval=30s |
|||
HealthTimeout=10s |
|||
HealthStartPeriod=10s |
|||
HealthRetries=3 |
|||
|
|||
[Service] |
|||
Restart=always |
|||
RestartSec=10 |
|||
TimeoutStartSec=120 |
|||
TimeoutStopSec=30 |
|||
|
|||
# Wait for PostgreSQL to be ready on localhost |
|||
ExecStartPre=/bin/sh -c 'exec 2>/dev/null; for try in $(seq 0 12); do if ! /bin/true 5<> /dev/tcp/127.0.0.1/5432; then echo "Waiting for PostgreSQL to be available..."; sleep 5; else exit 0; fi; done; exit 1' |
|||
|
|||
[Install] |
|||
WantedBy=miniflux.target |
|||
@ -0,0 +1,13 @@ |
|||
[Unit] |
|||
Description=Miniflux Service Target |
|||
Documentation=man:systemd.target(5) |
|||
Requires=postgresql.target miniflux.service |
|||
After=postgresql.target miniflux.service |
|||
|
|||
# Allow isolation - can stop/start this target independently |
|||
AllowIsolate=yes |
|||
# Only start if Miniflux has been configured |
|||
ConditionPathExists=/etc/quadlets/miniflux/miniflux.conf |
|||
|
|||
[Install] |
|||
WantedBy=multi-user.target |
|||
@ -0,0 +1,5 @@ |
|||
-- Initialization script for Miniflux database and user |
|||
CREATE USER miniflux WITH PASSWORD 'miniflux'; |
|||
CREATE DATABASE miniflux OWNER miniflux; |
|||
GRANT ALL PRIVILEGES ON DATABASE miniflux TO miniflux; |
|||
ALTER ROLE miniflux SET client_encoding TO 'utf8'; |
|||
@ -0,0 +1,16 @@ |
|||
http: |
|||
routers: |
|||
miniflux: |
|||
rule: "Host(`miniflux`)" |
|||
entryPoints: |
|||
- http |
|||
#- https |
|||
middlewares: |
|||
service: "miniflux" |
|||
#tls: |
|||
# certResolver: le |
|||
services: |
|||
miniflux: |
|||
loadBalancer: |
|||
servers: |
|||
- url: "http://127.0.0.1:8080" |
|||
@ -0,0 +1,9 @@ |
|||
variant: fcos |
|||
version: 1.4.0 |
|||
passwd: |
|||
users: |
|||
- name: miniflux |
|||
uid: 10010 |
|||
gecos: Miniflux |
|||
home_dir: /var/lib/quadlets/miniflux |
|||
primary_group: itix-svc |
|||
@ -0,0 +1,25 @@ |
|||
##
|
|||
## Makefile for Vaultwarden quadlet
|
|||
##
|
|||
|
|||
DEPENDENCIES = postgresql traefik |
|||
|
|||
# Vaultwarden quadlet is mapped to the 10020 user (vaultwarden) and 10000 group (itix-svc)
|
|||
PROJECT_UID = 10020 |
|||
PROJECT_GID = 10000 |
|||
|
|||
# PostgreSQL initialization scripts
|
|||
TARGET_POSTGRESQL_FILES = $(patsubst other/postgresql/%, $(TARGET_CHROOT)/etc/quadlets/postgresql/init.d/%, $(wildcard other/postgresql/*)) |
|||
TARGET_EXAMPLE_FILES += $(TARGET_POSTGRESQL_FILES) |
|||
$(TARGET_CHROOT)/etc/quadlets/postgresql/init.d/%.sql: other/postgresql/%.sql |
|||
install -m 0600 -o 10004 -g 10000 $< $@ |
|||
|
|||
# Traefik configuration files
|
|||
TARGET_TRAEFIK_FILES = $(patsubst other/traefik/%, $(TARGET_CHROOT)/etc/quadlets/traefik/conf.d/%, $(wildcard other/traefik/*)) |
|||
TARGET_EXAMPLE_FILES += $(TARGET_TRAEFIK_FILES) |
|||
$(TARGET_CHROOT)/etc/quadlets/traefik/conf.d/%: other/traefik/% |
|||
install -m 0644 -o 10001 -g 10000 $< $@ |
|||
|
|||
TOP_LEVEL_DIR := .. |
|||
include $(TOP_LEVEL_DIR)/Makefile.common |
|||
|
|||
@ -0,0 +1,41 @@ |
|||
# Public URL where Vaultwarden will be accessible |
|||
DOMAIN=http://vaultwarden |
|||
|
|||
# Listening address and port |
|||
ROCKET_ADDRESS=127.0.0.1 |
|||
ROCKET_PORT=8080 |
|||
|
|||
# Database configuration |
|||
DATABASE_URL=postgresql://vaultwarden:vaultwarden@localhost:5432/vaultwarden |
|||
|
|||
# Generated using the following command: |
|||
# echo -n 'Ch4ng3M3!' | argon2 "$(openssl rand -base64 32)" -e -id -k 65540 -t 3 -p 4 |
|||
ADMIN_TOKEN=$argon2id$v=19$m=65540,t=3,p=4$cnV0dFVjODhCcDRyR2E1azNRM2NNTDAvamxNUzJpdklrVkpaRmQ5Sm95WT0$mS2zqCE1fTOYSEg0q8pffD2C/6cFctTZQXVxlZ5Of8E |
|||
|
|||
# Features |
|||
SIGNUPS_ALLOWED=true |
|||
INVITATIONS_ALLOWED=false |
|||
|
|||
# Email (SMTP) Configuration |
|||
#SMTP_HOST=smtp.gmail.com |
|||
#SMTP_FROM= |
|||
#SMTP_PORT=587 |
|||
#SMTP_SECURITY=starttls |
|||
#SMTP_USERNAME= |
|||
#SMTP_PASSWORD= |
|||
|
|||
# Enable Mobile Push Notifications |
|||
# Get a key from https://bitwarden.com/host/ |
|||
#PUSH_ENABLED=true |
|||
#PUSH_INSTALLATION_ID= |
|||
#PUSH_INSTALLATION_KEY= |
|||
#PUSH_RELAY_URI=https://api.bitwarden.eu |
|||
#PUSH_IDENTITY_URI=https://identity.bitwarden.eu |
|||
|
|||
# Logging Configuration |
|||
LOG_LEVEL=info |
|||
EXTENDED_LOGGING=true |
|||
|
|||
# Performance Configuration |
|||
#ROCKET_WORKERS=10 |
|||
#ROCKET_LIMITS={json=10485760} |
|||
@ -0,0 +1,13 @@ |
|||
variant: fcos |
|||
version: 1.4.0 |
|||
ignition: |
|||
config: |
|||
merge: |
|||
- local: base.ign |
|||
- local: traefik.ign |
|||
- local: traefik-examples.ign |
|||
- local: postgresql.ign |
|||
- local: postgresql-examples.ign |
|||
- local: vaultwarden.ign |
|||
- local: vaultwarden-examples.ign |
|||
- local: local.ign |
|||
@ -0,0 +1,5 @@ |
|||
-- Initialization script for Vaultwarden database and user |
|||
CREATE USER vaultwarden WITH PASSWORD 'vaultwarden'; |
|||
CREATE DATABASE vaultwarden OWNER vaultwarden; |
|||
GRANT ALL PRIVILEGES ON DATABASE vaultwarden TO vaultwarden; |
|||
ALTER ROLE vaultwarden SET client_encoding TO 'utf8'; |
|||
@ -0,0 +1,16 @@ |
|||
http: |
|||
routers: |
|||
vaultwarden: |
|||
rule: "Host(`vaultwarden`)" |
|||
entryPoints: |
|||
- http |
|||
#- https |
|||
middlewares: |
|||
service: "vaultwarden" |
|||
#tls: |
|||
# certResolver: le |
|||
services: |
|||
vaultwarden: |
|||
loadBalancer: |
|||
servers: |
|||
- url: "http://127.0.0.1:8080" |
|||
@ -0,0 +1,9 @@ |
|||
variant: fcos |
|||
version: 1.4.0 |
|||
passwd: |
|||
users: |
|||
- name: vaultwarden |
|||
uid: 10020 |
|||
gecos: Vaultwarden |
|||
home_dir: /var/lib/quadlets/vaultwarden |
|||
primary_group: itix-svc |
|||
@ -0,0 +1 @@ |
|||
d$ /var/lib/virtiofs/data/vaultwarden 0700 10020 10000 - |
|||
@ -0,0 +1,48 @@ |
|||
[Unit] |
|||
Description=Vaultwarden |
|||
Documentation=https://github.com/dani-garcia/vaultwarden |
|||
After=network.target var-lib-virtiofs-data.mount |
|||
Requires=var-lib-virtiofs-data.mount |
|||
|
|||
# Only start if Vaultwarden has been configured |
|||
ConditionPathExists=/etc/quadlets/vaultwarden/config.env |
|||
|
|||
# Start/stop this unit when the target is started/stopped |
|||
PartOf=vaultwarden.target |
|||
|
|||
[Container] |
|||
ContainerName=vaultwarden |
|||
Image=quay.io/vaultwarden/server:latest-alpine |
|||
AutoUpdate=registry |
|||
|
|||
# No need for root privileges |
|||
User=10020 |
|||
Group=10000 |
|||
|
|||
# Network configuration |
|||
Network=host |
|||
|
|||
# Environment file |
|||
EnvironmentFile=/etc/quadlets/vaultwarden/config.env |
|||
|
|||
# Volume mounts |
|||
Volume=/var/lib/virtiofs/data/vaultwarden:/data:z |
|||
|
|||
# Health check |
|||
HealthCmd=curl -sSf http://127.0.0.1:8080/ |
|||
HealthInterval=30s |
|||
HealthTimeout=10s |
|||
HealthStartPeriod=10s |
|||
HealthRetries=3 |
|||
|
|||
[Service] |
|||
Restart=always |
|||
RestartSec=10 |
|||
TimeoutStartSec=120 |
|||
TimeoutStopSec=30 |
|||
|
|||
# Wait for PostgreSQL to be ready on localhost |
|||
ExecStartPre=/bin/sh -c 'exec 2>/dev/null; for try in $(seq 0 12); do if ! /bin/true 5<> /dev/tcp/127.0.0.1/5432; then echo "Waiting for PostgreSQL to be available..."; sleep 5; else exit 0; fi; done; exit 1' |
|||
|
|||
[Install] |
|||
WantedBy=vaultwarden.target |
|||
@ -0,0 +1,13 @@ |
|||
[Unit] |
|||
Description=Vaultwarden Service Target |
|||
Documentation=man:systemd.target(5) |
|||
Requires=postgresql.target vaultwarden.service |
|||
After=postgresql.target vaultwarden.service |
|||
|
|||
# Allow isolation - can stop/start this target independently |
|||
AllowIsolate=yes |
|||
# Only start if Vaultwarden has been configured |
|||
ConditionPathExists=/etc/quadlets/vaultwarden/config.env |
|||
|
|||
[Install] |
|||
WantedBy=multi-user.target |
|||
Loading…
Reference in new issue