feat(rundeck): Initial commit
This commit is contained in:
		
							
								
								
									
										100
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										100
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,3 +1,99 @@ | ||||
| # rundeck | ||||
| # Rundeck Docker Compose files | ||||
|  | ||||
| Docker Rundeck deployment instructions | ||||
| Docker Compose files to spin up an instance of Rundeck. | ||||
|  | ||||
| # How to run | ||||
|  | ||||
| Add a `COMPOSE_ENV` file and save its location as a shell variable along with the location where this repo lives, here for example `/opt/containers/rundeck` plus all other variables. At [env/fqdn_context.env.example](env/fqdn_context.env.example) you'll find an example environment file. | ||||
|  | ||||
| When everything's ready start Rundeck with Docker Compose, otherwise head down to [Initial setup](#initial-setup) first. | ||||
|  | ||||
| ## Environment | ||||
| ``` | ||||
| export COMPOSE_DIR='/opt/containers/rundeck' | ||||
| export COMPOSE_CTX='ux_vilnius' | ||||
| export COMPOSE_PROJECT='rundeck-'"${COMPOSE_CTX}" | ||||
| export COMPOSE_FILE="${COMPOSE_DIR}"'/docker-compose.yml' | ||||
| export COMPOSE_ENV=<add accordingly> | ||||
| ``` | ||||
|  | ||||
| ## Start | ||||
|  | ||||
| ``` | ||||
| docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --env-file "${COMPOSE_ENV}" --profile 'full' up --detach | ||||
| ``` | ||||
|  | ||||
| # Initial setup | ||||
|  | ||||
| We're assuming you run Docker Compose workloads with ZFS-based bind mounts. ZFS management, creating a zpool and setting adequate properties for its datasets is out of scope of this document. | ||||
|  | ||||
| ## Datasets | ||||
|  | ||||
| Create ZFS datasets and set permissions as needed. | ||||
|  | ||||
| * Parent dateset | ||||
|     ``` | ||||
|     zfs create -o mountpoint=/opt/docker-data 'zpool/docker-data' | ||||
|     ``` | ||||
|  | ||||
| * Container-specific datasets | ||||
|     ``` | ||||
|     zfs create -p 'zpool/docker-data/rundeck-'"${COMPOSE_CTX}"'/rundeck' | ||||
|     zfs create -p 'zpool/docker-data/rundeck-'"${COMPOSE_CTX}"'/postgres' | ||||
|     ``` | ||||
|  | ||||
| * Create subdirs | ||||
|     ``` | ||||
|     mkdir -p '/opt/docker-data/rundeck-'"${COMPOSE_CTX}"'/rundeck/'{'.ssh','config','data','projects'} | ||||
|     ``` | ||||
|  | ||||
| * Prefill content | ||||
|  | ||||
|     * Rundeck settings in `realm.properties` | ||||
|  | ||||
|         At the very least override Rundeck's default `realm.properties` file with one of your own and set a username and a password for local login. Default credentials will otherwise be `admin:admin`. Per [Rundeck's manual on Jetty and JAAS authentication section "PropertyFileLoginModule"](https://docs.rundeck.com/docs/administration/security/authentication.html#propertyfileloginmodule) you're going to need Rundeck's `rundeck.war` file to create a bcrypt hash for your password. Run the official Rundeck Docker image in a throwaway container like so where `rundeck/rundeck:4.13.0` is an example version you want to use: | ||||
|         ``` | ||||
|         docker run \ | ||||
|             --rm \ | ||||
|             --tty \ | ||||
|             --interactive \ | ||||
|             --entrypoint bash \ | ||||
|             rundeck/rundeck:4.13.0 \ | ||||
|             -c 'java -jar /home/rundeck/rundeck.war --encryptpwd Jetty' | ||||
|         ``` | ||||
|         This will download `rundeck/rundeck:4.13.0` if needed and open up something along the lines of: | ||||
|         ``` | ||||
|         Required values are marked with: *  | ||||
|         Username (Optional, but necessary for Crypt encoding): | ||||
|         ``` | ||||
|         Type your desired username, type `<Enter>` and then your plain text password followed by `<Enter>` again. The whole exchange may look like this: | ||||
|         ``` | ||||
|         Required values are marked with: *  | ||||
|         Username (Optional, but necessary for Crypt encoding): | ||||
|         my-username | ||||
|         *Value To Encrypt (The text you want to encrypt): | ||||
|         t0psecr3t             | ||||
|  | ||||
|         ==ENCRYPTED OUTPUT== | ||||
|         bcrypt: BCRYPT:$2a$10$jMWQvKbjpmBrKdA0Qi0/n.UvHot1F7Cvf7/Avlv9afknHpbvT6j7y | ||||
|         obfuscate: OBF:1z0f18qk1xtp1vgv1t331vfz1xtt18qq1z0f | ||||
|         md5: MD5:962aefc8c283c13e13d9c990dafdfba9 | ||||
|         crypt: CRYPT:myS5y0c4wMQts | ||||
|         ``` | ||||
|         Put a single line into an otherwise empty `/opt/docker-data/rundeck-'"${COMPOSE_CTX}"'/rundeck/config/realm.properties`: | ||||
|         ``` | ||||
|         my-username: BCRYPT:$2a$10$jMWQvKbjpmBrKdA0Qi0/n.UvHot1F7Cvf7/Avlv9afknHpbvT6j7y,user,admin | ||||
|         ``` | ||||
|         The account `my-username` will have roles `user` and `admin` and it'll be the only existing account when Rundeck starts. | ||||
|  | ||||
|     * SSH `known_hosts` file | ||||
|  | ||||
|         Place an empty `known_hosts` file at `/opt/docker-data/rundeck-'"${COMPOSE_CTX}"'/rundeck/.ssh/known_hosts`. Feel free to optionally prefill it with SSH public host keys. | ||||
|  | ||||
| * Change ownership | ||||
|     ``` | ||||
|     chown -R 999 '/opt/docker-data/rundeck-'"${COMPOSE_CTX}"'/postgres' | ||||
|     chown -R 1000 '/opt/docker-data/rundeck-'"${COMPOSE_CTX}"'/rundeck' | ||||
|     ``` | ||||
|  | ||||
| When done head back up to [How to run](#how-to-run). | ||||
|   | ||||
							
								
								
									
										14
									
								
								build-context/postgres/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								build-context/postgres/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| # For the remainder of this Dockerfile EXAMPLE_ARG_FOR_DOCKERFILE will be | ||||
| # available with a value of 'must_be_available_in_dockerfile', check out the env | ||||
| # file at 'env/fully.qualified.domain.name.example' for reference. | ||||
| # ARG EXAMPLE_ARG_FOR_DOCKERFILE | ||||
|  | ||||
| # Another env var, this one's needed in the example build step below: | ||||
| # ARG POSTGRES_VERSION | ||||
|  | ||||
| # Example | ||||
| # FROM "postgres:${POSTGRES_VERSION}" | ||||
| # RUN apt-get update && \ | ||||
| #     apt-get -y install \ | ||||
| #     somepackage-6.q16-6-extra && \ | ||||
| #     rm -rf /var/lib/apt/lists/* | ||||
							
								
								
									
										0
									
								
								build-context/postgres/docker-data/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								build-context/postgres/docker-data/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								build-context/postgres/extras/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								build-context/postgres/extras/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										14
									
								
								build-context/rundeck/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								build-context/rundeck/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| # For the remainder of this Dockerfile EXAMPLE_ARG_FOR_DOCKERFILE will be | ||||
| # available with a value of 'must_be_available_in_dockerfile', check out the env | ||||
| # file at 'env/fully.qualified.domain.name.example' for reference. | ||||
| # ARG EXAMPLE_ARG_FOR_DOCKERFILE | ||||
|  | ||||
| # Another env var, this one's needed in the example build step below: | ||||
| # ARG RUNDECK_VERSION | ||||
|  | ||||
| # Example | ||||
| # FROM "rundeck:${RUNDECK_VERSION}" | ||||
| # RUN apt-get update && \ | ||||
| #     apt-get -y install \ | ||||
| #     somepackage-6.q16-6-extra && \ | ||||
| #     rm -rf /var/lib/apt/lists/* | ||||
							
								
								
									
										0
									
								
								build-context/rundeck/docker-data/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								build-context/rundeck/docker-data/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										2
									
								
								build-context/rundeck/docker-data/.ssh/known_hosts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								build-context/rundeck/docker-data/.ssh/known_hosts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| hostname pubkey | ||||
| another-hostname also-a-pubkey | ||||
| @@ -0,0 +1 @@ | ||||
| my-first-account: BCRYPT:$2a$10$ZcvSOoSNHbnP/foEvJ/6WeKIauGLCr9XCo5.UboJVUJDbHPWrV30K,user,admin | ||||
							
								
								
									
										0
									
								
								build-context/rundeck/extras/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								build-context/rundeck/extras/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										11
									
								
								common-settings.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								common-settings.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| services: | ||||
|     common-settings: | ||||
|         environment: | ||||
|             TZ: "${TIMEZONE:-Etc/UTC}" | ||||
|         logging: | ||||
|             driver: "json-file" | ||||
|             options: | ||||
|                 max-size: "10m" | ||||
|                 max-file: "10" | ||||
|                 compress: "true" | ||||
|         restart: "${RESTARTPOLICY:-unless-stopped}" | ||||
							
								
								
									
										19
									
								
								docker-compose.override.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								docker-compose.override.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| services: | ||||
|     rundeck-build: | ||||
|         image: "rundeck:${RUNDECK_VERSION}" | ||||
|         profiles: ["build", "build-rundeck"] | ||||
|         build: | ||||
|             context: "build-context/rundeck" | ||||
|             dockerfile: Dockerfile | ||||
|             args: | ||||
|                 EXAMPLE_ARG_FOR_DOCKERFILE: "${EXAMPLE_ARG_FROM_ENV_FILE}" | ||||
|                 RUNDECK_VERSION: "${RUNDECK_VERSION}" | ||||
|     postgres-build: | ||||
|         image: "postgres:${POSTGRES_VERSION}" | ||||
|         profiles: ["build", "build-postgres"] | ||||
|         build: | ||||
|             context: "build-context/postgres" | ||||
|             dockerfile: Dockerfile | ||||
|             args: | ||||
|                 EXAMPLE_ARG_FOR_DOCKERFILE: "${EXAMPLE_ARG_FROM_ENV_FILE}" | ||||
|                 POSTGRES_VERSION: "${POSTGRES_VERSION}" | ||||
							
								
								
									
										54
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| services: | ||||
|     rundeck: | ||||
|         image: "rundeck/rundeck:${RUNDECK_VERSION}" | ||||
|         container_name: "rundeck-rundeck-${CONTEXT}" | ||||
|         networks: | ||||
|             rundeck-default: | ||||
|         profiles: ["full", "rundeck"] | ||||
|         extends: | ||||
|             file: common-settings.yml | ||||
|             service: common-settings | ||||
|         tty: true | ||||
|         ports: | ||||
|             - ${RUNDECK_PORT}:4440 | ||||
|         volumes: | ||||
|             - /opt/docker-data/rundeck-${CONTEXT}/rundeck/config/realm.properties:/home/rundeck/server/config/realm.properties | ||||
|             - /opt/docker-data/rundeck-${CONTEXT}/rundeck/data:/home/rundeck/server/data | ||||
|             - /opt/docker-data/rundeck-${CONTEXT}/rundeck/projects:/home/rundeck/projects | ||||
|             - /opt/docker-data/rundeck-${CONTEXT}/rundeck/.ssh/known_hosts:/home/rundeck/.ssh/known_hosts | ||||
|         environment: | ||||
|             RUNDECK_DATABASE_DRIVER: org.postgresql.Driver | ||||
|             RUNDECK_DATABASE_USERNAME: rundeck | ||||
|             RUNDECK_DATABASE_PASSWORD: rundeck | ||||
|             RUNDECK_DATABASE_URL: jdbc:postgresql://postgres/rundeck?autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true | ||||
|             RUNDECK_GRAILS_URL: https://rundeck.ops.loft.seneve.de | ||||
|             RUNDECK_SERVER_FORWARDED: 'true' | ||||
|             TZ: ${TIMEZONE} | ||||
|     postgres: | ||||
|         image: "postgres:${POSTGRES_VERSION}" | ||||
|         container_name: "rundeck-postgres-${CONTEXT}" | ||||
|         networks: | ||||
|             rundeck-default: | ||||
|         profiles: ["full", "postgres"] | ||||
|         extends: | ||||
|             file: common-settings.yml | ||||
|             service: common-settings | ||||
|         volumes: | ||||
|             - /opt/docker-data/rundeck-${CONTEXT}/postgres:/var/lib/postgresql/data | ||||
|         ports: | ||||
|             - ${POSTGRES_PORT}:5432 | ||||
|         environment: | ||||
|             POSTGRES_DB: rundeck | ||||
|             POSTGRES_USER: rundeck | ||||
|             POSTGRES_PASSWORD: rundeck | ||||
|             TZ: ${TIMEZONE} | ||||
| networks: | ||||
|     rundeck-default: | ||||
|         name: rundeck-${CONTEXT} | ||||
|         driver: bridge | ||||
|         driver_opts: | ||||
|             com.docker.network.enable_ipv6: "false" | ||||
|         ipam: | ||||
|             driver: default | ||||
|             config: | ||||
|                 - subnet: ${SUBNET} | ||||
							
								
								
									
										32
									
								
								env/fqdn_context.env.example
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								env/fqdn_context.env.example
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| CONTEXT=ux_vilnius | ||||
|  | ||||
|  | ||||
|  | ||||
| # Set something sensible here and uncomment | ||||
| # --- | ||||
| # RUNDECK_VERSION=x.y.z | ||||
| # POSTGRES_VERSION=x.y.z | ||||
|  | ||||
|  | ||||
|  | ||||
| # Feel free to leave defaults. They apply while these vars are commented out | ||||
| # --- | ||||
| # RESTARTPOLICY=unless-stopped | ||||
| # TIMEZONE=Etc/UTC | ||||
|  | ||||
|  | ||||
|  | ||||
| # Subnet to use for this Docker Compose project. Docker defaults to | ||||
| # container networks in prefix 172.16.0.0/12 which is 1 million addresses in | ||||
| # the range from 172.16.0.0 to 172.31.255.255. Docker uses 172.17.0.0/16 for | ||||
| # itself. Use any sensible prefix in 172.16.0.0/12 here except for Docker's | ||||
| # own 172.17.0.0/16. | ||||
| # --- | ||||
| SUBNET=172.30.95.0/24 | ||||
|  | ||||
|  | ||||
|  | ||||
| # See 'docker-compose.override.yml' for how to make a variable available in | ||||
| # a Dockerfile | ||||
| # --- | ||||
| # EXAMPLE_ARG_FROM_ENV_FILE=must_be_available_in_dockerfile | ||||
		Reference in New Issue
	
	Block a user