Compare commits
No commits in common. "98a1087e84d678a11b2908739895de781aa9db1d" and "e62889437ff899408c95d37f1cfbb86362f305ad" have entirely different histories.
98a1087e84
...
e62889437f
@ -1,3 +0,0 @@
|
|||||||
---
|
|
||||||
exclude_paths:
|
|
||||||
- 'galaxy.roles/'
|
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -2,6 +2,6 @@
|
|||||||
/.vagrant
|
/.vagrant
|
||||||
/.vscode
|
/.vscode
|
||||||
|
|
||||||
/galaxy.roles/
|
/ansible/galaxy.roles/
|
||||||
/ansible-vault-password-file
|
ansible-vault-password-file
|
||||||
*.retry
|
*.retry
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ cp ansible-vault-password-file.dist ansible-vault-password-file
|
$ cp ansible-vault-password-file.dist ansible-vault-password-file
|
||||||
$ ansible-galaxy install --role-file requirements.yml
|
$ ansible-galaxy install --role-file ansible/requirements.yml
|
||||||
```
|
```
|
||||||
|
|
||||||
## Структура
|
## Структура
|
||||||
@ -24,7 +24,7 @@ $ ansible-galaxy install --role-file requirements.yml
|
|||||||
- Для доступа используется ssh-ключ.
|
- Для доступа используется ssh-ключ.
|
||||||
- Докер используется для запуска и изоляции приложений. Для загрузки образов настраивается Yandex Docker Registry.
|
- Докер используется для запуска и изоляции приложений. Для загрузки образов настраивается Yandex Docker Registry.
|
||||||
- Выход во внешнюю сеть через proxy server [Caddy](https://caddyserver.com/).
|
- Выход во внешнюю сеть через proxy server [Caddy](https://caddyserver.com/).
|
||||||
- Чувствительные данные в `vars/vars.yaml` зашифрованы с помощью Ansible Vault.
|
- Чувствительные данные в `ansible/vars/vars.yaml` зашифрованы с помощью Ansible Vault.
|
||||||
- Для мониторинга за сервером устанавливается [netdata](https://github.com/netdata/netdata).
|
- Для мониторинга за сервером устанавливается [netdata](https://github.com/netdata/netdata).
|
||||||
|
|
||||||
## Частые команды
|
## Частые команды
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
[defaults]
|
[defaults]
|
||||||
host_key_checking = True
|
host_key_checking = True
|
||||||
vault_password_file = ./ansible-vault-password-file
|
vault_password_file = ./ansible-vault-password-file
|
||||||
roles_path = ./galaxy.roles
|
roles_path = ./ansible/galaxy.roles
|
||||||
|
@ -1,12 +1,58 @@
|
|||||||
---
|
---
|
||||||
- hosts: all
|
- hosts: all
|
||||||
|
vars:
|
||||||
|
base_port: 41080
|
||||||
|
notes_port: "{{ base_port + 1 }}"
|
||||||
|
dayoff_port: "{{ base_port + 2 }}"
|
||||||
|
homepage_port: "{{ base_port + 3 }}"
|
||||||
|
netdata_port: "{{ base_port + 4 }}"
|
||||||
|
wiki_port: "{{ base_port + 5 }}"
|
||||||
|
nomie_port: "{{ base_port + 6 }}"
|
||||||
|
nomie_db_port: "{{ base_port + 7 }}"
|
||||||
|
gitea_port: "{{ base_port + 8 }}"
|
||||||
|
keycloak_port: "{{ base_port + 9 }}"
|
||||||
|
outline_port: "{{ base_port + 10 }}"
|
||||||
vars_files:
|
vars_files:
|
||||||
- vars/ports.yml
|
|
||||||
- vars/vars.yml
|
- vars/vars.yml
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
|
|
||||||
|
- name: 'Install additional packages.'
|
||||||
|
apt:
|
||||||
|
name: '{{ packages }}'
|
||||||
|
update_cache: yes
|
||||||
|
vars:
|
||||||
|
packages:
|
||||||
|
- git
|
||||||
|
- python3-pip
|
||||||
|
- acl
|
||||||
|
|
||||||
|
- import_role:
|
||||||
|
name: yatesr.timezone
|
||||||
|
vars:
|
||||||
|
timezone: UTC
|
||||||
|
|
||||||
|
- import_role:
|
||||||
|
name: geerlingguy.security
|
||||||
|
vars:
|
||||||
|
security_ssh_permit_root_login: "yes"
|
||||||
|
security_autoupdate_enabled: "no"
|
||||||
|
security_fail2ban_enabled: "yes"
|
||||||
|
|
||||||
|
- name: 'Install python docker lib.'
|
||||||
|
pip:
|
||||||
|
name: docker
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
|
||||||
|
- import_role:
|
||||||
|
name: geerlingguy.docker
|
||||||
|
vars:
|
||||||
|
docker_users:
|
||||||
|
- major
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
|
||||||
- name: 'Ensure networkd service is started (required by Caddy).'
|
- name: 'Ensure networkd service is started (required by Caddy).'
|
||||||
systemd:
|
systemd:
|
||||||
name: systemd-networkd
|
name: systemd-networkd
|
||||||
@ -27,6 +73,14 @@
|
|||||||
tags:
|
tags:
|
||||||
- webserver
|
- webserver
|
||||||
|
|
||||||
|
- import_role:
|
||||||
|
name: netdata
|
||||||
|
vars:
|
||||||
|
netdata_version: 'v2.0.0'
|
||||||
|
netdata_exposed_port: '{{ netdata_port }}'
|
||||||
|
tags:
|
||||||
|
- monitoring
|
||||||
|
|
||||||
# Applications
|
# Applications
|
||||||
|
|
||||||
- import_role:
|
- import_role:
|
@ -1,12 +1,12 @@
|
|||||||
---
|
---
|
||||||
- src: yatesr.timezone
|
- src: yatesr.timezone
|
||||||
version: 1.2.2
|
version: 1.2.0
|
||||||
|
|
||||||
- src: geerlingguy.security
|
- src: geerlingguy.security
|
||||||
version: 2.4.0
|
version: 2.2.0
|
||||||
|
|
||||||
- src: geerlingguy.docker
|
- src: geerlingguy.docker
|
||||||
version: 7.4.3
|
version: 6.1.0
|
||||||
|
|
||||||
- src: caddy_ansible.caddy_ansible
|
- src: caddy_ansible.caddy_ansible
|
||||||
version: v3.2.0
|
version: v3.2.0
|
22
ansible/roles/netdata/tasks/main.yml
Normal file
22
ansible/roles/netdata/tasks/main.yml
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
- name: 'Grab docker group id.'
|
||||||
|
shell: grep docker /etc/group | cut -d ':' -f 3
|
||||||
|
register: docker_group
|
||||||
|
|
||||||
|
- name: 'Create NetData container from {{ netdata_image }}'
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: netdata
|
||||||
|
image: '{{ netdata_image }}'
|
||||||
|
restart_policy: 'always'
|
||||||
|
published_ports:
|
||||||
|
- '127.0.0.1:{{ netdata_exposed_port }}:19999'
|
||||||
|
volumes:
|
||||||
|
- '/proc:/host/proc:ro'
|
||||||
|
- '/sys:/host/sys:ro'
|
||||||
|
- '/var/run/docker.sock:/var/run/docker.sock:ro'
|
||||||
|
capabilities:
|
||||||
|
- 'SYS_PTRACE'
|
||||||
|
security_opts:
|
||||||
|
- 'apparmor:unconfined'
|
||||||
|
env:
|
||||||
|
PGID: '{{ docker_group.stdout | default(999) }}'
|
@ -1,12 +1,14 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
|
|
||||||
server:
|
server:
|
||||||
image: gitea/gitea:1.22.6
|
image: gitea/gitea:1.22.4
|
||||||
restart: unless-stopped
|
|
||||||
environment:
|
environment:
|
||||||
- "USER_UID=${USER_UID}"
|
- "USER_UID=${USER_UID}"
|
||||||
- "USER_GID=${USER_GID}"
|
- "USER_GID=${USER_GID}"
|
||||||
- "GITEA__server__SSH_PORT=2222"
|
- "GITEA__server__SSH_PORT=2222"
|
||||||
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- ./data:/data
|
- ./data:/data
|
||||||
- /etc/timezone:/etc/timezone:ro
|
- /etc/timezone:/etc/timezone:ro
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
# Images: https://quay.io/repository/keycloak/keycloak?tab=tags&tag=latest
|
# Images: https://quay.io/repository/keycloak/keycloak?tab=tags&tag=latest
|
||||||
# Configuration: https://www.keycloak.org/server/all-config
|
# Configuration: https://www.keycloak.org/server/all-config
|
||||||
|
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
# Images: https://quay.io/repository/keycloak/keycloak?tab=tags&tag=latest
|
# Images: https://quay.io/repository/keycloak/keycloak?tab=tags&tag=latest
|
||||||
# Configuration: https://www.keycloak.org/server/all-config
|
# Configuration: https://www.keycloak.org/server/all-config
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
|
version: "3.2"
|
||||||
services:
|
services:
|
||||||
|
|
||||||
outline-app:
|
outline-app:
|
||||||
image: outlinewiki/outline:0.81.1
|
image: outlinewiki/outline:0.81.1
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
ports:
|
||||||
- "${WEB_SERVER_PORT}:3000"
|
- "${WEB_SERVER_PORT}:3000"
|
||||||
depends_on:
|
depends_on:
|
||||||
@ -37,7 +37,6 @@ services:
|
|||||||
|
|
||||||
redis:
|
redis:
|
||||||
image: redis:7.2-bookworm
|
image: redis:7.2-bookworm
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
ports:
|
||||||
- "6379:6379"
|
- "6379:6379"
|
||||||
volumes:
|
volumes:
|
||||||
@ -46,7 +45,6 @@ services:
|
|||||||
|
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:16.3-bookworm
|
image: postgres:16.3-bookworm
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
ports:
|
||||||
- "5432:5432"
|
- "5432:5432"
|
||||||
volumes:
|
volumes:
|
||||||
|
33
app/wiki/docker-compose.yml
Normal file
33
app/wiki/docker-compose.yml
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
|
||||||
|
db:
|
||||||
|
image: postgres:15.2-alpine
|
||||||
|
environment:
|
||||||
|
POSTGRES_DB: wiki
|
||||||
|
POSTGRES_PASSWORD: wikijsrocks
|
||||||
|
POSTGRES_USER: wikijs
|
||||||
|
logging:
|
||||||
|
driver: "none"
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- db-data:/var/lib/postgresql/data
|
||||||
|
|
||||||
|
wiki:
|
||||||
|
image: ghcr.io/requarks/wiki:2.5.300
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
environment:
|
||||||
|
DB_TYPE: postgres
|
||||||
|
DB_HOST: db
|
||||||
|
DB_PORT: 5432
|
||||||
|
DB_USER: wikijs
|
||||||
|
DB_PASS: wikijsrocks
|
||||||
|
DB_NAME: wiki
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "${WEB_SERVER_PORT}:3000"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
db-data:
|
@ -1,25 +0,0 @@
|
|||||||
---
|
|
||||||
- name: 'Configure docker parameters'
|
|
||||||
hosts: all
|
|
||||||
|
|
||||||
vars_files:
|
|
||||||
- vars/ports.yml
|
|
||||||
- vars/vars.yml
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
|
|
||||||
- name: 'Install python docker lib from pip'
|
|
||||||
ansible.builtin.pip:
|
|
||||||
name: docker
|
|
||||||
|
|
||||||
- name: 'Install docker'
|
|
||||||
ansible.builtin.import_role:
|
|
||||||
name: geerlingguy.docker
|
|
||||||
vars:
|
|
||||||
docker_edition: 'ce'
|
|
||||||
docker_packages:
|
|
||||||
- "docker-{{ docker_edition }}"
|
|
||||||
- "docker-{{ docker_edition }}-cli"
|
|
||||||
- "docker-{{ docker_edition }}-rootless-extras"
|
|
||||||
docker_users:
|
|
||||||
- major
|
|
@ -1,17 +0,0 @@
|
|||||||
---
|
|
||||||
- name: 'Install Netdata monitoring service'
|
|
||||||
hosts: all
|
|
||||||
|
|
||||||
vars_files:
|
|
||||||
- vars/ports.yml
|
|
||||||
- vars/vars.yml
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- name: 'Install Netdata from role'
|
|
||||||
ansible.builtin.import_role:
|
|
||||||
name: netdata
|
|
||||||
vars:
|
|
||||||
netdata_version: 'v2.1.0'
|
|
||||||
netdata_exposed_port: '{{ netdata_port }}'
|
|
||||||
tags:
|
|
||||||
- monitoring
|
|
@ -1,36 +0,0 @@
|
|||||||
---
|
|
||||||
- name: 'Configure base system parameters'
|
|
||||||
hosts: all
|
|
||||||
|
|
||||||
vars_files:
|
|
||||||
- vars/ports.yml
|
|
||||||
- vars/vars.yml
|
|
||||||
|
|
||||||
vars:
|
|
||||||
apt_packages:
|
|
||||||
- acl
|
|
||||||
- git
|
|
||||||
- python3-pip
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
|
|
||||||
- name: 'Install additional apt packages'
|
|
||||||
ansible.builtin.apt:
|
|
||||||
name: '{{ apt_packages }}'
|
|
||||||
update_cache: true
|
|
||||||
|
|
||||||
- name: 'Configure timezone'
|
|
||||||
ansible.builtin.import_role:
|
|
||||||
name: yatesr.timezone
|
|
||||||
vars:
|
|
||||||
timezone: UTC
|
|
||||||
tags:
|
|
||||||
- skip_ansible_lint
|
|
||||||
|
|
||||||
- name: 'Configure security settings'
|
|
||||||
ansible.builtin.import_role:
|
|
||||||
name: geerlingguy.security
|
|
||||||
vars:
|
|
||||||
security_ssh_permit_root_login: "yes"
|
|
||||||
security_autoupdate_enabled: "no"
|
|
||||||
security_fail2ban_enabled: "yes"
|
|
@ -1,27 +0,0 @@
|
|||||||
---
|
|
||||||
- name: 'Update and upgrade system packages'
|
|
||||||
hosts: all
|
|
||||||
|
|
||||||
vars_files:
|
|
||||||
- vars/ports.yml
|
|
||||||
- vars/vars.yml
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- name: Perform an upgrade of packages
|
|
||||||
ansible.builtin.apt:
|
|
||||||
upgrade: 'yes'
|
|
||||||
update_cache: yes
|
|
||||||
|
|
||||||
- name: Check if a reboot is required
|
|
||||||
ansible.builtin.stat:
|
|
||||||
path: /var/run/reboot-required
|
|
||||||
get_checksum: no
|
|
||||||
register: reboot_required_file
|
|
||||||
|
|
||||||
- name: Reboot the server (if required)
|
|
||||||
ansible.builtin.reboot:
|
|
||||||
when: reboot_required_file.stat.exists == true
|
|
||||||
|
|
||||||
- name: Remove dependencies that are no longer required
|
|
||||||
ansible.builtin.apt:
|
|
||||||
autoremove: yes
|
|
@ -1,36 +0,0 @@
|
|||||||
---
|
|
||||||
- name: 'Grab docker group id.'
|
|
||||||
ansible.builtin.shell:
|
|
||||||
cmd: |
|
|
||||||
set -o pipefail
|
|
||||||
grep docker /etc/group | cut -d ':' -f 3
|
|
||||||
executable: /bin/bash
|
|
||||||
register: netdata_docker_group_output
|
|
||||||
changed_when: netdata_docker_group_output.rc != 0
|
|
||||||
|
|
||||||
- name: 'Create NetData container from {{ netdata_image }}'
|
|
||||||
community.docker.docker_container:
|
|
||||||
name: netdata
|
|
||||||
image: '{{ netdata_image }}'
|
|
||||||
image_name_mismatch: 'recreate'
|
|
||||||
restart_policy: 'always'
|
|
||||||
published_ports:
|
|
||||||
- '127.0.0.1:{{ netdata_exposed_port }}:19999'
|
|
||||||
volumes:
|
|
||||||
- '/:/host/root:ro,rslave'
|
|
||||||
- '/etc/group:/host/etc/group:ro'
|
|
||||||
- '/etc/localtime:/etc/localtime:ro'
|
|
||||||
- '/etc/os-release:/host/etc/os-release:ro'
|
|
||||||
- '/etc/passwd:/host/etc/passwd:ro'
|
|
||||||
- '/proc:/host/proc:ro'
|
|
||||||
- '/run/dbus:/run/dbus:ro'
|
|
||||||
- '/sys:/host/sys:ro'
|
|
||||||
- '/var/log:/host/var/log:ro'
|
|
||||||
- '/var/run/docker.sock:/var/run/docker.sock:ro'
|
|
||||||
capabilities:
|
|
||||||
- 'SYS_PTRACE'
|
|
||||||
- 'SYS_ADMIN'
|
|
||||||
security_opts:
|
|
||||||
- 'apparmor:unconfined'
|
|
||||||
env:
|
|
||||||
PGID: '{{ netdata_docker_group_output.stdout | default(999) }}'
|
|
9
tasks.py
9
tasks.py
@ -3,7 +3,7 @@ import shlex
|
|||||||
import fabric
|
import fabric
|
||||||
from invoke import task
|
from invoke import task
|
||||||
|
|
||||||
SERVER_HOST_FILE = "hosts_prod"
|
SERVER_HOST_FILE = "ansible/hosts_prod"
|
||||||
DOKER_REGISTRY = "cr.yandex/crplfk0168i4o8kd7ade"
|
DOKER_REGISTRY = "cr.yandex/crplfk0168i4o8kd7ade"
|
||||||
|
|
||||||
|
|
||||||
@ -12,6 +12,11 @@ def deploy_gitea(context):
|
|||||||
deploy("gitea", dirs=["data"])
|
deploy("gitea", dirs=["data"])
|
||||||
|
|
||||||
|
|
||||||
|
@task(name="deploy:wiki")
|
||||||
|
def deploy_wiki(context):
|
||||||
|
deploy("wiki")
|
||||||
|
|
||||||
|
|
||||||
@task(name="deploy:keycloak")
|
@task(name="deploy:keycloak")
|
||||||
def deploy_keykloak(context):
|
def deploy_keykloak(context):
|
||||||
deploy("keycloak", compose_file="docker-compose.prod.yml", dirs=["data"])
|
deploy("keycloak", compose_file="docker-compose.prod.yml", dirs=["data"])
|
||||||
@ -51,7 +56,7 @@ def deploy(app_name: str, compose_file="docker-compose.yml", dirs=None):
|
|||||||
c.run(f"mkdir -p {d}")
|
c.run(f"mkdir -p {d}")
|
||||||
print("Up services")
|
print("Up services")
|
||||||
c.run(
|
c.run(
|
||||||
f"docker compose --project-name {shlex.quote(app_name)} --env-file=.env.prod up --detach --remove-orphans"
|
f"docker-compose --project-name {shlex.quote(app_name)} --env-file=.env.prod up --detach --remove-orphans"
|
||||||
)
|
)
|
||||||
c.run(
|
c.run(
|
||||||
f"docker system prune --all --volumes --force"
|
f"docker system prune --all --volumes --force"
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
---
|
|
||||||
base_port: 41080
|
|
||||||
notes_port: "{{ base_port + 1 }}"
|
|
||||||
dayoff_port: "{{ base_port + 2 }}"
|
|
||||||
homepage_port: "{{ base_port + 3 }}"
|
|
||||||
netdata_port: "{{ base_port + 4 }}"
|
|
||||||
wiki_port: "{{ base_port + 5 }}"
|
|
||||||
nomie_port: "{{ base_port + 6 }}"
|
|
||||||
nomie_db_port: "{{ base_port + 7 }}"
|
|
||||||
gitea_port: "{{ base_port + 8 }}"
|
|
||||||
keycloak_port: "{{ base_port + 9 }}"
|
|
||||||
outline_port: "{{ base_port + 10 }}"
|
|
Loading…
Reference in New Issue
Block a user