diff --git a/files/recipe.yaml b/files/recipe.yaml index 8ea6da948..174bb6da6 100644 --- a/files/recipe.yaml +++ b/files/recipe.yaml @@ -7,6 +7,7 @@ vars: home_path: "{{ lookup('env', 'HOME') }}" packit_service_path: /src + editable_install: "{{ lookup('env', 'DEPLOYMENT') == 'dev' }}" tasks: - import_tasks: tasks/common.yaml - import_tasks: tasks/httpd.yaml diff --git a/files/run_httpd.sh b/files/run_httpd.sh index 04a4a5f4e..ab59fec25 100755 --- a/files/run_httpd.sh +++ b/files/run_httpd.sh @@ -21,7 +21,22 @@ fi export PACKIT_SERVICE_CONFIG="${HOME}/.config/packit-service.yaml" SERVER_NAME=$(sed -nr 's/^server_name: ([^:]+)(:([0-9]+))?$/\1/p' "$PACKIT_SERVICE_CONFIG") -HTTPS_PORT=$(sed -nr 's/^server_name: ([^:]+)(:([0-9]+))?$/\3/p' "$PACKIT_SERVICE_CONFIG") +PORT=$(sed -nr 's/^server_name: ([^:]+)(:([0-9]+))?$/\3/p' "$PACKIT_SERVICE_CONFIG") + +http_flags=( + --http2 +) +if [[ -f /secrets/privkey.pem ]]; then + http_flags+=( + --https-port "${PORT:-8443}" + --ssl-certificate-file /secrets/fullchain.pem + --ssl-certificate-key-file /secrets/privkey.pem + ) +else + http_flags+=( + --port "${PORT:-8080}" + ) +fi # See "mod_wsgi-express-3 start-server --help" for details on # these options, and the configuration documentation of mod_wsgi: @@ -29,10 +44,7 @@ HTTPS_PORT=$(sed -nr 's/^server_name: ([^:]+)(:([0-9]+))?$/\3/p' "$PACKIT_SERVIC exec mod_wsgi-express-3 start-server \ --access-log \ --log-to-terminal \ - --http2 \ - --https-port "${HTTPS_PORT:-8443}" \ - --ssl-certificate-file /secrets/fullchain.pem \ - --ssl-certificate-key-file /secrets/privkey.pem \ + "${http_flags[@]}" \ --server-name "${SERVER_NAME}" \ --processes 2 \ --restart-interval 28800 \ diff --git a/files/tasks/common.yaml b/files/tasks/common.yaml index f49d62e7a..696987f61 100644 --- a/files/tasks/common.yaml +++ b/files/tasks/common.yaml @@ -26,6 +26,7 @@ - name: Install packit-service from {{ packit_service_path }} ansible.builtin.pip: name: "{{ packit_service_path }}" + editable: "{{ editable_install }}" - name: Clean all the cache files (especially pip) ansible.builtin.file: state: absent diff --git a/quadlets/.gitignore b/quadlets/.gitignore new file mode 100644 index 000000000..198748e37 --- /dev/null +++ b/quadlets/.gitignore @@ -0,0 +1 @@ +/local/ diff --git a/quadlets/README.md b/quadlets/README.md new file mode 100644 index 000000000..ecd09bea5 --- /dev/null +++ b/quadlets/README.md @@ -0,0 +1,46 @@ +# Setting up quadlet environment + +> [!CAUTION] +> This setup is still a work in progress + +Packit can be deployed as quadlet services. The goal is to make it possible to +simply run + +```console +$ systemctl --user daemon-reload +$ systemctl --user start packit-service +``` + +and be out to the races + +## Various environment setups + +The quadlets are organized into multiple drop-in configuration folders that get +merged: + +- `base`: The main quadlet definitions shared across all environments +- `dev`: Development environment using the current state of the git repo and + that _should_ pick up live edits to the sources +- `prod`: Production environment used/mimicking the current environment + deployed +- `local`: Additional drop-in files setup locally + +In order to use these, you can either + +1. Copy the drop-in folders into the [quadlet search path] +2. Create a `/etc/systemd/user-environment-generators/10-packit-service` + executable file with content such as + +```bash +PACKIT_SERVICE_ROOT=/path/to/packit-service +# Enable dev environment (along with mandatory base drop-ins) +echo "QUADLET_UNIT_DIRS=$PACKIT_SERVICE_ROOT/quadlets/dev:$PACKIT_SERVICE_ROOT/quadlets/base:$QUADLET_UNIT_DIRS" +``` + +[quadlet search path]: https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html#podman-rootless-unit-search-path + +## Additional manual configuration + +See the notes in each `base/*/10-*-secrets.conf` drop-in files for additional +setup steps that you are expected to do. Create equivalent drop-in files in +your `local` path. diff --git a/quadlets/base/packit-dashboard.container b/quadlets/base/packit-dashboard.container new file mode 100644 index 000000000..0d29a0128 --- /dev/null +++ b/quadlets/base/packit-dashboard.container @@ -0,0 +1,8 @@ +[Unit] +After=packit-service.container +Requires=packit-service.container + +[Container] +ContainerName=packit-dashboard +Image=quay.io/packit/dashboard:prod +User=1024 diff --git a/quadlets/base/packit-service.container b/quadlets/base/packit-service.container new file mode 100644 index 000000000..6698d9d18 --- /dev/null +++ b/quadlets/base/packit-service.container @@ -0,0 +1,4 @@ +[Container] +ContainerName=packit-service +Image=quay.io/packit/service:prod +User=1024 diff --git a/quadlets/base/packit-service.container.d/10-packit-service-secrets.conf b/quadlets/base/packit-service.container.d/10-packit-service-secrets.conf new file mode 100644 index 000000000..2db038d50 --- /dev/null +++ b/quadlets/base/packit-service.container.d/10-packit-service-secrets.conf @@ -0,0 +1,7 @@ +[Container] +## Secrets are not available in the repo, populate them and mount them +## as follows +#Volume=../../secrets/packit/dev/packit-service.yaml:/home/packit/.config/packit-service.yaml:ro,z +#Volume=../../secrets/packit/dev/fedora.keytab:/secrets/fedora.keytab:ro,z +#Volume=../../secrets/packit/dev/fullchain.pem:/secrets/fullchain.pem:ro,z +#Volume=../../secrets/packit/dev/privkey.pem:/secrets/privkey.pem:ro,z diff --git a/quadlets/base/packit-service.container.d/10-postgres-secrets.conf b/quadlets/base/packit-service.container.d/10-postgres-secrets.conf new file mode 120000 index 000000000..6a5572ac5 --- /dev/null +++ b/quadlets/base/packit-service.container.d/10-postgres-secrets.conf @@ -0,0 +1 @@ +../postgres.container.d/10-postgres-secrets.conf \ No newline at end of file diff --git a/quadlets/base/packit-service.container.d/40-postgres.conf b/quadlets/base/packit-service.container.d/40-postgres.conf new file mode 100644 index 000000000..7fe4614e1 --- /dev/null +++ b/quadlets/base/packit-service.container.d/40-postgres.conf @@ -0,0 +1,9 @@ +[Unit] +After=postgres.container +Requires=postgres.container + +[Container] +Environment=POSTGRESQL_HOST=postgres +Environment=POSTGRESQL_USER=packit +Environment=POSTGRESQL_DATABASE=packit +Network=postgres.network diff --git a/quadlets/base/packit-service.container.d/40-redis.conf b/quadlets/base/packit-service.container.d/40-redis.conf new file mode 100644 index 000000000..06a0fde87 --- /dev/null +++ b/quadlets/base/packit-service.container.d/40-redis.conf @@ -0,0 +1,7 @@ +[Unit] +After=redis.container +Requires=redis.container + +[Container] +Environment=REDIS_SERVICE_HOST=redis +Network=redis.network diff --git a/quadlets/base/postgres.container b/quadlets/base/postgres.container new file mode 100644 index 000000000..9529637dc --- /dev/null +++ b/quadlets/base/postgres.container @@ -0,0 +1,4 @@ +[Container] +ContainerName=postgres +Image=quay.io/sclorg/postgresql-15-c9s +Network=postgres.network diff --git a/quadlets/base/postgres.container.d/10-postgres-secrets.conf b/quadlets/base/postgres.container.d/10-postgres-secrets.conf new file mode 100644 index 000000000..f42e4b028 --- /dev/null +++ b/quadlets/base/postgres.container.d/10-postgres-secrets.conf @@ -0,0 +1,4 @@ +[Container] +## Set a POSTGRESQL_PASSWORD environment. Below assumes you created the secret +## manually via `podman secret create` +#Secret=postgres-password,type=env,target=POSTGRESQL_PASSWORD diff --git a/quadlets/base/postgres.container.d/50-packit-service.conf b/quadlets/base/postgres.container.d/50-packit-service.conf new file mode 100644 index 000000000..4c69a212b --- /dev/null +++ b/quadlets/base/postgres.container.d/50-packit-service.conf @@ -0,0 +1,3 @@ +[Container] +Environment=POSTGRESQL_USER=packit +Environment=POSTGRESQL_DATABASE=packit diff --git a/quadlets/base/postgres.network b/quadlets/base/postgres.network new file mode 100644 index 000000000..264f70a03 --- /dev/null +++ b/quadlets/base/postgres.network @@ -0,0 +1 @@ +[Network] diff --git a/quadlets/base/redis.container b/quadlets/base/redis.container new file mode 100644 index 000000000..f9474a42e --- /dev/null +++ b/quadlets/base/redis.container @@ -0,0 +1,5 @@ +[Container] +ContainerName=redis +Image=quay.io/sclorg/redis-6-c9s +User=1024 +Network=redis.network diff --git a/quadlets/base/redis.network b/quadlets/base/redis.network new file mode 100644 index 000000000..264f70a03 --- /dev/null +++ b/quadlets/base/redis.network @@ -0,0 +1 @@ +[Network] diff --git a/quadlets/dev/packit-dashboard.container.d/60-dev.conf b/quadlets/dev/packit-dashboard.container.d/60-dev.conf new file mode 100644 index 000000000..fbb793059 --- /dev/null +++ b/quadlets/dev/packit-dashboard.container.d/60-dev.conf @@ -0,0 +1,2 @@ +[Container] +Environment=DEPLOYMENT=dev diff --git a/quadlets/dev/packit-service.build b/quadlets/dev/packit-service.build new file mode 100644 index 000000000..883b8555e --- /dev/null +++ b/quadlets/dev/packit-service.build @@ -0,0 +1,6 @@ +[Build] +ImageTag=localhost/packit-service:dev +SetWorkingDirectory=../../ +File=files/docker/Dockerfile +Environment=SOURCE_BRANCH=main +Environment=DEPLOYMENT=dev diff --git a/quadlets/dev/packit-service.container.d/60-dev.conf b/quadlets/dev/packit-service.container.d/60-dev.conf new file mode 100644 index 000000000..02ec8c3c7 --- /dev/null +++ b/quadlets/dev/packit-service.container.d/60-dev.conf @@ -0,0 +1,5 @@ +[Container] +Environment=DEPLOYMENT=dev +Image=packit-service.build +Volume=../../packit_service:/src/packit_service:ro,z +Volume=../../alembic:/src/alembic:rw,z diff --git a/quadlets/prod/packit-dashboard.container.d/60-prod.conf b/quadlets/prod/packit-dashboard.container.d/60-prod.conf new file mode 100644 index 000000000..989f635ba --- /dev/null +++ b/quadlets/prod/packit-dashboard.container.d/60-prod.conf @@ -0,0 +1,2 @@ +[Container] +Environment=DEPLOYMENT=prod diff --git a/quadlets/prod/packit-service.container.d/60-prod.conf b/quadlets/prod/packit-service.container.d/60-prod.conf new file mode 100644 index 000000000..989f635ba --- /dev/null +++ b/quadlets/prod/packit-service.container.d/60-prod.conf @@ -0,0 +1,2 @@ +[Container] +Environment=DEPLOYMENT=prod