Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 30 additions & 11 deletions .env.model
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,49 @@
# Variaveis de Ambiente - Web Storage
# ==========================================

DB_CONNECTION=pgsql
DB_PORT=5432

# --- Ambiente Local de Desenvolvimento ---
DB_DATABASE=web_storage
DB_USERNAME=admin
DB_PASSWORD=secret
DEV_DB_HOST=db
DEV_DB_DATABASE=web_storage
DEV_DB_USERNAME=admin
DEV_DB_PASSWORD=secret

DEV_POSTGRES_DB=web_storage
DEV_POSTGRES_USER=admin
DEV_POSTGRES_PASSWORD=secret

# --- Ambiente de Producao ---
PROD_DB_NAME=web_storage_prod
PROD_DB_USER=admin_prod
PROD_DB_PASS=secret_prod
PROD_DB_HOST=10.0.0.110
PROD_DB_DATABASE=web_storage_prod
PROD_DB_USERNAME=admin_prod
PROD_DB_PASSWORD=secret_prod

PROD_POSTGRES_DB=web_storage_prod
PROD_POSTGRES_USER=admin_prod
PROD_POSTGRES_PASSWORD=secret_prod

# --- Ambiente de Testes ---
TEST_DB_NAME=web_storage_test
TEST_DB_USER=test_user
TEST_DB_PASS=test_pass
TEST_DB_HOST=db_test
TEST_DB_DATABASE=web_storage_test
TEST_DB_USERNAME=test_user
TEST_DB_PASSWORD=test_pass

TEST_POSTGRES_DB=web_storage_test
TEST_POSTGRES_USER=test_user
TEST_POSTGRES_PASSWORD=test_pass

# --- Configuracoes de Armazenamento ---
STORAGE_TYPE=local # local ou oci
#STORAGE_TYPE=oci
STORAGE_TYPE=local
STORAGE_ROOT=/var/www/html/storage

# --- Oracle Cloud Object Storage ---
OCI_USER_OCID=
OCI_TENANCY_OCID=
OCI_FINGERPRINT=
OCI_KEY_FILE=/var/www/html/oci_private_key.pem
OCI_KEY_FILE=/var/www/html/.oci/key.pem
OCI_REGION=
OCI_NAMESPACE=
OCI_BUCKET=
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
docker/nginx/logs/*
.phpunit.result.cache

.oci

# Ensure storage folder exists but ignore uploaded files
/storage/*
!/storage/.gitkeep
Expand Down
49 changes: 41 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,51 @@ Este projeto foi desenhado sob o conceito de "Glassmorphism" e possui design dar

O Web Storage foi construído utilizando as melhores e mais robustas opções do ecossistema Web Open-Source:

- **Back-end**: PHP 8.3 (FPM) rodando dentro de containers estruturados.
- **Back-end**: PHP 8.4 (FPM) rodando dentro de containers estruturados.
- **Servidor Web**: Nginx configurado com uploads expandidos (até 100MB por arquivo).
- **Banco de Dados**: PostgreSQL, mantendo forte integridade relacional.
- **Armazenamento de Objetos**: Oracle Cloud Infrastructure (OCI) Object Storage ou Armazenamento Local.
- **Front-end**: HTML5 semântico, CSS3 Moderno (CSS Grid/Flexbox) e Javascript (Vanilla ES6+).
- **Testes Unitários**: PHPUnit.
- **Testes Unitários**: PHPUnit 11.
- **CI/CD**: Jenkins & GitHub Actions.
- **Virtualização**: Docker + Docker Compose (para ambientes Dev / Prod).

### 🤖 Powered by Antigravity AI
Todo o desenvolvimento arquitetural inicial do projeto, refatoração de UI css/js para componentes apartados (modulares), separação dos limites do servidor de imagem do Docker e tratamentos de responsividade deste Web Storage foram orquestrados através do raciocínio avançado do agente assistente inteligente **Antigravity da Google Deepmind**, através da colaboração e pair-programming via instrução de comando reverso na CLI/Workspace.

---

## 🏗️ Arquitetura e Abstração de Armazenamento

O sistema utiliza uma **Arquitetura Híbrida de Persistência** com uma camada de abstração que permite alternar entre armazenamento local e na nuvem através da variável de ambiente `STORAGE_TYPE`:

1. **Metadados (PostgreSQL)**: Todas as informações relacionais, como usuários, logs de auditoria e referências de arquivos, são armazenadas no banco de dados local.
2. **Arquivos Físicos (Abstraction Layer)**:
- **OCI Object Storage (`oci`)**: Integração nativa com o **Oracle Cloud (OCI)** para buckets escaláveis e duráveis.
- **Armazenamento Local (`local`)**: Persistência no sistema de arquivos do servidor/container (ideal para desenvolvimento ou infraestrutura on-premise).

---

## ⚙️ CI/CD & Automação

O fluxo de desenvolvimento e entrega é totalmente automatizado:

- **GitHub Actions**: Executa a malha de testes unitários (`./run-tests.sh`) automaticamente em cada Pull Request para a branch `master` e em cada push para a branch `dev`, garantindo que nenhum código quebre as funcionalidades existentes.
- **Jenkins**: Atua como o orquestrador de Continuous Deployment (CD). Ele monitora mudanças, reconstrói as imagens de produção (`docker-compose.prod.yml`) e realiza o deploy seguro injetando as variáveis de ambiente necessárias via Jenkins Credentials.

---

## 🛠️ Passo a Passo Prático (Como Usar)

### Configuração Inicial (Variáveis de Ambiente)
Antes de tudo, garanta que o Docker e o `docker-compose` estejam instalados na sua máquina. Para proteger informações sensíveis, todas as credenciais do banco e configurações de ambiente foram extraídas dos arquivos do Docker e mapeadas externamente.

Na raiz do projeto você encontrará um arquivo chamado `.env.model`. Copie-o (ou apenas renomeie-o) criando um novo arquivo estritamente chamado `.env`.
Dentro deste `.env`, você poderá personalizar livremente as senhas e nomes de banco de dados para os ambientes de Desenvolvimento (`docker-compose.yml`), Produção e Testes! Os containers do Docker lerão as variáveis automaticamente daqui.

#### Configurações de Armazenamento:
- **`STORAGE_TYPE`**: Define o driver de armazenamento. Use `local` para disco local (padrão) ou `oci` para Oracle Cloud.
- **`STORAGE_ROOT`**: (Apenas para `local`) O caminho no container onde os arquivos serão salvos (ex: `/var/www/html/storage`).
- **Credenciais OCI**: Caso use `oci`, configure `OCI_USER_OCID`, `OCI_TENANCY_OCID`, `OCI_REGION`, `OCI_FINGERPRINT`, `OCI_KEY_FILE`, `OCI_NAMESPACE` e `OCI_BUCKET`.

### 1️⃣ Executando em Ambiente de Teste/Desenvolvimento
Para inciar a aplicação via Docker Compose na porta 80 do seu localhost, execute:
Expand Down Expand Up @@ -60,11 +86,18 @@ No diretório raiz do projeto, disponibilizamos dois scripts auxiliares BASH par
./set_permissions.sh
```

### 4️⃣ Deploy para Produção Limitada
Você notará que existe um construtor otimizado exclusivo chamado `Dockerfile.prod`, além de configurações focadas no opcache. Para forçar um deploy fechado em ambiente de produção (mais veloz), monte usando:
```bash
docker compose -f docker-compose.prod.yml up --build -d
```
---

## 📂 Estrutura do Projeto

- `src/Config/`: Configurações de Banco de Dados e OCI.
- `src/Storage/`: Abstração e drivers de armazenamento (`LocalStorage`, `OCIStorage`).
- `src/Auth.php`: Gerenciamento de sessões e autenticação.
- `src/UserManager.php`: CRUD de usuários e permissões.
- `src/FileManager.php`: Lógica de gerenciamento de objetos na nuvem.
- `tests/`: Suíte de testes unitários.
- `.github/workflows/`: Automação de CI com GitHub Actions.
- `Jenkinsfile`: Pipeline de build e deploy contínuo.

---

Expand Down
12 changes: 7 additions & 5 deletions docker-compose.prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ services:
dockerfile: docker/php/Dockerfile.prod
container_name: web_storage_app_prod
restart: unless-stopped
env_file:
- .env
environment:
- DB_CONNECTION=pgsql
- DB_CONNECTION=${DB_CONNECTION:-pgsql}
- DB_HOST=${PROD_DB_HOST:-10.0.0.110}
- DB_PORT=5432
- DB_DATABASE=${WEB_STORAGE_PROD_DB_NAME:-web_storage_prod}
- DB_USERNAME=${WEB_STORAGE_PROD_DB_USER:-admin}
- DB_PASSWORD=${WEB_STORAGE_PROD_DB_PASS:-secret_prod}
- DB_PORT=${DB_PORT:-5432}
- DB_DATABASE=${PROD_DB_DATABASE:-web_storage_prod}
- DB_USERNAME=${PROD_DB_USERNAME:-admin_prod}
- DB_PASSWORD=${PROD_DB_PASSWORD:-secret_prod}
volumes:
- prod_storage:/var/www/html/storage
networks:
Expand Down
22 changes: 13 additions & 9 deletions docker-compose.test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ services:
dockerfile: docker/php/Dockerfile.test
container_name: web_storage_app_test
working_dir: /var/www/html
env_file:
- .env
environment:
- DB_CONNECTION=pgsql
- DB_HOST=db_test
- DB_PORT=5432
- DB_DATABASE=${TEST_DB_NAME:-web_storage_test}
- DB_USERNAME=${TEST_DB_USER:-test_user}
- DB_PASSWORD=${TEST_DB_PASS:-test_pass}
- DB_CONNECTION=${DB_CONNECTION:-pgsql}
- DB_HOST=${TEST_DB_HOST:-db_test}
- DB_PORT=${DB_PORT:-5432}
- DB_DATABASE=${TEST_DB_DATABASE:-web_storage_test}
- DB_USERNAME=${TEST_DB_USERNAME:-test_user}
- DB_PASSWORD=${TEST_DB_PASSWORD:-test_pass}
depends_on:
db_test:
condition: service_healthy
Expand All @@ -22,10 +24,12 @@ services:
image: postgres:15-alpine
container_name: web_storage_db_test
command: postgres -p 5432
env_file:
- .env
environment:
POSTGRES_DB: ${TEST_DB_NAME:-web_storage_test}
POSTGRES_USER: ${TEST_DB_USER:-test_user}
POSTGRES_PASSWORD: ${TEST_DB_PASS:-test_pass}
POSTGRES_DB: ${TEST_POSTGRES_DB:-web_storage_test}
POSTGRES_USER: ${TEST_POSTGRES_USER:-test_user}
POSTGRES_PASSWORD: ${TEST_POSTGRES_PASSWORD:-test_pass}
networks:
- test_net
healthcheck:
Expand Down
64 changes: 30 additions & 34 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,33 +1,47 @@
version: '3.8'

services:
app:
build:
context: .
dockerfile: docker/php/Dockerfile.dev
container_name: web_storage_app
restart: unless-stopped
context: ./
dockerfile: docker/php/Dockerfile
working_dir: /var/www/html
volumes:
- ./:/var/www/html
env_file:
- .env
environment:
- DB_CONNECTION=pgsql
- DB_HOST=db
- DB_PORT=5432
- DB_DATABASE=${DB_DATABASE:-web_storage}
- DB_USERNAME=${DB_USERNAME:-admin}
- DB_PASSWORD=${DB_PASSWORD:-secret}
command: /bin/bash -c "mkdir -p /var/www/html/storage && chmod -R 777 /var/www/html/storage && php-fpm"
- DB_CONNECTION=${DB_CONNECTION:-pgsql}
- DB_HOST=${DEV_DB_HOST:-db}
- DB_PORT=${DB_PORT:-5432}
- DB_DATABASE=${DEV_DB_DATABASE:-web_storage}
- DB_USERNAME=${DEV_DB_USERNAME:-admin}
- DB_PASSWORD=${DEV_DB_PASSWORD:-secret}
command: /bin/bash -c "chown -R www-data:www-data .oci && chmod 600 .oci/server1.pem && php src/init_db.php && mkdir -p /var/www/html/storage && chmod -R 777 /var/www/html/storage && php-fpm"
depends_on:
- db
db:
condition: service_healthy
networks:
- dev_net

db:
image: postgres:15-alpine
environment:
- POSTGRES_DB=${DEV_DB_DATABASE:-web_storage}
- POSTGRES_USER=${DEV_DB_USERNAME:-admin}
- POSTGRES_PASSWORD=${DEV_DB_PASSWORD:-secret}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DEV_DB_USERNAME:-admin} -d ${DEV_DB_DATABASE:-web_storage}"]
interval: 5s
timeout: 5s
retries: 5
networks:
- dev_net

web:
nginx:
image: nginx:alpine
container_name: web_storage_nginx
restart: unless-stopped
ports:
- "8080:80"
- "80:80"
volumes:
- ./:/var/www/html
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
Expand All @@ -36,24 +50,6 @@ services:
networks:
- dev_net

db:
image: postgres:15-alpine
container_name: web_storage_db
restart: unless-stopped
environment:
POSTGRES_DB: ${DB_DATABASE:-web_storage}
POSTGRES_USER: ${DB_USERNAME:-admin}
POSTGRES_PASSWORD: ${DB_PASSWORD:-secret}
volumes:
- default_postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
networks:
- dev_net

volumes:
default_postgres_data:

networks:
dev_net:
driver: bridge
5 changes: 3 additions & 2 deletions docker/php/Dockerfile.dev
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,10 @@ RUN pecl install xdebug \
RUN echo "xdebug.mode=coverage,debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

# Configure PHP Upload Limits
# Configure PHP Upload Limits and Error Reporting
RUN echo "upload_max_filesize = 100M" > /usr/local/etc/php/conf.d/uploads.ini \
&& echo "post_max_size = 100M" >> /usr/local/etc/php/conf.d/uploads.ini
&& echo "post_max_size = 100M" >> /usr/local/etc/php/conf.d/uploads.ini \
&& echo "error_reporting = E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED" > /usr/local/etc/php/conf.d/error_reporting.ini

# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
Expand Down
5 changes: 3 additions & 2 deletions docker/php/Dockerfile.prod
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,10 @@ RUN echo "opcache.enable=1" >> /usr/local/etc/php/conf.d/opcache-recommended.ini
&& echo "opcache.revalidate_freq=2" >> /usr/local/etc/php/conf.d/opcache-recommended.ini \
&& echo "opcache.fast_shutdown=1" >> /usr/local/etc/php/conf.d/opcache-recommended.ini

# Configure PHP Upload Limits
# Configure PHP Upload Limits and Error Reporting
RUN echo "upload_max_filesize = 100M" > /usr/local/etc/php/conf.d/uploads.ini \
&& echo "post_max_size = 100M" >> /usr/local/etc/php/conf.d/uploads.ini
&& echo "post_max_size = 100M" >> /usr/local/etc/php/conf.d/uploads.ini \
&& echo "error_reporting = E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED" > /usr/local/etc/php/conf.d/error_reporting.ini

# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
Expand Down
5 changes: 3 additions & 2 deletions docker/php/Dockerfile.test
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,10 @@ RUN pecl install xdebug \
RUN echo "xdebug.mode=coverage,debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

# Configure PHP Upload Limits
# Configure PHP Upload Limits and Error Reporting
RUN echo "upload_max_filesize = 100M" > /usr/local/etc/php/conf.d/uploads.ini \
&& echo "post_max_size = 100M" >> /usr/local/etc/php/conf.d/uploads.ini
&& echo "post_max_size = 100M" >> /usr/local/etc/php/conf.d/uploads.ini \
&& echo "error_reporting = E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED" > /usr/local/etc/php/conf.d/error_reporting.ini

# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
Expand Down
Loading
Loading