First attempt at new AMI build
This commit is contained in:
parent
130fb8b34c
commit
2062bfecdb
7
Makefile
7
Makefile
|
@ -230,6 +230,11 @@ config: # Generate deployment config file
|
||||||
deploy: # Upload deployment config to S3
|
deploy: # Upload deployment config to S3
|
||||||
aws s3 cp $(BUILD)/config.json $(S3_CONFIG)
|
aws s3 cp $(BUILD)/config.json $(S3_CONFIG)
|
||||||
|
|
||||||
|
### Infrastructure
|
||||||
|
|
||||||
|
packer: supervisor # Build and publish a new AMI
|
||||||
|
tools/packer-build.bash
|
||||||
|
|
||||||
### Miscellaneous
|
### Miscellaneous
|
||||||
|
|
||||||
## Run this every time you update .gitignore or .dockerignore.in.
|
## Run this every time you update .gitignore or .dockerignore.in.
|
||||||
|
@ -243,7 +248,7 @@ dockerignore: # Update .dockerignore from .gitignore and .dockerignore.in
|
||||||
## opposed to through the Makefile.
|
## opposed to through the Makefile.
|
||||||
|
|
||||||
env: # Run shell with .env file loaded and $PATH fixed
|
env: # Run shell with .env file loaded and $PATH fixed
|
||||||
exec bash --rcfile <(cat ~/.bashrc - <<< 'PS1="[.env] $$PS1"')
|
exec bash
|
||||||
|
|
||||||
tmux: # Start or attach to tmux session
|
tmux: # Start or attach to tmux session
|
||||||
MAKELEVEL= tmux attach || MAKELEVEL= tmux new-session -s tmux
|
MAKELEVEL= tmux attach || MAKELEVEL= tmux new-session -s tmux
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
{
|
{
|
||||||
"variables": {
|
"variables": {
|
||||||
"admin_password": "{{env `ADMIN_PASSWORD`}}",
|
"admin_password": "{{env `ADMIN_PASSWORD`}}"
|
||||||
"admin_ssh_public_key_file": "{{env `ADMIN_SSH_PUBLIC_KEY_FILE`}}",
|
|
||||||
"deploy_ssh_public_key_file": "{{env `DEPLOY_SSH_PUBLIC_KEY_FILE`}}"
|
|
||||||
},
|
},
|
||||||
"builders": [
|
"builders": [
|
||||||
{
|
{
|
||||||
|
@ -11,7 +9,7 @@
|
||||||
"filters": {
|
"filters": {
|
||||||
"virtualization-type": "hvm",
|
"virtualization-type": "hvm",
|
||||||
"root-device-type": "ebs",
|
"root-device-type": "ebs",
|
||||||
"name": "ubuntu/images/hvm-ssd/ubuntu-groovy-20.10-amd64-server-*"
|
"name": "ubuntu/images/hvm-ssd/ubuntu-*-21.04-amd64-server-*"
|
||||||
},
|
},
|
||||||
"owners": ["099720109477"],
|
"owners": ["099720109477"],
|
||||||
"most_recent": true
|
"most_recent": true
|
||||||
|
@ -22,20 +20,6 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"provisioners": [
|
"provisioners": [
|
||||||
{
|
|
||||||
"type": "shell",
|
|
||||||
"script": "validate.bash",
|
|
||||||
"environment_vars": [
|
|
||||||
"ADMIN_PASSWORD={{user `admin_password`}}",
|
|
||||||
"ADMIN_SSH_PUBLIC_KEY_FILE={{user `admin_ssh_public_key_file`}}",
|
|
||||||
"DEPLOY_SSH_PUBLIC_KEY_FILE={{user `deploy_ssh_public_key_file`}}"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "file",
|
|
||||||
"source": "riju",
|
|
||||||
"destination": "/tmp/riju"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"source": "riju-init-volume",
|
"source": "riju-init-volume",
|
||||||
|
@ -43,29 +27,14 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"source": "riju-deploy",
|
"source": "../supervisor/out/riju-supervisor",
|
||||||
"destination": "/tmp/riju-deploy"
|
"destination": "/tmp/riju-supervisor"
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "file",
|
|
||||||
"source": "riju-install-certbot-hooks",
|
|
||||||
"destination": "/tmp/riju-install-certbot-hooks"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"source": "riju.service",
|
"source": "riju.service",
|
||||||
"destination": "/tmp/riju.service"
|
"destination": "/tmp/riju.service"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"type": "file",
|
|
||||||
"source": "{{user `admin_ssh_public_key_file`}}",
|
|
||||||
"destination": "/tmp/id_admin.pub"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "file",
|
|
||||||
"source": "{{user `deploy_ssh_public_key_file`}}",
|
|
||||||
"destination": "/tmp/id_deploy.pub"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"script": "provision.bash",
|
"script": "provision.bash",
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
: ${ADMIN_PASSWORD}
|
||||||
|
|
||||||
mkdir /tmp/riju-work
|
mkdir /tmp/riju-work
|
||||||
pushd /tmp/riju-work
|
pushd /tmp/riju-work
|
||||||
|
|
||||||
|
@ -27,40 +29,16 @@ wget -nv https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -O awscli.zip
|
||||||
unzip -q awscli.zip
|
unzip -q awscli.zip
|
||||||
sudo ./aws/install
|
sudo ./aws/install
|
||||||
|
|
||||||
sudo chown root:root /tmp/riju /tmp/riju-deploy /tmp/riju.service
|
sudo chown root:root /tmp/riju-init-volume /tmp/riju-supervisor /tmp/riju.service
|
||||||
sudo mv /tmp/riju /tmp/riju-deploy /tmp/riju-init-volume /tmp/riju-install-certbot-hooks /usr/local/bin/
|
sudo mv /tmp/riju-init-volume /tmp/riju-supervisor /usr/local/bin/
|
||||||
sudo mv /tmp/riju.service /etc/systemd/system/
|
sudo mv /tmp/riju.service /etc/systemd/system/
|
||||||
|
|
||||||
for user in admin deploy; do
|
|
||||||
if ! grep -vq "PRIVATE KEY" "/tmp/id_${user}.pub"; then
|
|
||||||
echo "${user} public key was set to a private key, aborting" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
IFS=" " read contents < "/tmp/id_${user}.pub"
|
|
||||||
echo "${contents}" > "/tmp/id_${user}.pub"
|
|
||||||
done
|
|
||||||
|
|
||||||
sudo sed -Ei 's/^#?PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config
|
sudo sed -Ei 's/^#?PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config
|
||||||
sudo sed -Ei 's/^#?PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config
|
sudo sed -Ei 's/^#?PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config
|
||||||
sudo sed -Ei 's/^#?PermitEmptyPasswords .*/PermitEmptyPasswords no/' /etc/ssh/sshd_config
|
sudo sed -Ei 's/^#?PermitEmptyPasswords .*/PermitEmptyPasswords no/' /etc/ssh/sshd_config
|
||||||
|
|
||||||
sudo passwd -l root
|
sudo passwd -l root
|
||||||
sudo useradd admin -g admin -G sudo -s /usr/bin/bash -p "$(echo "${ADMIN_PASSWORD}" | mkpasswd -s)" -m
|
sudo useradd admin -g admin -G sudo -s /usr/bin/bash -p "$(echo "${ADMIN_PASSWORD}" | mkpasswd -s)" -m
|
||||||
sudo useradd deploy -s /usr/bin/bash -p "!" -m
|
|
||||||
|
|
||||||
for user in admin deploy; do
|
|
||||||
sudo runuser -u "${user}" -- mkdir -p "/home/${user}/.ssh"
|
|
||||||
sudo mv "/tmp/id_${user}.pub" "/home/${user}/.ssh/authorized_keys"
|
|
||||||
sudo chown -R "${user}:${user}" "/home/${user}/.ssh"
|
|
||||||
sudo chmod -R go-rwx "/home/${user}/.ssh"
|
|
||||||
done
|
|
||||||
|
|
||||||
sudo runuser -u deploy -- sed -i 's/^/command="sudo riju-deploy ${SSH_ORIGINAL_COMMAND}",restrict /' /home/deploy/.ssh/authorized_keys
|
|
||||||
|
|
||||||
sudo tee /etc/sudoers.d/riju >/dev/null <<"EOF"
|
|
||||||
deploy ALL=(root) NOPASSWD: /usr/local/bin/riju-deploy
|
|
||||||
EOF
|
|
||||||
|
|
||||||
sudo hostnamectl set-hostname riju
|
sudo hostnamectl set-hostname riju
|
||||||
|
|
||||||
|
|
44
packer/riju
44
packer/riju
|
@ -1,44 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
domain="$(ls /etc/letsencrypt/live | grep -v README | head -n1)" || true
|
|
||||||
|
|
||||||
if [[ -n "${DISABLE_TLS:-}" ]]; then
|
|
||||||
echo "Disabling TLS due to DISABLE_TLS=${DISABLE_TLS}" >&2
|
|
||||||
elif [[ -z "${domain}" ]]; then
|
|
||||||
echo "No certs installed in /etc/letsencrypt/live, disabling TLS" >&2
|
|
||||||
else
|
|
||||||
echo "Detected cert for domain: ${domain}, enabling TLS" >&2
|
|
||||||
export TLS=1
|
|
||||||
TLS_PRIVATE_KEY="$(base64 "/etc/letsencrypt/live/${domain}/privkey.pem")"
|
|
||||||
TLS_CERTIFICATE="$(base64 "/etc/letsencrypt/live/${domain}/fullchain.pem")"
|
|
||||||
export TLS_PRIVATE_KEY TLS_CERTIFICATE
|
|
||||||
if [[ "${domain}" == riju.codes ]]; then
|
|
||||||
echo "Domain is riju.codes, enabling analytics" >&2
|
|
||||||
export ANALYTICS=1
|
|
||||||
else
|
|
||||||
echo "Domain is not riju.codes, disabling analytics" >&2
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n "${DETACH:-}" ]]; then
|
|
||||||
extra_args="-d"
|
|
||||||
elif [[ -t 1 ]]; then
|
|
||||||
extra_args="-it"
|
|
||||||
else
|
|
||||||
extra_args=
|
|
||||||
fi
|
|
||||||
|
|
||||||
port_args="${PORT_MAPPING:--p 0.0.0.0:80:6119 -p 0.0.0.0:443:6120}"
|
|
||||||
image_name="${IMAGE_NAME:-riju:app}"
|
|
||||||
container_name="${CONTAINER_NAME:-riju-prod}"
|
|
||||||
|
|
||||||
if docker container inspect ${container_name} &>/dev/null; then
|
|
||||||
docker stop ${container_name}
|
|
||||||
fi
|
|
||||||
|
|
||||||
docker run --rm ${port_args} ${extra_args} \
|
|
||||||
-e TLS -e TLS_PRIVATE_KEY -e TLS_CERTIFICATE -e ANALYTICS \
|
|
||||||
-h riju --name "${container_name}" \
|
|
||||||
"${image_name}"
|
|
|
@ -1,35 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
if (( $# != 1 )); then
|
|
||||||
echo "usage: ssh deploy@riju IMAGE" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
image="$1"
|
|
||||||
|
|
||||||
riju-init-volume
|
|
||||||
|
|
||||||
echo "Pull image to be deployed..."
|
|
||||||
docker pull "${image}"
|
|
||||||
|
|
||||||
echo "Start new image in test container..." >&2
|
|
||||||
CONTAINER_NAME=riju-test IMAGE_NAME="${image}" DETACH=1 \
|
|
||||||
PORT_MAPPING="-p 127.0.0.1:6119:6119" DISABLE_TLS=0 riju
|
|
||||||
|
|
||||||
echo "Wait for web server to come up..." >&2
|
|
||||||
sleep 5
|
|
||||||
|
|
||||||
echo "Test web server health..." >&2
|
|
||||||
output="$(curl -fsSL http://localhost:6119)"
|
|
||||||
head -n15 <<< "${output}"
|
|
||||||
|
|
||||||
echo "Tear down test container..." >&2
|
|
||||||
docker stop riju-test
|
|
||||||
|
|
||||||
echo "Retag production image..." >&2
|
|
||||||
docker tag "${image}" riju:app
|
|
||||||
|
|
||||||
echo "Restart production server..." >&2
|
|
||||||
systemctl restart riju
|
|
|
@ -1,18 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
sudo tee /etc/letsencrypt/renewal-hooks/pre/riju >/dev/null <<"EOF"
|
|
||||||
#!/usr/bin/env bash
|
|
||||||
set -euo pipefail
|
|
||||||
systemctl stop riju
|
|
||||||
EOF
|
|
||||||
|
|
||||||
sudo tee /etc/letsencrypt/renewal-hooks/post/riju >/dev/null <<"EOF"
|
|
||||||
#!/usr/bin/env bash
|
|
||||||
set -euo pipefail
|
|
||||||
systemctl start riju
|
|
||||||
EOF
|
|
||||||
|
|
||||||
sudo chmod +x /etc/letsencrypt/renewal-hooks/pre/riju
|
|
||||||
sudo chmod +x /etc/letsencrypt/renewal-hooks/post/riju
|
|
|
@ -5,7 +5,7 @@ After=docker.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=exec
|
Type=exec
|
||||||
ExecStart=riju
|
ExecStart=riju-supervisor
|
||||||
Restart=always
|
Restart=always
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
: ${ADMIN_PASSWORD}
|
|
||||||
: ${ADMIN_SSH_PUBLIC_KEY_FILE}
|
|
||||||
: ${DEPLOY_SSH_PUBLIC_KEY_FILE}
|
|
|
@ -262,6 +262,7 @@ func (sv *supervisor) reload() error {
|
||||||
"-v", "/var/run/docker.sock:/var/run/docker.sock",
|
"-v", "/var/run/docker.sock:/var/run/docker.sock",
|
||||||
"-p", fmt.Sprintf("%s:6119", port),
|
"-p", fmt.Sprintf("%s:6119", port),
|
||||||
"-e", "RIJU_DEPLOY_CONFIG",
|
"-e", "RIJU_DEPLOY_CONFIG",
|
||||||
|
"-e", "ANALYTICS=1",
|
||||||
"--name", name,
|
"--name", name,
|
||||||
fmt.Sprintf("riju:%s", deployCfg.AppImageTag),
|
fmt.Sprintf("riju:%s", deployCfg.AppImageTag),
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
cd packer
|
||||||
|
packer build config.json
|
Loading…
Reference in New Issue